traverso-0.49.4/000755 001750 001750 00000000000 12417555501 013764 5ustar00remonremon000000 000000 traverso-0.49.4/TODO000755 001750 001750 00000006116 11163362147 014462 0ustar00remonremon000000 000000 TOBEDONE FOR 0.4x.x ### NEEDS TESTING ### - Fold Sheet/Track with Markers - Select clips - Copy/move (including un/redo) selected clips ### BUGS / WISHES ### * Fade: cursor jumps back to old pos after releasing [F] * Curve top-left node is hardly visible * CD Burning doesn't work when traverso was started from clicking on the binary (sometimes, when no empty disk was inserted) * Ubuntu Intrepid package does not depend on libfftw3 ? * http://traverso-daw.org/forum/index.php/topic,93.0.html (selecting second burn device not possible) * current zoom-cursors get messed up at times (specially after using context menu of Zoom) * PPC build : no jack, crashes on PPC 10.5.1 (both portaudio with jack/coreaudio), which portaudio was used? * http://forums.frugalware.org/index.php?t=msg&goto=7949&rid=0&S=fc3e4bbb15813272bc2658068081e9d7#msg_7949 * accessability: LAC discussion: e.g. from 25.12.07, thread "Studio reverb (impulse)" * Track (Vynil) plugin also applied to other tracks ?? * jack in/output ports numbers are calculated in reversed order! so inputcount ports is output count and vise versa * Unable to lock memory, Traverso runs unstable due that. Detect (parse limits.conf file) first before trying to memlock ? * xvidcap -> for creating video demos * new Song::get_last_location() semantics might not work well e.g. in MoveClip, TimeLineView. * Why does the User Manual say I need libflac++? * 2tracks project, seeking to start when beyond first clip: mp3 output garbled! * solution for project dir renamed outside of traverso: disabling write bit ? * http://traverso-daw.org/forum/index.php/topic,77.msg264.html#msg264 * check if permissions in /etc/security/limits.conf are set, and if not, notify the user! * Loading Project with 0 sheets crashes when spectrum/correlation meters are shown * http://traverso-daw.org/forum/index.php/topic,60.msg161.html#msg161 (random crashes on mac os x, unable to reproduce locally) * Bandpass filter wrong inited (or something like that) it crashes * DecodeBuffer::delete_destination: sometimes m_channels != 'real destination channel count' Less important: * DragClip: to next/previous snap pos is broken problem doesn't happen with copy-clip !! Update: SnapList checks for wrong next/prev values now, but this needs also to be fixed in MoveClip // ViewPort: m_holdCursorActive is a replacement for m_holdcursor->isVisible() // in mouseMoveEvents, which crashes when a hold action in one viewport // ends with the mouse upon a different viewport. // Should get a proper fix ? // Maybe it has to do with the hold finish (release) event is propagated to the wrong viewport ? * add docs for preparing pc for realtime use! (limits.conf stuff) * Curve copy should not use the same id!!!!!! * libsndfile: * Sector misalignment, how to handle. * files with a very large DC offset are painted wrong in rectified view ? (see yo-vega.ogg as example) * < Z > and < Z X > centers on the viewport and layouts the tracks, causing 2 paint events! * Painting last curve nodes has artifacts, 'fixed' by populating polygon with as many points as there are pixels. This should get a real fix!! traverso-0.49.4/INSTALL000755 001750 001750 00000001332 11163362147 015016 0ustar00remonremon000000 000000 1) cmake based compilation: * Unpack the tarball, and change directory to traverso-xx-xx-xx * Make sure you have all dependencies installed, and cmake * run cmake as follows (including the dot!): $ cmake . * If it complains a library was missing, make sure it is installed, remove CMakeCache.txt and go back to the previous step. * If cmake . completed without error, you can either run: $ ccmake . to change compilation options or: $ make to start compilation. * After compilation finished, you can run traverso with: $ bin/traverso * Or install it systemwide (as root) $ make install * and run traverso directly by typing: $ traverso Have fun! NOTE FOR PACKAGERS: See the PACKAGERS file!traverso-0.49.4/HISTORY000644 001750 001750 00000001025 11163362147 015045 0ustar00remonremon000000 000000 Traverso is a fork of the Protux project, and continued on the code base as of 10-2005. Protux is licenced under the GPL (https://savannah.nongnu.org/projects/protux/) The Protux author decided to port the project from Qt/C++ to Java, using the Java SDK. Contributors who contributed code to Protux can be found in the AUTHORS file. No copyright notices were included in the Protux source files, so I decided to make this HISTORY file, and point you to the AUTHORS file to credit the developers who worked on Protux. Remon Sijriertraverso-0.49.4/CMakeLists.txt000644 001750 001750 00000047074 12417555501 016540 0ustar00remonremon000000 000000 #CMAKE SETUP #Require 2.4.2 for Qt finding #Require 2.4.3 for moc change detection #Require 2.4.6 for FindPkgConfig.cmake CMAKE_MINIMUM_REQUIRED(VERSION 2.4.6 FATAL_ERROR) SET(CMAKE_COLOR_MAKEFILE ON) SET(CMAKE_VERBOSE_MAKEFILE ON) SET(CMAKE_INCLUDE_CURRENT_DIR TRUE) SET(CMAKE_SKIP_RULE_DEPENDENCY TRUE) SET(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/modules") IF(COMMAND CMAKE_POLICY) CMAKE_POLICY(SET CMP0005 NEW) CMAKE_POLICY(SET CMP0003 NEW) ENDIF(COMMAND CMAKE_POLICY) #PROJECT SETUP PROJECT(traverso) SET (VERSION_MAJOR "0") SET (VERSION_MINOR "49") SET (VERSION_PATCH "4") SET (VERSION_SUFFIX "") SET (VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}${VERSION_SUFFIX}) MESSAGE(STATUS "Traverso ${VERSION} will be built to install into ${CMAKE_INSTALL_PREFIX}") OPTION(WANT_JACK "Include Jack (Jack Audio Connection Kit) support" ON) OPTION(WANT_ALSA "Include ALSA (Advanced Linux Sound Architecture) support" ON) OPTION(WANT_PORTAUDIO "Include PortAudio support (Driver support for Mac OS X and Windows" OFF) OPTION(WANT_PULSEAUDIO "Include PulseAudio support (Driver support for Linux and Windows" OFF) OPTION(WANT_COREAUDIO "Include CoreAudio support (Driver support for Mac OS X" OFF) OPTION(WANT_LV2 "Include LV2 Plugin support" ON) OPTION(WANT_MP3_DECODE "Include mp3 decoding support, for playing mp3 files" ON) OPTION(WANT_MP3_ENCODE "Include mp3 encoding support, for creating mp3 files" OFF) OPTION(WANT_PCH "Use precompiled headers" OFF) OPTION(WANT_DEBUG "Debug build" OFF) # OPTION(WANT_OPENGL "Build Traverso with OpenGL support" OFF) OPTION(WANT_TRAVERSO_DEBUG "Provides 4 levels of debug ouput on the command line, always on for DEBUG builds" OFF) OPTION(WANT_THREAD_CHECK "Checks at runtime if functions are called from the correct thread, used by developers for debugging" OFF) OPTION(WANT_VECLIB_OPTIMIZATIONS "Build with veclib optimizations (Only for PPC based Mac OS X)" OFF) OPTION(AUTOPACKAGE_BUILD "Build traverso with autopackage tools" OFF) OPTION(DETECT_HOST_CPU_FEATURES "Detect the feature set of the host cpu, and compile with an optimal set of compiler flags" ON) SET(MAIN_DIR_NAME "src") IF(TAG_VERSION) MESSAGE(STATUS "Previously selected version tag: ${TAG_VERSION}") SET(WANT_VERSIONING 1) SET(CACHED_VERSIONING 1) ENDIF(TAG_VERSION) IF (WANT_VERSIONING AND NOT CACHED_VERSIONING) IF (NOT CUSTOM_VERSIONTAG) SET(TAG_VERSION "-${VERSION}" CACHE TYPE STRING) ELSE (NOT CUSTOM_VERSIONTAG) SET(TAG_VERSION ${CUSTOM_VERSIONTAG} CACHE TYPE STRING) ENDIF (NOT CUSTOM_VERSIONTAG) ENDIF (WANT_VERSIONING AND NOT CACHED_VERSIONING) IF(WIN32) SET(WANT_LV2 OFF) ENDIF(WIN32) # Static build is perfectly fine now, targets are properly relinked when needed! SET(TRAVERSO_DEFINES -DSTATIC_BUILD) #BUILD SETUP #None, Debug, Release, .. or custom ones IF(WANT_DEBUG) SET(CMAKE_BUILD_TYPE DEBUG) SET(WANT_TRAVERSO_DEBUG ON) ELSE(WANT_DEBUG) SET(CMAKE_BUILD_TYPE RELEASE) LIST(APPEND TRAVERSO_DEFINES -DQT_NO_DEBUG) ENDIF(WANT_DEBUG) IF(WANT_TRAVERSO_DEBUG) LIST(APPEND TRAVERSO_DEFINES -DUSE_DEBUGGER) ENDIF(WANT_TRAVERSO_DEBUG) # Moves the Traverso exec. to the root dir and libs to the root's lib dir. SET(EXECUTABLE_OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR}/bin) SET(LIBRARY_OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR}/lib) # Add Mac build paths for DarwinPorts / MacPorts # These need to be defined up here, above the include checks IF(APPLE) INCLUDE_DIRECTORIES("/opt/local/include") SET (CMAKE_REQUIRED_INCLUDES "/opt/local/include") LINK_DIRECTORIES("/opt/local/lib") ENDIF(APPLE) SET(MINIMAL_ALSA_VERSION 1.0.0) SET(MINIMAL_JACK_VERSION 0.100) SET(MINIMAL_PORTAUDIO_VERSION 19) SET(MINIMAL_WAVPACK_VERSION 4.40.0) SET(MINIMAL_OGG_VORBIS_VERSION 1.1.2) SET(MINIMAL_MAD_VERSION 0.15.0) SET(MINIMAL_FLAC_VERSION 1.1.2) SET(MINIMAL_FFTW_VERSION 3.0.0) SET(MINIMAL_PULSAUDIO_VERSION 0.9) SET(HAVE_COREAUDIO FALSE) SET(CMAKE_CXX_FLAGS_DEBUG "-O0 -g3 -Wall ${CXX_FLAGS}") SET(CMAKE_CXX_FLAGS_RELEASE "-O2 -Wall -fPIC ${CXX_FLAGS}") # Detect the flags to be used for large file support execute_process( COMMAND getconf LFS_CFLAGS OUTPUT_VARIABLE getconf_invoke_result RESULT_VARIABLE getconf_failed ) # remove linebrakes, white spaces (getconf_invoke_result) string(REGEX REPLACE "[\r\n]" " " getconf_invoke_result "${getconf_invoke_result}") # now we have the proper flags for large file support, so set these! SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} ${getconf_invoke_result}") SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} ${getconf_invoke_result}") INCLUDE (${CMAKE_ROOT}/Modules/TestBigEndian.cmake) TEST_BIG_ENDIAN(WORDS_BIGENDIAN) # Check for PKG-CONFIG FIND_PACKAGE(PkgConfig REQUIRED) IF(PKG_CONFIG_FOUND) MESSAGE(STATUS "Program pkg-config found (${PKG_CONFIG_EXECUTABLE})") ELSE(PKG_CONFIG_FOUND) MESSAGE(FATAL_ERROR "Program pkg-config not found") ENDIF(PKG_CONFIG_FOUND) #FIND DEPENDENCIES SET (QT_MIN_VERSION "4.3.1") FIND_PACKAGE(Qt4 REQUIRED) include(${QT_USE_FILE}) INCLUDE (ConfigureChecks.cmake) # IF(WANT_OPENGL) # IF(QT_QTOPENGL_FOUND) # LIST(APPEND TRAVERSO_DEFINES -DQT_OPENGL_SUPPORT) # SET(HAVE_OPENGL TRUE) # ENDIF(QT_QTOPENGL_FOUND) # ELSE(WANT_OPENGL) # SET(HAVE_OPENGL FALSE) # ENDIF(WANT_OPENGL) IF(WANT_PORTAUDIO) CHECK_INCLUDE_FILE("portaudio.h" HAVE_PORTAUDIO_H) IF(NOT HAVE_PORTAUDIO_H) MESSAGE(FATAL_ERROR "PortAudio support requested, but PortAudio development headers could not be found!\nPlease install the PortAudio development package, remove CMakeCache.txt and run cmake again") ENDIF(NOT HAVE_PORTAUDIO_H) PKG_CHECK_MODULES(PORTAUDIO portaudio-2.0>=${MINIMAL_PORTAUDIO_VERSION}) IF(PORTAUDIO_FOUND) LIST(APPEND TRAVERSO_DEFINES -DPORTAUDIO_SUPPORT) MESSAGE("-- PortAudio Library Found OK") SET(HAVE_PORTAUDIO TRUE) ENDIF(PORTAUDIO_FOUND) ELSE(WANT_PORTAUDIO) SET(HAVE_PORTAUDIO FALSE) ENDIF(WANT_PORTAUDIO) IF(WANT_PULSEAUDIO) CHECK_INCLUDE_FILE("pulse/pulseaudio.h" HAVE_PULSEAUDIO_H) IF(NOT HAVE_PULSEAUDIO_H) MESSAGE(SEND_ERROR "PulseAudio support requested, but PulseAudio development headers could not be found!\nPlease install the PortAudio development package, remove CMakeCache.txt and run cmake again") ELSE(NOT HAVE_PULSEAUDIO_H) LIST(APPEND TRAVERSO_DEFINES -DPULSEAUDIO_SUPPORT) MESSAGE("-- PULSEAUDIO Library Found OK") SET(HAVE_PULSEAUDIO TRUE) ENDIF(NOT HAVE_PULSEAUDIO_H) ELSE(WANT_PULSEAUDIO) SET(HAVE_PULSEAUDIO FALSE) ENDIF(WANT_PULSEAUDIO) IF(WANT_LV2) IF(PKG_CONFIG_FOUND) PKG_CHECK_MODULES(LIBLILV lilv-0>=0.4.4) IF (LIBLILV_FOUND) MESSAGE("-- LILV Library Found OK") INCLUDE_DIRECTORIES(${LIBLILV_INCLUDE_DIRS}) SET (LV2_SUPPORT TRUE) SET(HAVE_LILV TRUE) ELSE (LIBLILV_FOUND) MESSAGE("LILV support disabled") SET (LV2_SUPPORT FALSE) SET(HAVE_LILV FALSE) ENDIF (LIBLILV_FOUND) ENDIF(PKG_CONFIG_FOUND) LIST(APPEND TRAVERSO_DEFINES -DLV2_SUPPORT) SET(SLV2OPTIONS "${HAVE_LILV}") ELSE(WANT_LV2) SET(HAVE_LILV FALSE) SET (LV2_SUPPORT FALSE) ENDIF(WANT_LV2) CHECK_INCLUDE_FILE("wavpack/wavpack.h" HAVE_WAVPACK_H) IF(NOT HAVE_WAVPACK_H) MESSAGE(FATAL_ERROR "WavPack development headers could not be found!\nPlease install the WavPack development package, remove CMakeCache.txt and run cmake again") ENDIF(NOT HAVE_WAVPACK_H) PKG_CHECK_MODULES(WAVPACK wavpack>=${MINIMAL_WAVPACK_VERSION}) IF (WAVPACK_FOUND) MESSAGE("-- WavPack Library Found OK") ELSE(WAVPACK_FOUND) MESSAGE(SEND_ERROR "No WavPack found (WavPack >= ${MINIMAL_WAVPACK_VERSION} needs to be installed!)") ENDIF(WAVPACK_FOUND) CHECK_INCLUDE_FILE("vorbis/vorbisfile.h" HAVE_VORBISFILE_H) IF(NOT HAVE_VORBISFILE_H) MESSAGE(FATAL_ERROR "Ogg Vorbis development headers could not be found!\nPlease install the Ogg Vorbis development package, remove CMakeCache.txt and run cmake again") ENDIF(NOT HAVE_VORBISFILE_H) PKG_CHECK_MODULES(VORBIS vorbis>=${MINIMAL_OGG_VORBIS_VERSION}) IF (VORBIS_FOUND) MESSAGE("-- Ogg Vorbis Library Found OK") ELSE(VORBIS_FOUND) MESSAGE(SEND_ERROR "No Ogg Vorbis found (Ogg Vorbis >= ${MINIMAL_OGG_VORBIS_VERSION} needs to be installed!)") ENDIF(VORBIS_FOUND) CHECK_INCLUDE_FILE("FLAC/export.h" HAVE_FLAC_H) IF(HAVE_FLAC_H) MESSAGE("-- FLAC Library Found OK") ELSE(HAVE_FLAC_H) PKG_CHECK_MODULES(FLAC flac>=${MINIMAL_FLAC_VERSION}) IF (FLAC_FOUND) MESSAGE("-- FLAC Library Found OK") ELSE(FLAC_FOUND) MESSAGE(FATAL_ERROR "No FLAC found (FLAC >= ${MINIMAL_FLAC_VERSION} needs to be installed!)") ENDIF(FLAC_FOUND) ENDIF(HAVE_FLAC_H) IF(WANT_MP3_DECODE) CHECK_INCLUDE_FILE("mad.h" HAVE_MAD_H) IF(HAVE_MAD_H) SET(HAVE_MP3_DECODING TRUE) LIST(APPEND TRAVERSO_DEFINES -DMP3_DECODE_SUPPORT) ELSE(HAVE_MAD_H) PKG_CHECK_MODULES(MAD mad>=${MINIMAL_MAD_VERSION}) IF(MAD_FOUND) SET(HAVE_MP3_DECODING TRUE) LIST(APPEND TRAVERSO_DEFINES -DMP3_DECODE_SUPPORT) MESSAGE("-- MP3 Decoding Library Found OK") ELSE(MAD_FOUND) MESSAGE(FATAL_ERROR "MP3 decoding support requested, but mp3 development headers (mad.h) could not be found!\nPlease install the mp3 development package (Usually called libmad0-dev), remove CMakeCache.txt and run cmake again") ENDIF(MAD_FOUND) ENDIF(HAVE_MAD_H) ELSE(WANT_MP3_DECODE) SET(HAVE_MP3_DECODING FALSE) ENDIF(WANT_MP3_DECODE) IF(WANT_MP3_ENCODE) CHECK_INCLUDE_FILE("lame/lame.h" HAVE_LAME_H) IF(HAVE_LAME_H) LIST(APPEND TRAVERSO_DEFINES -DMP3_ENCODE_SUPPORT) MESSAGE("-- Building with mp3 encoding support enabled") SET(HAVE_MP3_ENCODING TRUE) ELSE(HAVE_LAME_H) MESSAGE(FATAL_ERROR "MP3 encoding support requested, but mp3 development headers (lame.h) could not be found!\nPlease install the lame development package (Usually called liblame-dev), remove CMakeCache.txt and run cmake again") ENDIF(HAVE_LAME_H) ELSE(WANT_MP3_ENCODE) SET(HAVE_MP3_ENCODING FALSE) ENDIF(WANT_MP3_ENCODE) CHECK_INCLUDE_FILE("fftw3.h" HAVE_FFTW3_H) IF(NOT HAVE_FFTW3_H) MESSAGE(FATAL_ERROR "FFTW3 development headers could not be found!\nPlease install the FFTW3 development package (fftw3-dev), remove CMakeCache.txt and run cmake again") ENDIF(NOT HAVE_FFTW3_H) PKG_CHECK_MODULES(FFTW3 fftw3>=${MINIMAL_FFTW_VERSION}) IF (FFTW3_FOUND) MESSAGE("-- FFTW3 Library Found OK") ELSE(FFTW3_FOUND) MESSAGE(SEND_ERROR "No FFTW3 found (FFTW3 >= ${MINIMAL_FFTW_VERSION} needs to be installed!)") ENDIF(FFTW3_FOUND) CHECK_INCLUDE_FILE("sys/vfs.h" HAVE_SYS_VFS_H) IF(HAVE_SYS_VFS_H) LIST(APPEND TRAVERSO_DEFINES -DHAVE_SYS_VFS_H) ENDIF(HAVE_SYS_VFS_H) CHECK_INCLUDE_FILE("sys/stat.h" HAVE_SYS_STAT_H) IF(HAVE_SYS_STAT_H) LIST(APPEND TRAVERSO_DEFINES -DHAVE_SYS_STAT_H) ENDIF(HAVE_SYS_STAT_H) #Create configure files.. config.h CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/src/config.h) #uninstall CONFIGURE_FILE( "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" IMMEDIATE @ONLY) ADD_CUSTOM_TARGET(uninstall "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake") #Set up include dirs with all found packages INCLUDE_DIRECTORIES( ${CMAKE_SOURCE_DIR}/src/common ${QT_INCLUDE_DIR} ${QT_QTCORE_INCLUDE_DIR} ) #Set up libraries to link with all found packages LINK_LIBRARIES ( ${QT_QT_LIBRARY} ) CHECK_FUNCTION_EXISTS(posix_memalign HAVE_POSIX_MEMALIGN) IF(NOT HAVE_POSIX_MEMALIGN) LIST(APPEND TRAVERSO_DEFINES -DNO_POSIX_MEMALIGN) MESSAGE("Did not find posix_memalign(), using malloc") ENDIF(NOT HAVE_POSIX_MEMALIGN) CHECK_FUNCTION_EXISTS(mlock HAVE_MLOCK) IF(HAVE_MLOCK) LIST(APPEND TRAVERSO_DEFINES -DUSE_MLOCK) ENDIF(HAVE_MLOCK) IF(UNIX) #BEGIN Mac OS X section IF(APPLE) # Detect if we want native Mac OS X support (CoreAudio) # and if we can build with it. IF(WANT_COREAUDIO) SET(HAVE_COREAUDIO TRUE) LIST(APPEND TRAVERSO_DEFINES -DCOREAUDIO_SUPPORT) ELSE(WANT_COREAUDIO) SET(HAVE_COREAUDIO FALSE) ENDIF(WANT_COREAUDIO) # @ MAC OS X builders, I've NO IDEA what this should be, please have a look at it # It should be possible to create a working bundle with CPack using stuff # defined here ....??? SET( ENV{MACOSX_DEPLOYMENT_TARGET} 10.3 ) SET( ENV{LD_PREBIND} 1 ) SET( ENV{LD_PREBIND_ALLOW_OVERLAP} 1 ) # Bundle setup SET(BUILD_MAC_BUNDLE 1) set(MACOSX_BUNDLE_ICON_FILE ${PROJECT_SOURCE_DIR}/resources/images/traverso_mac.icns) IF(WANT_VECLIB_OPTIMIZATIONS) LIST(APPEND TRAVERSO_DEFINES -DBUILD_VECLIB_OPTIMIZATIONS) LINK_LIBRARIES( "-framework Accelerate" ) ENDIF(WANT_VECLIB_OPTIMIZATIONS) # This was copy pasted from another project, please remove if it's not needed!! LINK_LIBRARIES( "-undefined dynamic_lookup" ) LINK_LIBRARIES( "-framework CoreFoundation" ) ENDIF(APPLE) # END Mac OS X section #BEGIN LINUX section IF(WANT_ALSA) CHECK_INCLUDE_FILE("alsa/asoundlib.h" HAVE_ASOUNDLIB_H) IF(NOT HAVE_ASOUNDLIB_H) MESSAGE(FATAL_ERROR "alsa support requested, but alsa development headers could not be found!\nPlease install the alsa development package (Usually called libasound-dev), remove CMakeCache.txt and run cmake again") ENDIF(NOT HAVE_ASOUNDLIB_H) PKG_CHECK_MODULES(ALSA alsa>=${MINIMAL_ALSA_VERSION}) IF (ALSA_FOUND) MESSAGE("-- ALSA Library Found OK") LIST(APPEND TRAVERSO_DEFINES -DALSA_SUPPORT) SET(HAVE_ALSA TRUE) ENDIF(ALSA_FOUND) ELSE(WANT_ALSA) MESSAGE("-- ALSA support: Disabled") SET(HAVE_ALSA FALSE) ENDIF(WANT_ALSA) # END LINUX section IF(WANT_JACK) CHECK_INCLUDE_FILE("jack/jack.h" HAVE_JACK_H) IF(NOT HAVE_JACK_H) MESSAGE(FATAL_ERROR "jack support requested, but jack development headers could not be found!\nPlease install the jack development package, remove CMakeCache.txt and run cmake again") ENDIF(NOT HAVE_JACK_H) PKG_CHECK_MODULES(JACK jack>=${MINIMAL_JACK_VERSION}) IF(JACK_FOUND) LIST (APPEND TRAVERSO_DEFINES -DJACK_SUPPORT) MESSAGE("-- Jack Library Found OK") SET(HAVE_JACK TRUE) SET(JACK_LIBS ${JACK_LIBRARIES}) LIST(APPEND JACK_LIB_DIR ${JACK_LIBDIR} ${JACK_LIBRARY_DIRS}) LIST(APPEND JACK_INC_DIR ${JACK_INCLUDEDIR} ${JACK_INCLUDE_DIRS}) ELSE(JACK_FOUND) MESSAGE(FATAL_ERROR "jack support requested, but jack libraries could not be found!\nPlease install the jack runtime libraries, remove CMakeCache.txt and run cmake again") ENDIF(JACK_FOUND) ELSE(WANT_JACK) MESSAGE("-- Jack support: Disabled") SET(HAVE_JACK FALSE) ENDIF(WANT_JACK) IF(NOT WANT_DEBUG AND DETECT_HOST_CPU_FEATURES) # Detect the architecture we are compiling on execute_process( COMMAND uname -m OUTPUT_VARIABLE uname_invoke_result RESULT_VARIABLE uname_failed ) # Get the cpu flags to add the most optimal optimization flags to the compiler execute_process( COMMAND cat /proc/cpuinfo COMMAND grep ^flags OUTPUT_VARIABLE cat_invoke_result RESULT_VARIABLE cat_failed ) SET(HOST_SUPPORTS_SSE FALSE) IF(cat_invoke_result MATCHES sse) SET(HOST_SUPPORTS_SSE TRUE) LIST(APPEND TRAVERSO_DEFINES -DSSE_OPTIMIZATIONS) ENDIF(cat_invoke_result MATCHES sse) IF(cat_invoke_result MATCHES 3dnow) SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -m3dnow") ENDIF(cat_invoke_result MATCHES 3dnow) IF(uname_invoke_result MATCHES i586) SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -march=i586") ENDIF(uname_invoke_result MATCHES i586) IF(uname_invoke_result MATCHES i686) SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -march=i686") IF(HOST_SUPPORTS_SSE) SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -msse -mfpmath=sse") LIST(APPEND TRAVERSO_DEFINES -DUSE_XMMINTRIN) ENDIF(HOST_SUPPORTS_SSE) ENDIF(uname_invoke_result MATCHES i686) IF(uname_invoke_result MATCHES x86_64) IF(HOST_SUPPORTS_SSE) SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -msse -mfpmath=sse") LIST(APPEND TRAVERSO_DEFINES -DUSE_XMMINTRIN -DUSE_X86_64_ASM) SET(IS_ARCH_X86_64 TRUE) ENDIF(HOST_SUPPORTS_SSE) ENDIF(uname_invoke_result MATCHES x86_64) IF(uname_invoke_result MATCHES i[456]86) LIST(APPEND TRAVERSO_DEFINES -DARCH_X86) SET(IS_ARCH_X86 TRUE) ENDIF(uname_invoke_result MATCHES i[456]86) ENDIF(NOT WANT_DEBUG AND DETECT_HOST_CPU_FEATURES) ELSE(UNIX) # Windows section IF(WIN32) LINK_LIBRARIES( ${QT_QTMAIN_LIBRARY} ) LIST (APPEND TRAVERSO_DEFINES -DQT_DLL -DWIN_BUILD -DPORTAUDIO_SUPPORT) SET(CMAKE_CXX_FLAGS_RELEASE "-O2 -Wall -fno-strict-aliasing ${CXX_FLAGS}") CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H) SET(HAVE_PORTAUDIO TRUE) ENDIF(WIN32) ENDIF(UNIX) IF(WANT_THREAD_CHECK) LIST(APPEND TRAVERSO_DEFINES -DTHREAD_CHECK) ENDIF(WANT_THREAD_CHECK) # Check GCC for PCH support SET(USE_PCH FALSE) IF(WANT_PCH) FIND_PACKAGE(PCHSupport) IF(PCHSupport_FOUND) SET(USE_PCH TRUE) SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -include ${CMAKE_SOURCE_DIR}/src/precompile.h -Winvalid-pch") SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -include ${CMAKE_SOURCE_DIR}/src/precompile.h -Winvalid-pch") MESSAGE(STATUS "Enabling precompiled headers for GCC ${gcc_compiler_version}") ENDIF(PCHSupport_FOUND) ELSE(WANT_PCH) #QT_DEFENITIONS are added by pch, so when no pch support add them now! ADD_DEFINITIONS(${QT_DEFINITIONS}) ENDIF(WANT_PCH) ADD_DEFINITIONS(${TRAVERSO_DEFINES}) SET(TRAVERSO_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/buildfiles) #Add our source subdirs ADD_SUBDIRECTORY(src) # TODO #Install our READMEs etc. # INSTALL(FILES # AUTHORS # README # # DESTINATION ${CMAKE_SOURCE_DIR}/src/ # ) # If the cmake version includes cpack, use it IF(EXISTS "${CMAKE_ROOT}/Modules/CPack.cmake") SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Traverso is an open source Digital Audio Workstation for Linux, Mac OSX and Windows") SET(CPACK_PACKAGE_VENDOR "Traverso Team") SET(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/README") SET(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/README") SET(CPACK_PACKAGE_VERSION_MAJOR "${VERSION_MAJOR}") SET(CPACK_PACKAGE_VERSION_MINOR "${VERSION_MINOR}") SET(CPACK_PACKAGE_VERSION_PATCH "${VERSION_PATCH}") SET(CPACK_PACKAGE_INSTALL_DIRECTORY "Traverso ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}") SET(CPACK_PACKAGE_EXECUTABLES "traverso${TAG_VERSION}") SET(CPACK_SOURCE_PACKAGE_FILE_NAME "traverso-${VERSION}") SET(CPACK_SOURCE_GENERATOR TGZ) ## I'll make this prettier later - ignore any tarballs in the root SET(CPACK_SOURCE_IGNORE_FILES CMakeCache.txt "~$" "Makefile$" "\\\\.cvsignore$" "^${PROJECT_SOURCE_DIR}.*/*tar.*" "^${PROJECT_SOURCE_DIR}.*/precompile.h.gch" "^${PROJECT_SOURCE_DIR}.*/cmake_install.cmake" "^${PROJECT_SOURCE_DIR}/CPackConfig.cmake" "^${PROJECT_SOURCE_DIR}/CPackSourceConfig.cmake" "^${PROJECT_SOURCE_DIR}/make-autopackage.sh" "^${PROJECT_SOURCE_DIR}/_CPack_Packages/" "^${PROJECT_SOURCE_DIR}.*/CMakeFiles/" "^${PROJECT_SOURCE_DIR}.*/CVS/" "^${PROJECT_SOURCE_DIR}.*/bin/" "^${PROJECT_SOURCE_DIR}.*/build/" "^${PROJECT_SOURCE_DIR}.*/buildfiles/" "^${PROJECT_SOURCE_DIR}.*/lib/" "^${PROJECT_SOURCE_DIR}/debian/" "^${PROJECT_SOURCE_DIR}/autopackage/" "^${PROJECT_SOURCE_DIR}.*/CVSROOT/" "^${PROJECT_SOURCE_DIR}/doc/") INCLUDE(CPack) ENDIF(EXISTS "${CMAKE_ROOT}/Modules/CPack.cmake") # Mark the following optoins as advanced MARK_AS_ADVANCED( QT_X11_X11_LIBRARY QT_X11_m_LIBRARY QT_X11_Xext_LIBRARY LIBRARY_OUTPUT_PATH WANT_THREAD_CHECK AUTOPACKAGE_BUILD CMAKE_BACKWARDS_COMPATIBILITY ) MESSAGE(" Build options: Building in mode : ${CMAKE_BUILD_TYPE} ALSA support : ${HAVE_ALSA} Jack support : ${HAVE_JACK} PortAudio support : ${HAVE_PORTAUDIO} CoreAudio support : ${HAVE_COREAUDIO} SLV2 support : ${SLV2OPTIONS} MP3 read support : ${HAVE_MP3_DECODING} MP3 writing support : ${HAVE_MP3_ENCODING} ") traverso-0.49.4/AUTHORS000644 001750 001750 00000002544 11163362147 015040 0ustar00remonremon000000 000000 Traverso Developers ================= Remon Sijrier ( remon at traverso-daw dot org ) - Netherlands - Program Author, Developer Nicola Doebelin - Switzerland - Developer Ben Levitt ( levittben at yahoo dot com ) - USA - Developer Taj Morton - USA - autopackage maintainer Translators: Ingmar Vanhassel - nl Joel 'gibbon_' Garske - de Rüdiger Dick - de Nicola Doebelin - de Clever Pereira - pt Pavel Fric - cs (čeština) Testers: Rüdiger Dick - Germany Past Developers/Contributors (These are developers before the fork from Protux project) ============================ Luciano Giordana ( giordana at linuxmail dot org ) - Brazil - Project Coordinator / Main Developer Reinhard Amersberg ( protux at web dot de ) - Germany - Project Coordinator Martin Herren ( sputnik at on-the-web dot ch ) - Developer David Bain ( pigeonflight at yahoo dot co dot uk ) - Jamaica - Web Designer Eduardo Pimenta (epimenta at yahoo dot com ) - Developer Fabio dos Santos ( rsff at softhome dot net ) - Brazil - Bug Tracker Gustavo Lemos / Alex Beraldo - Brazil - Logo Creator (from 0.20.0) Marcio Enrico ( enrico at horizon dot com dot br ) - Brazil - Logo Creator (from 0.13.0 to 0.19.9) Nathan Langford ( njl at sdf dot lonestar dot org ) - USA - Web Designer Tapio Laxstr� ( tapio at iptime dot fi ) - Finland - Developer Valery Beluntsov ( leh at mail dot ru ) - Russia - Bug Tracker traverso-0.49.4/src/000755 001750 001750 00000000000 12417556520 014555 5ustar00remonremon000000 000000 traverso-0.49.4/src/CMakeLists.txt000644 001750 001750 00000000426 12360571721 017314 0ustar00remonremon000000 000000 ADD_SUBDIRECTORY(engine) ADD_SUBDIRECTORY(audiofileio) ADD_SUBDIRECTORY(commands) ADD_SUBDIRECTORY(core) ADD_SUBDIRECTORY(plugins) ADD_SUBDIRECTORY(sheetcanvas) ADD_SUBDIRECTORY(traverso) IF(USE_PCH) ADD_PRECOMPILED_HEADER(precompiled_headers precompile.h) ENDIF(USE_PCH) traverso-0.49.4/src/common/000755 001750 001750 00000000000 12357214027 016041 5ustar00remonremon000000 000000 traverso-0.49.4/src/common/APILinkedList.h000644 001750 001750 00000011015 11163362147 020605 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef API_LINKED_LIST_H #define API_LINKED_LIST_H #include #define apill_foreach(variable, upcasttype, apillist) \ for(APILinkedListNode* apillnode = apillist.first(); apillnode!=0; apillnode = apillnode->next) \ if (variable = (upcasttype*)apillnode) \ class APILinkedListNode { public: APILinkedListNode () : next(0) {} virtual ~APILinkedListNode () {} APILinkedListNode* next; virtual bool is_smaller_then(APILinkedListNode* node) = 0; }; class APILinkedList { public: APILinkedList() : m_size(0), m_head(0), m_last(0) {} ~APILinkedList() {} void append(APILinkedListNode* item); void add_and_sort(APILinkedListNode* node); void prepend(APILinkedListNode * item); int remove(APILinkedListNode* item); APILinkedListNode* first() const {return m_head;} APILinkedListNode* last() const {return m_last;} int size() const {return m_size;} void clear() {m_head = 0; m_last = 0; m_size=0;} void sort(APILinkedListNode* node); bool isEmpty() {return m_size == 0 ? true : false;} int indexOf(APILinkedListNode* node); APILinkedListNode* at(int i); private: int m_size; APILinkedListNode* m_head; APILinkedListNode* m_last; APILinkedListNode* slow_last() const; void insert(APILinkedListNode* after, APILinkedListNode* item); }; // T = O(1) inline void APILinkedList::prepend(APILinkedListNode * item) { item->next = m_head; m_head = item; if (!m_size) { m_last = item; m_last->next = 0; } m_size++; Q_ASSERT(m_last == slow_last()); } // T = O(1) inline void APILinkedList::append(APILinkedListNode * item) { if(m_head) { m_last->next = item; m_last = item; } else { m_head = item; m_last = item; } m_last->next = 0; m_size++; Q_ASSERT(m_last == slow_last()); } // T = O(n) inline int APILinkedList::remove(APILinkedListNode * item) { Q_ASSERT(item); if (!m_size) { return 0; } if(m_head == item) { m_head = m_head->next; m_size--; if (m_size == 0) { m_last = m_head = 0; } Q_ASSERT(m_last == slow_last()); return 1; } APILinkedListNode *q,*r; r = m_head; q = m_head->next; while( q!=0 ) { if( q == item ) { r->next = q->next; m_size--; if (!q->next) { m_last = r; m_last->next = 0; } Q_ASSERT(m_last == slow_last()); return 1; } r = q; q = q->next; } return 0; } // T = O(1) inline void APILinkedList::insert(APILinkedListNode* after, APILinkedListNode* item) { Q_ASSERT(after); Q_ASSERT(item); APILinkedListNode* temp; temp = item; temp->next = after->next; after->next = temp; if (after == m_last) { m_last = item; m_last->next = 0; } m_size++; Q_ASSERT(m_last == slow_last()); } // T = O(n) inline APILinkedListNode * APILinkedList::slow_last() const { if (!m_size) { return 0; } APILinkedListNode* last = m_head; while(last->next) { last = last->next; } return last; } // T = O(n) inline void APILinkedList::add_and_sort(APILinkedListNode * node) { if (!m_size) { append(node); } else { APILinkedListNode* q = m_head; if (node->is_smaller_then(q)) { prepend(node); } else { APILinkedListNode* afternode = q; while (q) { if (!node->is_smaller_then(q)) { afternode = q; } else { break; } q = q->next; } insert(afternode, node); } } } inline int APILinkedList::indexOf(APILinkedListNode* node) { Q_ASSERT(node); int index = 0; APILinkedListNode* q = m_head; while (q) { if (q == node) { return index; } ++index; q = q->next; } return -1; } inline APILinkedListNode * APILinkedList::at(int i) { Q_ASSERT(i >= 0); Q_ASSERT(i < m_size); int loopcounter = 0; APILinkedListNode* q = m_head; while (q) { if (loopcounter == i) { return q; } q = q->next; ++loopcounter; } return 0; } inline void APILinkedList::sort(APILinkedListNode* node) { if (remove(node)) { add_and_sort(node); } } #endif traverso-0.49.4/src/common/RingBufferNPT.h000755 001750 001750 00000014471 11163362147 020640 0ustar00remonremon000000 000000 /* Copyright (C) 2000 Paul Davis & Benno Senoner This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. $Id: RingBufferNPT.h,v 1.1 2007/10/20 17:38:17 r_sijrier Exp $ */ #ifndef ringbuffer_npt_h #define ringbuffer_npt_h #include #if ! defined (Q_WS_WIN) #include #endif #include "defines.h" /* ringbuffer class where the element size is not required to be a power of two */ template class RingBufferNPT { public: RingBufferNPT (size_t sz) { size = sz; buf = new T[size]; #ifdef USE_MLOCK if (mlock (buf, size)) { printf("Unable to lock memory\n"); } #endif /* USE_MLOCK */ reset (); }; virtual ~RingBufferNPT() { #ifdef USE_MLOCK munlock (buf, size); #endif /* USE_MLOCK */ delete [] buf; } void reset () { /* !!! NOT THREAD SAFE !!! */ t_atomic_int_set (&write_ptr, 0); t_atomic_int_set (&read_ptr, 0); } void set (size_t r, size_t w) { /* !!! NOT THREAD SAFE !!! */ t_atomic_int_set (&write_ptr, w); t_atomic_int_set (&read_ptr, r); } size_t read (T *dest, size_t cnt); size_t write (T *src, size_t cnt); struct rw_vector { T *buf[2]; size_t len[2]; }; void get_read_vector (rw_vector *); void get_write_vector (rw_vector *); void decrement_read_ptr (size_t cnt) { t_atomic_int_set (&read_ptr, (t_atomic_int_get(&read_ptr) - cnt) % size); } void increment_read_ptr (size_t cnt) { t_atomic_int_set (&read_ptr, (t_atomic_int_get(&read_ptr) + cnt) % size); } void increment_write_ptr (size_t cnt) { t_atomic_int_set (&write_ptr, (t_atomic_int_get(&write_ptr) + cnt) % size); } size_t write_space () { size_t w, r; w = t_atomic_int_get (&write_ptr); r = t_atomic_int_get (&read_ptr); if (w > r) { return ((r - w + size) % size) - 1; } else if (w < r) { return (r - w) - 1; } else { return size - 1; } } size_t read_space () { size_t w, r; w = t_atomic_int_get (&write_ptr); r = t_atomic_int_get (&read_ptr); if (w > r) { return w - r; } else { return (w - r + size) % size; } } T *buffer () { return buf; } size_t get_write_ptr () const { return t_atomic_int_get (&write_ptr); } size_t get_read_ptr () const { return t_atomic_int_get (&read_ptr); } size_t bufsize () const { return size; } protected: T *buf; size_t size; mutable volatile int write_ptr; mutable volatile int read_ptr; }; template size_t RingBufferNPT::read (T *dest, size_t cnt) { size_t free_cnt; size_t cnt2; size_t to_read; size_t n1, n2; size_t priv_read_ptr; priv_read_ptr=t_atomic_int_get(&read_ptr); if ((free_cnt = read_space ()) == 0) { return 0; } to_read = cnt > free_cnt ? free_cnt : cnt; cnt2 = priv_read_ptr + to_read; if (cnt2 > size) { n1 = size - priv_read_ptr; n2 = cnt2 % size; } else { n1 = to_read; n2 = 0; } memcpy (dest, &buf[priv_read_ptr], n1 * sizeof (T)); priv_read_ptr = (priv_read_ptr + n1) % size; if (n2) { memcpy (dest+n1, buf, n2 * sizeof (T)); priv_read_ptr = n2; } t_atomic_int_set(&read_ptr, priv_read_ptr); return to_read; } template size_t RingBufferNPT::write (T *src, size_t cnt) { size_t free_cnt; size_t cnt2; size_t to_write; size_t n1, n2; size_t priv_write_ptr; priv_write_ptr=t_atomic_int_get(&write_ptr); if ((free_cnt = write_space ()) == 0) { return 0; } to_write = cnt > free_cnt ? free_cnt : cnt; cnt2 = priv_write_ptr + to_write; if (cnt2 > size) { n1 = size - priv_write_ptr; n2 = cnt2 % size; } else { n1 = to_write; n2 = 0; } memcpy (&buf[priv_write_ptr], src, n1 * sizeof (T)); priv_write_ptr = (priv_write_ptr + n1) % size; if (n2) { memcpy (buf, src+n1, n2 * sizeof (T)); priv_write_ptr = n2; } t_atomic_int_set(&write_ptr, priv_write_ptr); return to_write; } template void RingBufferNPT::get_read_vector (RingBufferNPT::rw_vector *vec) { size_t free_cnt; size_t cnt2; size_t w, r; w = t_atomic_int_get (&write_ptr); r = t_atomic_int_get (&read_ptr); if (w > r) { free_cnt = w - r; } else { free_cnt = (w - r + size) % size; } cnt2 = r + free_cnt; if (cnt2 > size) { /* Two part vector: the rest of the buffer after the current write ptr, plus some from the start of the buffer. */ vec->buf[0] = &buf[r]; vec->len[0] = size - r; vec->buf[1] = buf; vec->len[1] = cnt2 % size; } else { /* Single part vector: just the rest of the buffer */ vec->buf[0] = &buf[r]; vec->len[0] = free_cnt; vec->len[1] = 0; } } template void RingBufferNPT::get_write_vector (RingBufferNPT::rw_vector *vec) { size_t free_cnt; size_t cnt2; size_t w, r; w = t_atomic_int_get (&write_ptr); r = t_atomic_int_get (&read_ptr); if (w > r) { free_cnt = ((r - w + size) % size) - 1; } else if (w < r) { free_cnt = (r - w) - 1; } else { free_cnt = size - 1; } cnt2 = w + free_cnt; if (cnt2 > size) { /* Two part vector: the rest of the buffer after the current write ptr, plus some from the start of the buffer. */ vec->buf[0] = &buf[w]; vec->len[0] = size - w; vec->buf[1] = buf; vec->len[1] = cnt2 % size; } else { vec->buf[0] = &buf[w]; vec->len[0] = free_cnt; vec->len[1] = 0; } } #endif /* __ringbuffer_npt_h__ */ traverso-0.49.4/src/common/Debugger.cpp000755 001750 001750 00000025120 11163362147 020275 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2006 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: Debugger.cpp,v 1.3 2009/02/23 20:12:09 r_sijrier Exp $ */ #include #include #include "Debugger.h" namespace TraversoDebugger { int ntabs = 0; int debugLevel = OFF; FILE* logFile = (FILE*) 0; QString logFileName = 0; bool logging = false; } void TraversoDebugger::fill_tabs() { for (int i=0; i < ntabs; i++) printf("| "); } QString TraversoDebugger::get_tabs() { QString t=""; for (int i=0; i < ntabs; i++) t=t.append(" "); return t; } void TraversoDebugger::more_tabs() { ntabs++; } void TraversoDebugger::less_tabs() { ntabs--; } void TraversoDebugger::set_debug_level(int l) { debugLevel = l; } int TraversoDebugger::get_debug_level() { return debugLevel; } void TraversoDebugger::create_log(QString fn) { logFileName = QString(getenv("HOME")) + "/" + fn; logFile = fopen(logFileName.toAscii(),"a+"); if (!logFile) { PERROR("Cannot create TraversoDebugger Log file (%s)",fn.toAscii().data()); logging=false; } else { fclose(logFile); logging=true; } } void TraversoDebugger::close_log() { logging=false; } void TraversoDebugger::log(QString s) { const char* sc = s.toAscii(); int len = s.length(); logFile = fopen(logFileName.toAscii(),"a+"); fwrite(sc,len,1,logFile); fclose(logFile); } bool TraversoDebugger::is_logging() { return logging; } #ifdef USE_DEBUGGER static void print_enter(int lvl, const char* file, const char* function) { using namespace TraversoDebugger; if (get_debug_level()>=lvl) { if (is_logging()) { QString output = get_tabs() + "ENTERING " + QString(file) + "::" + QString(function) + "\n"; log(output); more_tabs(); } else { fill_tabs(); CHANGE_COLOR_GREEN; printf("ENTERING "); CHANGE_COLOR_WHITE; printf("%s::%s\n", file, function); more_tabs(); } } } static void print_exit(int lvl, const char* file, const char* function) { using namespace TraversoDebugger; if (get_debug_level()>=lvl) { if (is_logging()) { less_tabs(); QString output = get_tabs() + "LEAVING " + QString(file) + "::" + QString(function) + "\n"; log(output); } else { less_tabs(); fill_tabs(); CHANGE_COLOR_BLUE; printf("LEAVING "); CHANGE_COLOR_WHITE; printf("%s::%s\n", file, function); } } } FunctionEnter::FunctionEnter(int level, const char* file, const char* function) : m_file(file), m_function(function), lvl(level) { print_enter(lvl, m_file, m_function); } FunctionEnter::~ FunctionEnter( ) { print_exit(lvl, m_file, m_function); } ConstructorEnter::ConstructorEnter(int level, const char* file, const char* function) : m_file(file), m_function(function), lvl(level) { using namespace TraversoDebugger; if (get_debug_level()>=lvl) { if (is_logging()) { QString output = get_tabs() + "ENTERING " + QString(m_function) + " (CONSTRUCTOR)\n"; log(output); more_tabs(); } else { fill_tabs(); CHANGE_COLOR_GREEN; printf("ENTERING "); CHANGE_COLOR_WHITE; printf("%s",m_function); CHANGE_COLOR_CYAN; printf(" (CONSTRUCTOR)"); CHANGE_COLOR_WHITE; printf("\n"); more_tabs(); } } } ConstructorEnter::~ ConstructorEnter( ) { using namespace TraversoDebugger; if (get_debug_level()>=lvl) { if (is_logging()) { less_tabs(); QString output = get_tabs() + "LEAVING " + QString(m_function) + " (CONSTRUCTOR)\n"; log(output); } else { less_tabs(); fill_tabs(); CHANGE_COLOR_BLUE; printf("LEAVING "); CHANGE_COLOR_WHITE; printf("%s", m_function); CHANGE_COLOR_CYAN; printf(" (CONSTRUCTOR)"); CHANGE_COLOR_WHITE; printf("\n"); } } } DestructorEnter::DestructorEnter(int level, const char* file, const char* function) : m_file(file), m_function(function), lvl(level) { using namespace TraversoDebugger; if (get_debug_level()>=lvl) { if (is_logging()) { QString output = get_tabs() + "ENTERING " + QString(m_function) + " (DESTRUCTOR)\n"; log(output); more_tabs(); } else { fill_tabs(); CHANGE_COLOR_GREEN; printf("ENTERING "); CHANGE_COLOR_WHITE; printf("%s", m_function); CHANGE_COLOR_CYAN; printf(" (DESTRUCTOR)"); CHANGE_COLOR_WHITE; printf("\n"); more_tabs(); } } } DestructorEnter::~ DestructorEnter( ) { using namespace TraversoDebugger; if (get_debug_level()>=lvl) { if (is_logging()) { less_tabs(); QString output = get_tabs() + "LEAVING " + QString(m_function) + " (DESTRUCTOR)\n"; log(output); } else { less_tabs(); fill_tabs(); CHANGE_COLOR_BLUE; printf("LEAVING "); CHANGE_COLOR_WHITE; printf("%s", m_function); CHANGE_COLOR_CYAN; printf(" (DESTRUCTOR)"); CHANGE_COLOR_WHITE; printf("\n"); } } } #endif #if defined (USE_MEM_CHECKER) //: C02:MemCheck.cpp {O} // From "Thinking in C++, Volume 2", by Bruce Eckel & Chuck Allison. // (c) 1995-2004 MindView, Inc. All Rights Reserved. // See source code use permissions stated in the file 'License.txt', // distributed with the code package available at www.MindView.net. #include #include #include using namespace std; #undef new // Global flags set by macros in MemCheck.h bool traceFlag = true; bool activeFlag = false; namespace { // Memory map entry type struct Info { void* ptr; const char* file; long line; size_t size; }; // Memory map data const size_t MAXPTRS = 10000u; Info memMap[MAXPTRS]; size_t nptrs = 0; // Searches the map for an address int findPointer(void* p) { for(size_t i = 0; i < nptrs; ++i) if(memMap[i].ptr == p) return i; return -1; } void delPointer(void* p) { long pos = findPointer(p); assert(pos >= 0); // Remove pointer from map for(size_t i = pos; i < nptrs-1; ++i) memMap[i] = memMap[i+1]; --nptrs; } // Dummy type for static destructor struct Sentinel { ~Sentinel() { if(nptrs > 0) { printf("Leaked memory at:\n"); for(size_t i = 0; i < nptrs; ++i) printf("\t%p (file: %s, line %ld)\n", memMap[i].ptr, memMap[i].file, memMap[i].line); } else printf("No memory leaks found in Traverso!\n"); } }; // Static dummy object Sentinel s; } // End anonymous namespace // Overload scalar new void* operator new(size_t siz, const char* file, long line) { void* p = malloc(siz); if(activeFlag) { if(nptrs == MAXPTRS) { printf("memory map too small (increase MAXPTRS)\n"); exit(1); } memMap[nptrs].ptr = p; memMap[nptrs].file = file; memMap[nptrs].line = line; memMap[nptrs].size = siz; ++nptrs; } if(traceFlag) { printf("Allocated %.2f KBytes at address %p (file: %s, line: %ld)\n", (float)siz/1024, p, file, line); } fflush(NULL); return p; } // Overload array new void* operator new[](size_t siz, const char* file, long line) { return operator new(siz, file, line); } // Override scalar delete void operator delete(void* p) { int i; if( (i = findPointer(p)) >= 0) { free(p); assert(nptrs > 0); delPointer(p); if(traceFlag) { if (memMap[i].size > 1024) printf("Deleted %u bytes at address %p, file: %s, line: %ld\n", memMap[i].size, p, memMap[i].file, memMap[i].line); } } else if(!p && activeFlag) printf("Attempt to delete unknown pointer: %p\n", p); fflush(NULL); } // Override array delete void operator delete[](void* p) { operator delete(p); } ///:~ #endif //USE_MEM_CHECKER ///:~ //eof traverso-0.49.4/src/common/Utils.h000755 001750 001750 00000004136 11163362147 017322 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef UTILS_H #define UTILS_H #include "defines.h" #include #include #define QS_C(x) x.toUtf8().data() class QString; QString timeref_to_hms(const TimeRef& ref); QString timeref_to_ms(const TimeRef& ref); QString timeref_to_ms_2 (const TimeRef& ref); QString timeref_to_ms_3 (const TimeRef& ref); QString timeref_to_text(const TimeRef& ref, int scalefactor); QString timeref_to_cd(const TimeRef& ref); QString timeref_to_cd_including_hours(const TimeRef& ref); TimeRef msms_to_timeref(QString str); TimeRef cd_to_timeref(QString str); TimeRef cd_to_timeref_including_hours(QString str); QString coefficient_to_dbstring(float coeff); QDateTime extract_date_time(qint64 id); qint64 create_id(); QStringList find_qm_files(); QString language_name_from_qm_file(const QString& lang); static inline unsigned int is_power_of_two (unsigned int n) { return !(n & (n - 1)); } static inline int cnt_bits(unsigned long val, int & highbit) { int cnt = 0; highbit = 0; while (val) { if (val & 1) cnt++; val>>=1; highbit++; } return cnt; } // returns the next power of two greater or equal to val static inline long nearest_power_of_two(unsigned long val, int& highbit) { if (cnt_bits(val, highbit) > 1) { return 1< #include #include #include // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" /** * \class Tsar * \brief Tsar (Thread Save Add and Remove) is a singleton class to call * functions (both signals and slots) in a thread save way without * using any mutual exclusion primitives (mutex) * */ /** * * @return The Tsar instance. */ Tsar& tsar() { static Tsar ThreadSaveAddRemove; return ThreadSaveAddRemove; } Tsar::Tsar() { m_eventCounter = 0; m_events.append(new RingBufferNPT(1000)); m_events.append(new RingBufferNPT(100)); oldEvents = new RingBufferNPT(1000); m_retryCount = 0; #if defined (THREAD_CHECK) m_threadId = QThread::currentThreadId (); #endif connect(&finishOldEventsTimer, SIGNAL(timeout()), this, SLOT(finish_processed_events())); finishOldEventsTimer.start( 20 ); } Tsar::~ Tsar( ) { foreach(RingBufferNPT* eventBuffer, m_events) { delete eventBuffer; } delete oldEvents; } /** * Use this function to add events to the event queue when * called from the GUI thread. * * Note: This function should be called ONLY from the GUI thread! * @param event The event to add to the event queue */ bool Tsar::add_event(TsarEvent& event ) { #if defined (THREAD_CHECK) Q_ASSERT_X(m_threadId == QThread::currentThreadId (), "Tsar::add_event", "Adding event from other then GUI thread!!"); #endif if (m_events.at(0)->write(&event, 1) == 1) { m_eventCounter++; return true; } m_retryCount = 0; return false; } /** * Use this function to add events to the event queue when * called from the audio processing (real time) thread * * Note: This function should be called ONLY from the realtime audio thread and has a * non blocking behaviour! (That is, it's a real time save function) * * @param event The event to add to the event queue */ void Tsar::add_rt_event( TsarEvent& event ) { #if defined (THREAD_CHECK) Q_ASSERT_X(m_threadId != QThread::currentThreadId (), "Tsar::add_rt_event", "Adding event from NON-RT Thread!!"); #endif m_events.at(1)->write(&event, 1); } // // Function called in RealTime AudioThread processing path // void Tsar::process_events( ) { // #define profile for (int i=0; i* newEvents = m_events.at(i); int processedCount = 0; int newEventCount = newEvents->read_space(); while((newEventCount > 0) && (processedCount < 50)) { #if defined (profile) trav_time_t starttime = get_microseconds(); #endif TsarEvent event; newEvents->read(&event, 1); process_event_slot(event); oldEvents->write(&event, 1); --newEventCount; ++processedCount; #if defined (profile) int processtime = (int) (get_microseconds() - starttime); printf("called %s::%s, (signal: %s) \n", event.caller->metaObject()->className(), (event.slotindex >= 0) ? event.caller->metaObject()->method(event.slotindex).signature() : "", (event.signalindex >= 0) ? event.caller->metaObject()->method(event.signalindex + 4).signature() : ""); printf("Process time: %d useconds\n\n", processtime); #endif } } } void Tsar::finish_processed_events( ) { while(oldEvents->read_space() >= 1 ) { TsarEvent event; // Read one TsarEvent from the processed events ringbuffer 'queue' oldEvents->read(&event, 1); process_event_signal(event); --m_eventCounter; // printf("finish_processed_objects:: Count is %d\n", m_eventCounter); } m_retryCount++; if (m_retryCount > 200) { if (ie().is_holding()) { ie().suspend(); } if (audiodevice().get_driver_type() != "Null Driver") { QMessageBox::critical( 0, tr("Traverso - Malfunction!"), tr("The Audiodriver Thread seems to be stalled/stopped, but Traverso didn't ask for it!\n" "This effectively makes Traverso unusable, since it relies heavily on the AudioDriver Thread\n" "To ensure proper operation, Traverso will fallback to the 'Null Driver'.\n" "Potential issues why this can show up are: \n\n" "* You're not running with real time privileges! Please make sure this is setup properly.\n\n" "* The audio chipset isn't supported (completely), you probably have to turn off some of it's features.\n" "\nFor more information, see the Help file, section: \n\n AudioDriver: 'Thread stalled error'\n\n"), "OK", 0 ); audiodevice().set_parameters(44100, 1024, "Null Driver", true, true); m_retryCount = 0; } else { QMessageBox::critical( 0, tr("Traverso - Fatal!"), tr("The Null AudioDriver stalled too, exiting application!"), "OK", 0 ); QCoreApplication::exit(-1); } } if (m_eventCounter <= 0) { m_retryCount = 0; } } /** * Creates a Tsar event. Add the tsar event to the event queue by calling add_event() * If you need to add an event from the real time audio processing thread, use * add_rt_event() instead! * * Note: This function can be called both from the GUI and realtime audio thread and has a * non blocking behaviour! (That is, it's a real time save function) * * @param caller The calling object, needs to be derived from a QObject * @param argument The slot and/or signal argument which can be of any type. * @param slotSignature The 'signature' of the calling objects slot (equals the name of the slot function) * @param signalSignature The 'signature' of the calling objects signal (equals the name of the signal function) * @return The newly created event. */ TsarEvent Tsar::create_event( QObject* caller, void* argument, const char* slotSignature, const char* signalSignature ) { PENTER3; TsarEvent event; event.caller = caller; event.argument = argument; int index; if (qstrlen(slotSignature) > 0) { index = caller->metaObject()->indexOfMethod(slotSignature); if (index < 0) { PWARN("Slot signature contains whitespaces, please remove to avoid unneeded processing (%s::%s)", caller->metaObject()->className(), slotSignature); QByteArray norm = QMetaObject::normalizedSignature(slotSignature); index = caller->metaObject()->indexOfMethod(norm.constData()); if (index < 0) { PERROR("Couldn't find a valid index for %s", slotSignature); } } event.slotindex = index; } else { event.slotindex = -1; } if (qstrlen(signalSignature) > 0) { /* the signal index seems to have an offset of 4, so we have to substract 4 from */ /* the value returned by caller->metaObject()->indexOfMethod*/ index = caller->metaObject()->indexOfMethod(signalSignature) - 4; if (index < 0) { PWARN("Signal signature contains whitespaces, please remove to avoid unneeded processing (%s::%s)", caller->metaObject()->className(), signalSignature); QByteArray norm = QMetaObject::normalizedSignature(signalSignature); index = caller->metaObject()->indexOfMethod(norm.constData()) - 4; } event.signalindex = index; } else { event.signalindex = -1; } event.valid = true; return event; } /** * This function can be used to process the events 'slot' part. * Usefull when you have a Tsar event, but don't want/need to use tsar * to call the events slot in a thread save way * * Note: This function doesn't provide the thread savetiness you get with * the add_event() function! * * @param event The TsarEvent to be processed */ void Tsar::process_event_slot(const TsarEvent& event ) { // If there is an object to be added, do the magic to call the slot :-) if (event.slotindex > -1) { void *_a[] = { 0, const_cast(reinterpret_cast(&event.argument)) }; // This equals QMetaObject::invokeMethod(), without type checking. But we know that the types // are the correct ones, and will be casted just fine! if ( ! (event.caller->qt_metacall(QMetaObject::InvokeMetaMethod, event.slotindex, _a) < 0) ) { qDebug("Tsar::process_event_slot failed (%s::%s)", event.caller->metaObject()->className(), event.caller->metaObject()->method(event.slotindex).signature()); } } } /** * This function can be used to process the events 'signal' part. * Usefull when you have a Tsar event, but don't want/need to use tsar * to call the events signal in a thread save way * * Note: This function doesn't provide the thread savetiness you get with * the add_event() function! * * @param event The TsarEvent to be processed */ void Tsar::process_event_signal(const TsarEvent & event ) { // In case the signalindex > -1, emit the signal! if (event.signalindex > -1) { // This equals emit someSignal() :-) void *_a[] = { 0, const_cast(reinterpret_cast(&event.argument)) }; QMetaObject::activate(event.caller, event.caller->metaObject(), event.signalindex, _a); } } /** * Convenience function. Calls both process_event_slot() and process_event_signal() * * \sa process_event_slot() \sa process_event_signal() * * Note: This function doesn't provide the thread savetiness you get with * the add_event() function! * * @param event The TsarEvent to be processed */ void Tsar::process_event_slot_signal(const TsarEvent & event ) { process_event_slot(event); process_event_signal(event); } //eof traverso-0.49.4/src/common/Resampler.cpp000644 001750 001750 00000010717 11163362147 020506 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "Resampler.h" #include "Debugger.h" #define OVERFLOW_SIZE 512 Resampler::Resampler() { m_isResampleAvailable = false; m_overflowBuffer = 0; m_inputBuffer = 0; m_outputBuffer = 0; m_overflowUsed = 0; } Resampler::~ Resampler() { src_delete(m_srcState); if (m_overflowBuffer) { delete [] m_overflowBuffer; } } void Resampler::set_output_rate(uint rate) { m_outputRate = rate; reset(); } void Resampler::set_input_rate(uint rate) { m_inputRate = rate; } void Resampler::reset() { src_reset(m_srcState); m_srcData.end_of_input = 0; m_overflowUsed = 0; // Read extra frames from the child reader on the first read after a seek. // This keeps the resampler supplied with plenty of samples to produce the // requested output on each read. m_readExtraFrames = OVERFLOW_SIZE; } void Resampler::clear_buffers() { if (m_overflowBuffer) { delete [] m_overflowBuffer; m_overflowBuffer = 0; } } int Resampler::set_converter_type(int converter_type) { int error; src_delete(m_srcState); clear_buffers(); m_srcState = src_new(converter_type, 1, &error); if (!m_srcState) { PERROR("ResampleAudioReader: couldn't create libSampleRate SRC_STATE"); m_isResampleAvailable = false; return -1; } else { m_isResampleAvailable = true; } return 1; } int Resampler::prepare_process(nframes_t fileCnt) { bufferUsed = m_overflowUsed; if (m_overflowUsed) { // Copy pre-existing overflow into the buffer memcpy(m_inputBuffer, m_overflowBuffer, m_overflowUsed * sizeof(audio_sample_t)); m_inputBuffer += m_overflowUsed; } return fileCnt + m_readExtraFrames - m_overflowUsed; } int Resampler::process(nframes_t frames) { // bufferUsed += m_reader->read(m_resampleDecodeBuffer, fileCnt + m_readExtraFrames - m_overflowUsed); if (m_overflowUsed) { m_inputBuffer -= m_overflowUsed; } //printf("Resampler: Read %lu of %lu (%lu)\n", bufferUsed, fileCnt + OVERFLOW_SIZE - m_overflowUsed, m_reader->get_length()); // Don't read extra frames next time. m_readExtraFrames = 0; /* if (m_reader->eof()) { m_srcData.end_of_input = 1; }*/ nframes_t framesToConvert = frames; /* if (frameCount > m_nframes - m_readPos) { framesToConvert = m_nframes - m_readPos; }*/ // Set up sample rate converter struct for s.r.c. processing m_srcData.data_in = m_inputBuffer; m_srcData.input_frames = bufferUsed; m_srcData.data_out = m_outputBuffer; m_srcData.output_frames = framesToConvert; m_srcData.src_ratio = (double) m_outputRate / m_inputRate; src_set_ratio(m_srcState, m_srcData.src_ratio); if (src_process(m_srcState, &m_srcData)) { PERROR("Resampler: src_process() error!"); return 0; } framesRead = m_srcData.output_frames_gen; m_overflowUsed = bufferUsed - m_srcData.input_frames_used; if (m_overflowUsed < 0) { m_overflowUsed = 0; } if (m_overflowUsed) { // If there was overflow, save it for the next read. memcpy(m_overflowBuffer, m_inputBuffer + m_srcData.input_frames_used, m_overflowUsed * sizeof(audio_sample_t)); } /* // Pad end of file with 0s if necessary if (framesRead == 0 && m_readPos < get_nframes()) { int padLength = get_nframes() - m_readPos; printf("Resampler: padding: %d\n", padLength); for (int chan = 0; chan < m_channels; chan++) { memset(buffer->destination[chan] + framesRead, 0, padLength * sizeof(audio_sample_t)); } framesRead += padLength; }*/ /* // Truncate so we don't return too many samples if (m_readPos + framesRead > get_nframes()) { printf("Resampler: truncating: %d\n", framesRead - (get_nframes() - m_readPos)); framesRead = get_nframes() - m_readPos; }*/ // printf("framesRead: %lu of %lu (overflow: %lu) (at: %lu of %lu)\n", framesRead, frameCount, m_overflowUsed, m_readPos /*+ framesRead*/, get_nframes()); return framesRead; } traverso-0.49.4/src/common/sse_functions.S000644 001750 001750 00000024424 11163362147 021056 0ustar00remonremon000000 000000 /* Copyright (C) 2005 Sampo Savolainen This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: sse_functions.S,v 1.1 2007/11/07 20:28:20 r_sijrier Exp $ */ #; void x86_sse_mix_buffers_with_gain (float *dst, float *src, long nframes, float gain); .globl x86_sse_mix_buffers_with_gain .type x86_sse_mix_buffers_with_gain,@function x86_sse_mix_buffers_with_gain: #; 8(%ebp) = float *dst = %edi #; 12(%ebp) = float *src = %esi #; 16(%ebp) = long nframes = %ecx #; 20(%ebp) = float gain = st(0) pushl %ebp movl %esp, %ebp #; save the registers #; pushl %eax pushl %ebx #; pushl %ecx pushl %edi pushl %esi #; if nframes == 0, go to end movl 16(%ebp), %ecx #; nframes cmp $0, %ecx je .MBWG_END #; Check for alignment movl 8(%ebp), %edi #; dst movl 12(%ebp), %esi #; src movl %edi, %eax andl $12, %eax #; mask alignemnt offset movl %esi, %ebx andl $12, %ebx #; mask alignment offset cmp %eax, %ebx jne .MBWG_NONALIGN #; if not aligned, calculate manually #; if we are aligned cmp $0, %ebx jz .MBWG_SSE #; Pre-loop, we need to run 1-3 frames "manually" without #; SSE instructions movss 20(%ebp), %xmm1 #; xmm1 .MBWG_PRELOOP: movss (%esi), %xmm0 mulss %xmm1, %xmm0 addss (%edi), %xmm0 movss %xmm0, (%edi) addl $4, %edi #; dst++ addl $4, %esi #; src++ decl %ecx #; nframes-- jz .MBWG_END #; cmp $0, %ecx #; je .MBWG_END #; if we run out of frames, go to end addl $4, %ebx cmp $16, %ebx #; test if we've reached 16 byte alignment jne .MBWG_PRELOOP .MBWG_SSE: cmp $4, %ecx #; we know it's not zero, but if it's not >=4, then jnge .MBWG_NONALIGN #; we jump straight to the "normal" code #; copy gain to fill %xmm1 movss 20(%ebp), %xmm1 shufps $0x00, %xmm1, %xmm1 .MBWG_SSELOOP: movaps (%esi), %xmm0 #; source => xmm0 mulps %xmm1, %xmm0 #; apply gain to source addps (%edi), %xmm0 #; mix with destination movaps %xmm0, (%edi) #; copy result to destination addl $16, %edi #; dst+=4 addl $16, %esi #; src+=4 subl $4, %ecx #; nframes-=4 cmp $4, %ecx jge .MBWG_SSELOOP cmp $0, %ecx je .MBWG_END #; if there are remaining frames, the nonalign code will do nicely #; for the rest 1-3 frames. .MBWG_NONALIGN: #; not aligned! movss 20(%ebp), %xmm1 #; gain => xmm1 .MBWG_NONALIGNLOOP: movss (%esi), %xmm0 mulss %xmm1, %xmm0 addss (%edi), %xmm0 movss %xmm0, (%edi) addl $4, %edi addl $4, %esi decl %ecx jnz .MBWG_NONALIGNLOOP .MBWG_END: popl %esi popl %edi #; popl %ecx popl %ebx #; popl %eax #; return leave ret .size x86_sse_mix_buffers_with_gain, .-x86_sse_mix_buffers_with_gain #; void x86_sse_mix_buffers_no_gain (float *dst, float *src, long nframes); .globl x86_sse_mix_buffers_no_gain .type x86_sse_mix_buffers_no_gain,@function x86_sse_mix_buffers_no_gain: #; 8(%ebp) = float *dst = %edi #; 12(%ebp) = float *src = %esi #; 16(%ebp) = long nframes = %ecx pushl %ebp movl %esp, %ebp #; save the registers #; pushl %eax pushl %ebx #; pushl %ecx pushl %edi pushl %esi #; the real function #; if nframes == 0, go to end movl 16(%ebp), %ecx #; nframes cmp $0, %ecx je .MBNG_END #; Check for alignment movl 8(%ebp), %edi #; dst movl 12(%ebp), %esi #; src movl %edi, %eax andl $12, %eax #; mask alignemnt offset movl %esi, %ebx andl $12, %ebx #; mask alignment offset cmp %eax, %ebx jne .MBNG_NONALIGN #; if not aligned, calculate manually cmp $0, %ebx je .MBNG_SSE #; Pre-loop, we need to run 1-3 frames "manually" without #; SSE instructions .MBNG_PRELOOP: movss (%esi), %xmm0 addss (%edi), %xmm0 movss %xmm0, (%edi) addl $4, %edi #; dst++ addl $4, %esi #; src++ decl %ecx #; nframes-- jz .MBNG_END addl $4, %ebx cmp $16, %ebx #; test if we've reached 16 byte alignment jne .MBNG_PRELOOP .MBNG_SSE: cmp $4, %ecx #; if there are frames left, but less than 4 jnge .MBNG_NONALIGN #; we can't run SSE .MBNG_SSELOOP: movaps (%esi), %xmm0 #; source => xmm0 addps (%edi), %xmm0 #; mix with destination movaps %xmm0, (%edi) #; copy result to destination addl $16, %edi #; dst+=4 addl $16, %esi #; src+=4 subl $4, %ecx #; nframes-=4 cmp $4, %ecx jge .MBNG_SSELOOP cmp $0, %ecx je .MBNG_END #; if there are remaining frames, the nonalign code will do nicely #; for the rest 1-3 frames. .MBNG_NONALIGN: #; not aligned! movss (%esi), %xmm0 #; src => xmm0 addss (%edi), %xmm0 #; xmm0 += dst movss %xmm0, (%edi) #; xmm0 => dst addl $4, %edi addl $4, %esi decl %ecx jnz .MBNG_NONALIGN .MBNG_END: popl %esi popl %edi #; popl %ecx popl %ebx #; popl %eax #; return leave ret .size x86_sse_mix_buffers_no_gain, .-x86_sse_mix_buffers_no_gain #; void x86_sse_apply_gain_to_buffer (float *buf, long nframes, float gain); .globl x86_sse_apply_gain_to_buffer .type x86_sse_apply_gain_to_buffer,@function x86_sse_apply_gain_to_buffer: #; 8(%ebp) = float *buf = %edi #; 12(%ebp) = long nframes = %ecx #; 16(%ebp) = float gain = st(0) pushl %ebp movl %esp, %ebp #; save %edi pushl %edi #; the real function #; if nframes == 0, go to end movl 12(%ebp), %ecx #; nframes cmp $0, %ecx je .AG_END #; create the gain buffer in %xmm1 movss 16(%ebp), %xmm1 shufps $0x00, %xmm1, %xmm1 #; Check for alignment movl 8(%ebp), %edi #; buf movl %edi, %edx #; buf => %edx andl $12, %edx #; mask bits 1 & 2, result = 0, 4, 8 or 12 jz .AG_SSE #; if buffer IS aligned #; PRE-LOOP #; we iterate 1-3 times, doing normal x87 float comparison #; so we reach a 16 byte aligned "buf" (=%edi) value .AGLP_START: #; Load next value from the buffer movss (%edi), %xmm0 mulss %xmm1, %xmm0 movss %xmm0, (%edi) #; increment buffer, decrement counter addl $4, %edi #; buf++; decl %ecx #; nframes-- jz .AG_END #; if we run out of frames, we go to the end addl $4, %edx #; one non-aligned byte less cmp $16, %edx jne .AGLP_START #; if more non-aligned frames exist, we do a do-over .AG_SSE: #; We have reached the 16 byte aligned "buf" ("edi") value #; Figure out how many loops we should do movl %ecx, %eax #; copy remaining nframes to %eax for division movl $0, %edx #; 0 the edx register pushl %edi movl $4, %edi divl %edi #; %edx = remainder == 0 popl %edi #; %eax = SSE iterations cmp $0, %eax je .AGPOST_START .AGLP_SSE: movaps (%edi), %xmm0 mulps %xmm1, %xmm0 movaps %xmm0, (%edi) addl $16, %edi #; subl $4, %ecx #; nframes-=4 decl %eax jnz .AGLP_SSE #; Next we need to post-process all remaining frames #; the remaining frame count is in %ecx #; if no remaining frames, jump to the end #; cmp $0, %ecx andl $3, %ecx #; nframes % 4 je .AG_END .AGPOST_START: movss (%edi), %xmm0 mulss %xmm1, %xmm0 movss %xmm0, (%edi) #; increment buffer, decrement counter addl $4, %edi #; buf++; decl %ecx #; nframes-- jnz .AGPOST_START #; if we run out of frames, we go to the end .AG_END: popl %edi #; return leave ret .size x86_sse_apply_gain_to_buffer, .-x86_sse_apply_gain_to_buffer #; end proc #; float x86_sse_compute_peak(float *buf, long nframes, float current); .globl x86_sse_compute_peak .type x86_sse_compute_peak,@function abs_mask: .long 2147483647 x86_sse_compute_peak: #; 8(%ebp) = float *buf = %edi #; 12(%ebp) = long nframes = %ecx #; 16(%ebp) = float current = st(0) pushl %ebp movl %esp, %ebp #; save %edi pushl %edi #; the real function #; Load "current" in xmm0 movss 16(%ebp), %xmm0 #; if nframes == 0, go to end movl 12(%ebp), %ecx #; nframes cmp $0, %ecx je .CP_END #; create the "abs" mask in %xmm2 movss abs_mask, %xmm2 shufps $0x00, %xmm2, %xmm2 #; Check for alignment movl 8(%ebp), %edi #; buf movl %edi, %edx #; buf => %edx andl $12, %edx #; mask bits 1 & 2, result = 0, 4, 8 or 12 jz .CP_SSE #; if buffer IS aligned #; PRE-LOOP #; we iterate 1-3 times, doing normal x87 float comparison #; so we reach a 16 byte aligned "buf" (=%edi) value .LP_START: #; Load next value from the buffer movss (%edi), %xmm1 andps %xmm2, %xmm1 maxss %xmm1, %xmm0 #; increment buffer, decrement counter addl $4, %edi #; buf++; decl %ecx #; nframes-- jz .CP_END #; if we run out of frames, we go to the end addl $4, %edx #; one non-aligned byte less cmp $16, %edx jne .LP_START #; if more non-aligned frames exist, we do a do-over .CP_SSE: #; We have reached the 16 byte aligned "buf" ("edi") value #; Figure out how many loops we should do movl %ecx, %eax #; copy remaining nframes to %eax for division shr $2,%eax #; unsigned divide by 4 jz .POST_START #; %eax = SSE iterations #; current maximum is at %xmm0, but we need to .. shufps $0x00, %xmm0, %xmm0 #; shuffle "current" to all 4 FP's #;prefetcht0 16(%edi) .LP_SSE: movaps (%edi), %xmm1 andps %xmm2, %xmm1 maxps %xmm1, %xmm0 addl $16, %edi decl %eax jnz .LP_SSE #; Calculate the maximum value contained in the 4 FP's in %xmm0 movaps %xmm0, %xmm1 shufps $0x4e, %xmm1, %xmm1 #; shuffle left & right pairs (1234 => 3412) maxps %xmm1, %xmm0 #; maximums of the two pairs movaps %xmm0, %xmm1 shufps $0xb1, %xmm1, %xmm1 #; shuffle the floats inside the two pairs (1234 => 2143) maxps %xmm1, %xmm0 #; now every float in %xmm0 is the same value, current maximum value #; Next we need to post-process all remaining frames #; the remaining frame count is in %ecx #; if no remaining frames, jump to the end andl $3, %ecx #; nframes % 4 jz .CP_END .POST_START: movss (%edi), %xmm1 andps %xmm2, %xmm1 maxss %xmm1, %xmm0 addl $4, %edi #; buf++; decl %ecx #; nframes--; jnz .POST_START .CP_END: #; Load the value from xmm0 to the float stack for returning movss %xmm0, 16(%ebp) flds 16(%ebp) popl %edi #; return leave ret .size x86_sse_compute_peak, .-x86_sse_compute_peak #; end proc #ifdef __ELF__ .section .note.GNU-stack,"",%progbits #endif traverso-0.49.4/src/common/Tsar.h000755 001750 001750 00000006232 11163362147 017132 0ustar00remonremon000000 000000 /* Copyright (C) 2006 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: Tsar.h,v 1.4 2008/02/11 10:11:52 r_sijrier Exp $ */ #ifndef TSAR_H #define TSAR_H #include #include #include #include "RingBufferNPT.h" #define THREAD_SAVE_INVOKE(caller, argument, slotSignature) { \ TsarEvent event = tsar().create_event(caller, argument, #slotSignature, ""); \ while (!tsar().add_event(event)) { printf("THREAD_SAVE_INVOKE: failed to add event, trying again\n");} \ } #define RT_THREAD_EMIT(cal, arg, signalSignature) {\ TsarEvent event; \ event.caller = cal; \ event.argument = arg; \ event.slotindex = -1; \ static int retrievedsignalindex; \ \ if ( ! retrievedsignalindex ) { \ /* the signal index seems to have an offset of 4, so we have to substract 4 from */ \ /* the value returned by caller->metaObject()->indexOfMethod*/ \ retrievedsignalindex = cal->metaObject()->indexOfMethod(#signalSignature) - 4; \ Q_ASSERT(retrievedsignalindex >= 0); \ } \ event.signalindex = retrievedsignalindex; \ event.valid = true; \ tsar().add_rt_event(event); \ }\ #define THREAD_SAVE_INVOKE_AND_EMIT_SIGNAL(caller, argument, slotSignature, signalSignature) { \ TsarEvent event = tsar().create_event(caller, argument, #slotSignature, #signalSignature); \ tsar().add_event(event);\ }\ struct TsarEvent { // used for slot invokation stuff QObject* caller; void* argument; int slotindex; void* _a[]; // Used for the signal emiting stuff int signalindex; bool valid; }; class Tsar : public QObject { Q_OBJECT public: TsarEvent create_event(QObject* caller, void* argument, const char* slotSignature, const char* signalSignature); bool add_event(TsarEvent& event); void add_rt_event(TsarEvent& event); void process_event_slot(const TsarEvent& event); void process_event_signal(const TsarEvent& event); void process_event_slot_signal(const TsarEvent& event); private: Tsar(); ~Tsar(); Tsar(const Tsar&); // allow this function to create one instance friend Tsar& tsar(); // The AudioDevice instance is the _only_ one who // is allowed to call process_events() !! friend class AudioDevice; QList*> m_events; RingBufferNPT* oldEvents; QTimer finishOldEventsTimer; int m_eventCounter; int m_retryCount; #if defined (THREAD_CHECK) unsigned long m_threadId; #endif void process_events(); private slots: void finish_processed_events(); }; // use this function to access the context pointer Tsar& tsar(); #endif //eof traverso-0.49.4/src/common/Mixer.h000755 001750 001750 00000007557 11163362147 017320 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2006 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: Mixer.h,v 1.2 2007/10/27 17:57:15 r_sijrier Exp $ */ #ifndef TRAVERSO_MIXER_H #define TRAVERSO_MIXER_H #include "defines.h" #include static inline float f_max(float x, float a) { x -= a; x += fabsf (x); x *= 0.5f; x += a; return (x); } // This is for VU : db = 20 * log ( sample / MaxSample ) static inline float dB_to_scale_factor (float dB) { // examples : // dB = 0 will return 1.0 // db = -6.0 will return 0.5 // db = -inf will return 0.0 return dB > -120.0f ? ::pow(10.0f, dB * 0.05f) : 0.0f; } static inline float coefficient_to_dB (float coeff) { // examples : // coeff = 1.0 will return 0 dB // coeff = 0.5 will return -6 dB // coeff = 0.0 will return -infinite dB if (coeff < 0.000001f) //Should be (coeff == 0), but this will do... return (-120.0f); //Should be minus infinity, but it will do for busMonitor purposes return 20.0f * log10 (coeff); } float default_compute_peak (const audio_sample_t* buf, nframes_t nsamples, float current); void default_apply_gain_to_buffer (audio_sample_t* buf, nframes_t nframes, float gain); void default_mix_buffers_with_gain (audio_sample_t* dst, const audio_sample_t* src, nframes_t nframes, float gain); void default_mix_buffers_no_gain (audio_sample_t* dst, const audio_sample_t* src, nframes_t nframes); #if defined (ARCH_X86) && defined (SSE_OPTIMIZATIONS) extern "C" { /* SSE functions */ float x86_sse_compute_peak (const audio_sample_t* buf, nframes_t nsamples, float current); void x86_sse_apply_gain_to_buffer (audio_sample_t* buf, nframes_t nframes, float gain); void x86_sse_mix_buffers_with_gain (audio_sample_t* dst, const audio_sample_t* src, nframes_t nframes, float gain); void x86_sse_mix_buffers_no_gain (audio_sample_t* dst, const audio_sample_t* src, nframes_t nframes); } #endif #if defined (__APPLE__) && defined (BUILD_VECLIB_OPTIMIZATIONS) float veclib_compute_peak (const audio_sample_t* buf, nframes_t nsamples, float current); void veclib_apply_gain_to_buffer (audio_sample_t* buf, nframes_t nframes, float gain); void veclib_mix_buffers_with_gain (audio_sample_t* dst, const audio_sample_t* src, nframes_t nframes, float gain); void veclib_mix_buffers_no_gain (audio_sample_t* dst, const audio_sample_t* src, nframes_t nframes); #endif class Mixer { public: typedef float (*compute_peak_t) (const audio_sample_t* , nframes_t, float); typedef void (*apply_gain_to_buffer_t) (audio_sample_t* , nframes_t, float); typedef void (*mix_buffers_with_gain_t) (audio_sample_t* , const audio_sample_t* , nframes_t, float); typedef void (*mix_buffers_no_gain_t) (audio_sample_t* , const audio_sample_t* , nframes_t); static compute_peak_t compute_peak; static apply_gain_to_buffer_t apply_gain_to_buffer; static mix_buffers_with_gain_t mix_buffers_with_gain; static mix_buffers_no_gain_t mix_buffers_no_gain; }; #endif //eof traverso-0.49.4/src/common/FastDelegate.h000755 001750 001750 00000302406 11163362147 020553 0ustar00remonremon000000 000000 // FastDelegate.h // Efficient delegates in C++ that generate only two lines of asm code! // Documentation is found at http://www.codeproject.com/cpp/FastDelegate.asp // // - Don Clugston, Mar 2004. // Major contributions were made by Jody Hagins. // History: // 24-Apr-04 1.0 * Submitted to CodeProject. // 28-Apr-04 1.1 * Prevent most unsafe uses of evil static function hack. // * Improved syntax for horrible_cast (thanks Paul Bludov). // * Tested on Metrowerks MWCC and Intel ICL (IA32) // * Compiled, but not run, on Comeau C++ and Intel Itanium ICL. // 27-Jun-04 1.2 * Now works on Borland C++ Builder 5.5 // * Now works on /clr "managed C++" code on VC7, VC7.1 // * Comeau C++ now compiles without warnings. // * Prevent the virtual inheritance case from being used on // VC6 and earlier, which generate incorrect code. // * Improved warning and error messages. Non-standard hacks // now have compile-time checks to make them safer. // * implicit_cast used instead of static_cast in many cases. // * If calling a const member function, a const class pointer can be used. // * MakeDelegate() global helper function added to simplify pass-by-value. // * Added fastdelegate.clear() // 16-Jul-04 1.2.1* Workaround for gcc bug (const member function pointers in templates) // 30-Oct-04 1.3 * Support for (non-void) return values. // * No more workarounds in client code! // MSVC and Intel now use a clever hack invented by John Dlugosz: // - The FASTDELEGATEDECLARE workaround is no longer necessary. // - No more warning messages for VC6 // * Less use of macros. Error messages should be more comprehensible. // * Added include guards // * Added FastDelegate::empty() to test if invocation is safe (Thanks Neville Franks). // * Now tested on VS 2005 Express Beta, PGI C++ // 24-Dec-04 1.4 * Added DelegateMemento, to allow collections of disparate delegates. // * <,>,<=,>= comparison operators to allow storage in ordered containers. // * Substantial reduction of code size, especially the 'Closure' class. // * Standardised all the compiler-specific workarounds. // * MFP conversion now works for CodePlay (but not yet supported in the full code). // * Now compiles without warnings on _any_ supported compiler, including BCC 5.5.1 // * New syntax: FastDelegate< int (char *, double) >. // 14-Feb-05 1.4.1* Now treats =0 as equivalent to .clear(), ==0 as equivalent to .empty(). (Thanks elfric). // * Now tested on Intel ICL for AMD64, VS2005 Beta for AMD64 and Itanium. // 30-Mar-05 1.5 * Safebool idiom: "if (dg)" is now equivalent to "if (!dg.empty())" // * Fully supported by CodePlay VectorC // * Bugfix for Metrowerks: empty() was buggy because a valid MFP can be 0 on MWCC! // * More optimal assignment,== and != operators for static function pointers. #ifndef FASTDELEGATE_H #define FASTDELEGATE_H #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #include // to allow <,> comparisons //////////////////////////////////////////////////////////////////////////////// // Configuration options // //////////////////////////////////////////////////////////////////////////////// // Uncomment the following #define for optimally-sized delegates. // In this case, the generated asm code is almost identical to the code you'd get // if the compiler had native support for delegates. // It will not work on systems where sizeof(dataptr) < sizeof(codeptr). // Thus, it will not work for DOS compilers using the medium model. // It will also probably fail on some DSP systems. #define FASTDELEGATE_USESTATICFUNCTIONHACK // Uncomment the next line to allow function declarator syntax. // It is automatically enabled for those compilers where it is known to work. //#define FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX //////////////////////////////////////////////////////////////////////////////// // Compiler identification for workarounds // //////////////////////////////////////////////////////////////////////////////// // Compiler identification. It's not easy to identify Visual C++ because // many vendors fraudulently define Microsoft's identifiers. #if defined(_MSC_VER) && !defined(__MWERKS__) && !defined(__VECTOR_C) && !defined(__ICL) && !defined(__BORLANDC__) #define FASTDLGT_ISMSVC #if (_MSC_VER <1300) // Many workarounds are required for VC6. #define FASTDLGT_VC6 #pragma warning(disable:4786) // disable this ridiculous warning #endif #endif // Does the compiler uses Microsoft's member function pointer structure? // If so, it needs special treatment. // Metrowerks CodeWarrior, Intel, and CodePlay fraudulently define Microsoft's // identifier, _MSC_VER. We need to filter Metrowerks out. #if defined(_MSC_VER) && !defined(__MWERKS__) #define FASTDLGT_MICROSOFT_MFP #if !defined(__VECTOR_C) // CodePlay doesn't have the __single/multi/virtual_inheritance keywords #define FASTDLGT_HASINHERITANCE_KEYWORDS #endif #endif // Does it allow function declarator syntax? The following compilers are known to work: #if defined(FASTDLGT_ISMSVC) && (_MSC_VER >=1310) // VC 7.1 #define FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX #endif // Gcc(2.95+), and versions of Digital Mars, Intel and Comeau in common use. #if defined (__DMC__) || defined(__GNUC__) || defined(__ICL) || defined(__COMO__) #define FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX #endif // It works on Metrowerks MWCC 3.2.2. From boost.Config it should work on earlier ones too. #if defined (__MWERKS__) #define FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX #endif #ifdef __GNUC__ // Workaround GCC bug #8271 // At present, GCC doesn't recognize constness of MFPs in templates #define FASTDELEGATE_GCC_BUG_8271 #endif //////////////////////////////////////////////////////////////////////////////// // General tricks used in this code // // (a) Error messages are generated by typdefing an array of negative size to // generate compile-time errors. // (b) Warning messages on MSVC are generated by declaring unused variables, and // enabling the "variable XXX is never used" warning. // (c) Unions are used in a few compiler-specific cases to perform illegal casts. // (d) For Microsoft and Intel, when adjusting the 'this' pointer, it's cast to // (char *) first to ensure that the correct number of *bytes* are added. // //////////////////////////////////////////////////////////////////////////////// // Helper templates // //////////////////////////////////////////////////////////////////////////////// namespace fastdelegate { namespace detail { // we'll hide the implementation details in a nested namespace. // implicit_cast< > // I believe this was originally going to be in the C++ standard but // was left out by accident. It's even milder than static_cast. // I use it instead of static_cast<> to emphasize that I'm not doing // anything nasty. // Usage is identical to static_cast<> template inline OutputClass implicit_cast(InputClass input){ return input; } // horrible_cast< > // This is truly evil. It completely subverts C++'s type system, allowing you // to cast from any class to any other class. Technically, using a union // to perform the cast is undefined behaviour (even in C). But we can see if // it is OK by checking that the union is the same size as each of its members. // horrible_cast<> should only be used for compiler-specific workarounds. // Usage is identical to reinterpret_cast<>. // This union is declared outside the horrible_cast because BCC 5.5.1 // can't inline a function with a nested class, and gives a warning. template union horrible_union{ OutputClass out; InputClass in; }; template inline OutputClass horrible_cast(const InputClass input){ horrible_union u; // Cause a compile-time error if in, out and u are not the same size. // If the compile fails here, it means the compiler has peculiar // unions which would prevent the cast from working. typedef int ERROR_CantUseHorrible_cast[sizeof(InputClass)==sizeof(u) && sizeof(InputClass)==sizeof(OutputClass) ? 1 : -1]; u.in = input; return u.out; } //////////////////////////////////////////////////////////////////////////////// // Workarounds // //////////////////////////////////////////////////////////////////////////////// // Backwards compatibility: This macro used to be necessary in the virtual inheritance // case for Intel and Microsoft. Now it just forward-declares the class. #define FASTDELEGATEDECLARE(CLASSNAME) class CLASSNAME; // Prevent use of the static function hack with the DOS medium model. #ifdef __MEDIUM__ #undef FASTDELEGATE_USESTATICFUNCTIONHACK #endif // DefaultVoid - a workaround for 'void' templates in VC6. // // (1) VC6 and earlier do not allow 'void' as a default template argument. // (2) They also doesn't allow you to return 'void' from a function. // // Workaround for (1): Declare a dummy type 'DefaultVoid' which we use // when we'd like to use 'void'. We convert it into 'void' and back // using the templates DefaultVoidToVoid<> and VoidToDefaultVoid<>. // Workaround for (2): On VC6, the code for calling a void function is // identical to the code for calling a non-void function in which the // return value is never used, provided the return value is returned // in the EAX register, rather than on the stack. // This is true for most fundamental types such as int, enum, void *. // Const void * is the safest option since it doesn't participate // in any automatic conversions. But on a 16-bit compiler it might // cause extra code to be generated, so we disable it for all compilers // except for VC6 (and VC5). #ifdef FASTDLGT_VC6 // VC6 workaround typedef const void * DefaultVoid; #else // On any other compiler, just use a normal void. typedef void DefaultVoid; #endif // Translate from 'DefaultVoid' to 'void'. // Everything else is unchanged template struct DefaultVoidToVoid { typedef T type; }; template <> struct DefaultVoidToVoid { typedef void type; }; // Translate from 'void' into 'DefaultVoid' // Everything else is unchanged template struct VoidToDefaultVoid { typedef T type; }; template <> struct VoidToDefaultVoid { typedef DefaultVoid type; }; //////////////////////////////////////////////////////////////////////////////// // Fast Delegates, part 1: // // Conversion of member function pointer to a standard form // //////////////////////////////////////////////////////////////////////////////// // GenericClass is a fake class, ONLY used to provide a type. // It is vitally important that it is never defined, so that the compiler doesn't // think it can optimize the invocation. For example, Borland generates simpler // code if it knows the class only uses single inheritance. // Compilers using Microsoft's structure need to be treated as a special case. #ifdef FASTDLGT_MICROSOFT_MFP #ifdef FASTDLGT_HASINHERITANCE_KEYWORDS // For Microsoft and Intel, we want to ensure that it's the most efficient type of MFP // (4 bytes), even when the /vmg option is used. Declaring an empty class // would give 16 byte pointers in this case.... class __single_inheritance GenericClass; #endif // ...but for Codeplay, an empty class *always* gives 4 byte pointers. // If compiled with the /clr option ("managed C++"), the JIT compiler thinks // it needs to load GenericClass before it can call any of its functions, // (compiles OK but crashes at runtime!), so we need to declare an // empty class to make it happy. // Codeplay and VC4 can't cope with the unknown_inheritance case either. class GenericClass {}; #else class GenericClass; #endif // The size of a single inheritance member function pointer. const int SINGLE_MEMFUNCPTR_SIZE = sizeof(void (GenericClass::*)()); // SimplifyMemFunc< >::Convert() // // A template function that converts an arbitrary member function pointer into the // simplest possible form of member function pointer, using a supplied 'this' pointer. // According to the standard, this can be done legally with reinterpret_cast<>. // For (non-standard) compilers which use member function pointers which vary in size // depending on the class, we need to use knowledge of the internal structure of a // member function pointer, as used by the compiler. Template specialization is used // to distinguish between the sizes. Because some compilers don't support partial // template specialisation, I use full specialisation of a wrapper struct. // general case -- don't know how to convert it. Force a compile failure template struct SimplifyMemFunc { template inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, GenericMemFuncType &bound_func) { // Unsupported member function type -- force a compile failure. // (it's illegal to have a array with negative size). typedef char ERROR_Unsupported_member_function_pointer_on_this_compiler[N-100]; return 0; } }; // For compilers where all member func ptrs are the same size, everything goes here. // For non-standard compilers, only single_inheritance classes go here. template <> struct SimplifyMemFunc { template inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, GenericMemFuncType &bound_func) { #if defined __DMC__ // Digital Mars doesn't allow you to cast between abitrary PMF's, // even though the standard says you can. The 32-bit compiler lets you // static_cast through an int, but the DOS compiler doesn't. bound_func = horrible_cast(function_to_bind); #else bound_func = reinterpret_cast(function_to_bind); #endif return reinterpret_cast(pthis); } }; //////////////////////////////////////////////////////////////////////////////// // Fast Delegates, part 1b: // // Workarounds for Microsoft and Intel // //////////////////////////////////////////////////////////////////////////////// // Compilers with member function pointers which violate the standard (MSVC, Intel, Codeplay), // need to be treated as a special case. #ifdef FASTDLGT_MICROSOFT_MFP // We use unions to perform horrible_casts. I would like to use #pragma pack(push, 1) // at the start of each function for extra safety, but VC6 seems to ICE // intermittently if you do this inside a template. // __multiple_inheritance classes go here // Nasty hack for Microsoft and Intel (IA32 and Itanium) template<> struct SimplifyMemFunc< SINGLE_MEMFUNCPTR_SIZE + sizeof(int) > { template inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, GenericMemFuncType &bound_func) { // We need to use a horrible_cast to do this conversion. // In MSVC, a multiple inheritance member pointer is internally defined as: union { XFuncType func; struct { GenericMemFuncType funcaddress; // points to the actual member function int delta; // #BYTES to be added to the 'this' pointer }s; } u; // Check that the horrible_cast will work typedef int ERROR_CantUsehorrible_cast[sizeof(function_to_bind)==sizeof(u.s)? 1 : -1]; u.func = function_to_bind; bound_func = u.s.funcaddress; return reinterpret_cast(reinterpret_cast(pthis) + u.s.delta); } }; // virtual inheritance is a real nuisance. It's inefficient and complicated. // On MSVC and Intel, there isn't enough information in the pointer itself to // enable conversion to a closure pointer. Earlier versions of this code didn't // work for all cases, and generated a compile-time error instead. // But a very clever hack invented by John M. Dlugosz solves this problem. // My code is somewhat different to his: I have no asm code, and I make no // assumptions about the calling convention that is used. // In VC++ and ICL, a virtual_inheritance member pointer // is internally defined as: struct MicrosoftVirtualMFP { void (GenericClass::*codeptr)(); // points to the actual member function int delta; // #bytes to be added to the 'this' pointer int vtable_index; // or 0 if no virtual inheritance }; // The CRUCIAL feature of Microsoft/Intel MFPs which we exploit is that the // m_codeptr member is *always* called, regardless of the values of the other // members. (This is *not* true for other compilers, eg GCC, which obtain the // function address from the vtable if a virtual function is being called). // Dlugosz's trick is to make the codeptr point to a probe function which // returns the 'this' pointer that was used. // Define a generic class that uses virtual inheritance. // It has a trival member function that returns the value of the 'this' pointer. struct GenericVirtualClass : virtual public GenericClass { typedef GenericVirtualClass * (GenericVirtualClass::*ProbePtrType)(); GenericVirtualClass * GetThis() { return this; } }; // __virtual_inheritance classes go here template <> struct SimplifyMemFunc { template inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, GenericMemFuncType &bound_func) { union { XFuncType func; GenericClass* (X::*ProbeFunc)(); MicrosoftVirtualMFP s; } u; u.func = function_to_bind; bound_func = reinterpret_cast(u.s.codeptr); union { GenericVirtualClass::ProbePtrType virtfunc; MicrosoftVirtualMFP s; } u2; // Check that the horrible_cast<>s will work typedef int ERROR_CantUsehorrible_cast[sizeof(function_to_bind)==sizeof(u.s) && sizeof(function_to_bind)==sizeof(u.ProbeFunc) && sizeof(u2.virtfunc)==sizeof(u2.s) ? 1 : -1]; // Unfortunately, taking the address of a MF prevents it from being inlined, so // this next line can't be completely optimised away by the compiler. u2.virtfunc = &GenericVirtualClass::GetThis; u.s.codeptr = u2.s.codeptr; return (pthis->*u.ProbeFunc)(); } }; #if (_MSC_VER <1300) // Nasty hack for Microsoft Visual C++ 6.0 // unknown_inheritance classes go here // There is a compiler bug in MSVC6 which generates incorrect code in this case!! template <> struct SimplifyMemFunc { template inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, GenericMemFuncType &bound_func) { // There is an apalling but obscure compiler bug in MSVC6 and earlier: // vtable_index and 'vtordisp' are always set to 0 in the // unknown_inheritance case! // This means that an incorrect function could be called!!! // Compiling with the /vmg option leads to potentially incorrect code. // This is probably the reason that the IDE has a user interface for specifying // the /vmg option, but it is disabled - you can only specify /vmg on // the command line. In VC1.5 and earlier, the compiler would ICE if it ever // encountered this situation. // It is OK to use the /vmg option if /vmm or /vms is specified. // Fortunately, the wrong function is only called in very obscure cases. // It only occurs when a derived class overrides a virtual function declared // in a virtual base class, and the member function // points to the *Derived* version of that function. The problem can be // completely averted in 100% of cases by using the *Base class* for the // member fpointer. Ie, if you use the base class as an interface, you'll // stay out of trouble. // Occasionally, you might want to point directly to a derived class function // that isn't an override of a base class. In this case, both vtable_index // and 'vtordisp' are zero, but a virtual_inheritance pointer will be generated. // We can generate correct code in this case. To prevent an incorrect call from // ever being made, on MSVC6 we generate a warning, and call a function to // make the program crash instantly. typedef char ERROR_VC6CompilerBug[-100]; return 0; } }; #else // Nasty hack for Microsoft and Intel (IA32 and Itanium) // unknown_inheritance classes go here // This is probably the ugliest bit of code I've ever written. Look at the casts! // There is a compiler bug in MSVC6 which prevents it from using this code. template <> struct SimplifyMemFunc { template inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, GenericMemFuncType &bound_func) { // The member function pointer is 16 bytes long. We can't use a normal cast, but // we can use a union to do the conversion. union { XFuncType func; // In VC++ and ICL, an unknown_inheritance member pointer // is internally defined as: struct { GenericMemFuncType m_funcaddress; // points to the actual member function int delta; // #bytes to be added to the 'this' pointer int vtordisp; // #bytes to add to 'this' to find the vtable int vtable_index; // or 0 if no virtual inheritance } s; } u; // Check that the horrible_cast will work typedef int ERROR_CantUsehorrible_cast[sizeof(XFuncType)==sizeof(u.s)? 1 : -1]; u.func = function_to_bind; bound_func = u.s.funcaddress; int virtual_delta = 0; if (u.s.vtable_index) { // Virtual inheritance is used // First, get to the vtable. // It is 'vtordisp' bytes from the start of the class. const int * vtable = *reinterpret_cast( reinterpret_cast(pthis) + u.s.vtordisp ); // 'vtable_index' tells us where in the table we should be looking. virtual_delta = u.s.vtordisp + *reinterpret_cast( reinterpret_cast(vtable) + u.s.vtable_index); } // The int at 'virtual_delta' gives us the amount to add to 'this'. // Finally we can add the three components together. Phew! return reinterpret_cast( reinterpret_cast(pthis) + u.s.delta + virtual_delta); }; }; #endif // MSVC 7 and greater #endif // MS/Intel hacks } // namespace detail //////////////////////////////////////////////////////////////////////////////// // Fast Delegates, part 2: // // Define the delegate storage, and cope with static functions // //////////////////////////////////////////////////////////////////////////////// // DelegateMemento -- an opaque structure which can hold an arbitary delegate. // It knows nothing about the calling convention or number of arguments used by // the function pointed to. // It supplies comparison operators so that it can be stored in STL collections. // It cannot be set to anything other than null, nor invoked directly: // it must be converted to a specific delegate. // Implementation: // There are two possible implementations: the Safe method and the Evil method. // DelegateMemento - Safe version // // This implementation is standard-compliant, but a bit tricky. // A static function pointer is stored inside the class. // Here are the valid values: // +-- Static pointer --+--pThis --+-- pMemFunc-+-- Meaning------+ // | 0 | 0 | 0 | Empty | // | !=0 |(dontcare)| Invoker | Static function| // | 0 | !=0 | !=0* | Method call | // +--------------------+----------+------------+----------------+ // * For Metrowerks, this can be 0. (first virtual function in a // single_inheritance class). // When stored stored inside a specific delegate, the 'dontcare' entries are replaced // with a reference to the delegate itself. This complicates the = and == operators // for the delegate class. // DelegateMemento - Evil version // // For compilers where data pointers are at least as big as code pointers, it is // possible to store the function pointer in the this pointer, using another // horrible_cast. In this case the DelegateMemento implementation is simple: // +--pThis --+-- pMemFunc-+-- Meaning---------------------+ // | 0 | 0 | Empty | // | !=0 | !=0* | Static function or method call| // +----------+------------+-------------------------------+ // * For Metrowerks, this can be 0. (first virtual function in a // single_inheritance class). // Note that the Sun C++ and MSVC documentation explicitly state that they // support static_cast between void * and function pointers. class DelegateMemento { protected: // the data is protected, not private, because many // compilers have problems with template friends. typedef void (detail::GenericClass::*GenericMemFuncType)(); // arbitrary MFP. GenericMemFuncType m_pFunction; detail::GenericClass *m_pthis; #if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) typedef void (*GenericFuncPtr)(); // arbitrary code pointer GenericFuncPtr m_pStaticFunction; #endif public: #if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) DelegateMemento() : m_pthis(0), m_pFunction(0), m_pStaticFunction(0) {}; void clear() { m_pthis=0; m_pFunction=0; m_pStaticFunction=0; } #else DelegateMemento() : m_pFunction(0), m_pthis(0) {}; void clear() { m_pthis=0; m_pFunction=0; } #endif public: #if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) inline bool IsEqual (const DelegateMemento &x) const{ // We have to cope with the static function pointers as a special case if (m_pFunction!=x.m_pFunction) return false; // the static function ptrs must either both be equal, or both be 0. if (m_pStaticFunction!=x.m_pStaticFunction) return false; if (m_pStaticFunction!=0) return m_pthis==x.m_pthis; else return true; } #else // Evil Method inline bool IsEqual (const DelegateMemento &x) const{ return m_pthis==x.m_pthis && m_pFunction==x.m_pFunction; } #endif // Provide a strict weak ordering for DelegateMementos. inline bool IsLess(const DelegateMemento &right) const { // deal with static function pointers first #if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) if (m_pStaticFunction !=0 || right.m_pStaticFunction!=0) return m_pStaticFunction < right.m_pStaticFunction; #endif if (m_pthis !=right.m_pthis) return m_pthis < right.m_pthis; // There are no ordering operators for member function pointers, // but we can fake one by comparing each byte. The resulting ordering is // arbitrary (and compiler-dependent), but it permits storage in ordered STL containers. return memcmp(&m_pFunction, &right.m_pFunction, sizeof(m_pFunction)) < 0; } // BUGFIX (Mar 2005): // We can't just compare m_pFunction because on Metrowerks, // m_pFunction can be zero even if the delegate is not empty! inline bool operator ! () const // Is it bound to anything? { return m_pthis==0 && m_pFunction==0; } inline bool empty() const // Is it bound to anything? { return m_pthis==0 && m_pFunction==0; } public: DelegateMemento & operator = (const DelegateMemento &right) { SetMementoFrom(right); return *this; } inline bool operator <(const DelegateMemento &right) { return IsLess(right); } inline bool operator >(const DelegateMemento &right) { return right.IsLess(*this); } DelegateMemento (const DelegateMemento &right) : m_pFunction(right.m_pFunction), m_pthis(right.m_pthis) #if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) , m_pStaticFunction (right.m_pStaticFunction) #endif {} protected: void SetMementoFrom(const DelegateMemento &right) { m_pFunction = right.m_pFunction; m_pthis = right.m_pthis; #if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) m_pStaticFunction = right.m_pStaticFunction; #endif } }; // ClosurePtr<> // // A private wrapper class that adds function signatures to DelegateMemento. // It's the class that does most of the actual work. // The signatures are specified by: // GenericMemFunc: must be a type of GenericClass member function pointer. // StaticFuncPtr: must be a type of function pointer with the same signature // as GenericMemFunc. // UnvoidStaticFuncPtr: is the same as StaticFuncPtr, except on VC6 // where it never returns void (returns DefaultVoid instead). // An outer class, FastDelegateN<>, handles the invoking and creates the // necessary typedefs. // This class does everything else. namespace detail { template < class GenericMemFunc, class StaticFuncPtr, class UnvoidStaticFuncPtr> class ClosurePtr : public DelegateMemento { public: // These functions are for setting the delegate to a member function. // Here's the clever bit: we convert an arbitrary member function into a // standard form. XMemFunc should be a member function of class X, but I can't // enforce that here. It needs to be enforced by the wrapper class. template < class X, class XMemFunc > inline void bindmemfunc(X *pthis, XMemFunc function_to_bind ) { m_pthis = SimplifyMemFunc< sizeof(function_to_bind) > ::Convert(pthis, function_to_bind, m_pFunction); #if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) m_pStaticFunction = 0; #endif } // For const member functions, we only need a const class pointer. // Since we know that the member function is const, it's safe to // remove the const qualifier from the 'this' pointer with a const_cast. // VC6 has problems if we just overload 'bindmemfunc', so we give it a different name. template < class X, class XMemFunc> inline void bindconstmemfunc(const X *pthis, XMemFunc function_to_bind) { m_pthis= SimplifyMemFunc< sizeof(function_to_bind) > ::Convert(const_cast(pthis), function_to_bind, m_pFunction); #if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) m_pStaticFunction = 0; #endif } #ifdef FASTDELEGATE_GCC_BUG_8271 // At present, GCC doesn't recognize constness of MFPs in templates template < class X, class XMemFunc> inline void bindmemfunc(const X *pthis, XMemFunc function_to_bind) { bindconstmemfunc(pthis, function_to_bind); #if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) m_pStaticFunction = 0; #endif } #endif // These functions are required for invoking the stored function inline GenericClass *GetClosureThis() const { return m_pthis; } inline GenericMemFunc GetClosureMemPtr() const { return reinterpret_cast(m_pFunction); } // There are a few ways of dealing with static function pointers. // There's a standard-compliant, but tricky method. // There's also a straightforward hack, that won't work on DOS compilers using the // medium memory model. It's so evil that I can't recommend it, but I've // implemented it anyway because it produces very nice asm code. #if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) // ClosurePtr<> - Safe version // // This implementation is standard-compliant, but a bit tricky. // I store the function pointer inside the class, and the delegate then // points to itself. Whenever the delegate is copied, these self-references // must be transformed, and this complicates the = and == operators. public: // The next two functions are for operator ==, =, and the copy constructor. // We may need to convert the m_pthis pointers, so that // they remain as self-references. template< class DerivedClass > inline void CopyFrom (DerivedClass *pParent, const DelegateMemento &x) { SetMementoFrom(x); if (m_pStaticFunction!=0) { // transform self references... m_pthis=reinterpret_cast(pParent); } } // For static functions, the 'static_function_invoker' class in the parent // will be called. The parent then needs to call GetStaticFunction() to find out // the actual function to invoke. template < class DerivedClass, class ParentInvokerSig > inline void bindstaticfunc(DerivedClass *pParent, ParentInvokerSig static_function_invoker, StaticFuncPtr function_to_bind ) { if (function_to_bind==0) { // cope with assignment to 0 m_pFunction=0; } else { bindmemfunc(pParent, static_function_invoker); } m_pStaticFunction=reinterpret_cast(function_to_bind); } inline UnvoidStaticFuncPtr GetStaticFunction() const { return reinterpret_cast(m_pStaticFunction); } #else // ClosurePtr<> - Evil version // // For compilers where data pointers are at least as big as code pointers, it is // possible to store the function pointer in the this pointer, using another // horrible_cast. Invocation isn't any faster, but it saves 4 bytes, and // speeds up comparison and assignment. If C++ provided direct language support // for delegates, they would produce asm code that was almost identical to this. // Note that the Sun C++ and MSVC documentation explicitly state that they // support static_cast between void * and function pointers. template< class DerivedClass > // Commented pParent out to avoid the compile warning! (Warning: pParent not used) inline void CopyFrom (DerivedClass* /*pParent*/, const DelegateMemento &right) { SetMementoFrom(right); } // For static functions, the 'static_function_invoker' class in the parent // will be called. The parent then needs to call GetStaticFunction() to find out // the actual function to invoke. // ******** EVIL, EVIL CODE! ******* template < class DerivedClass, class ParentInvokerSig> inline void bindstaticfunc(DerivedClass *pParent, ParentInvokerSig static_function_invoker, StaticFuncPtr function_to_bind) { if (function_to_bind==0) { // cope with assignment to 0 m_pFunction=0; } else { // We'll be ignoring the 'this' pointer, but we need to make sure we pass // a valid value to bindmemfunc(). bindmemfunc(pParent, static_function_invoker); } // WARNING! Evil hack. We store the function in the 'this' pointer! // Ensure that there's a compilation failure if function pointers // and data pointers have different sizes. // If you get this error, you need to #undef FASTDELEGATE_USESTATICFUNCTIONHACK. typedef int ERROR_CantUseEvilMethod[sizeof(GenericClass *)==sizeof(function_to_bind) ? 1 : -1]; m_pthis = horrible_cast(function_to_bind); // MSVC, SunC++ and DMC accept the following (non-standard) code: // m_pthis = static_cast(static_cast(function_to_bind)); // BCC32, Comeau and DMC accept this method. MSVC7.1 needs __int64 instead of long // m_pthis = reinterpret_cast(reinterpret_cast(function_to_bind)); } // ******** EVIL, EVIL CODE! ******* // This function will be called with an invalid 'this' pointer!! // We're just returning the 'this' pointer, converted into // a function pointer! inline UnvoidStaticFuncPtr GetStaticFunction() const { // Ensure that there's a compilation failure if function pointers // and data pointers have different sizes. // If you get this error, you need to #undef FASTDELEGATE_USESTATICFUNCTIONHACK. typedef int ERROR_CantUseEvilMethod[sizeof(UnvoidStaticFuncPtr)==sizeof(this) ? 1 : -1]; return horrible_cast(this); } #endif // !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) // Does the closure contain this static function? inline bool IsEqualToStaticFuncPtr(StaticFuncPtr funcptr){ if (funcptr==0) return empty(); // For the Evil method, if it doesn't actually contain a static function, this will return an arbitrary // value that is not equal to any valid function pointer. else return funcptr==reinterpret_cast(GetStaticFunction()); } }; } // namespace detail //////////////////////////////////////////////////////////////////////////////// // Fast Delegates, part 3: // // Wrapper classes to ensure type safety // //////////////////////////////////////////////////////////////////////////////// // Once we have the member function conversion templates, it's easy to make the // wrapper classes. So that they will work with as many compilers as possible, // the classes are of the form // FastDelegate3 // They can cope with any combination of parameters. The max number of parameters // allowed is 8, but it is trivial to increase this limit. // Note that we need to treat const member functions seperately. // All this class does is to enforce type safety, and invoke the delegate with // the correct list of parameters. // Because of the weird rule about the class of derived member function pointers, // you sometimes need to apply a downcast to the 'this' pointer. // This is the reason for the use of "implicit_cast(pthis)" in the code below. // If CDerivedClass is derived from CBaseClass, but doesn't override SimpleVirtualFunction, // without this trick you'd need to write: // MyDelegate(static_cast(&d), &CDerivedClass::SimpleVirtualFunction); // but with the trick you can write // MyDelegate(&d, &CDerivedClass::SimpleVirtualFunction); // RetType is the type the compiler uses in compiling the template. For VC6, // it cannot be void. DesiredRetType is the real type which is returned from // all of the functions. It can be void. // Implicit conversion to "bool" is achieved using the safe_bool idiom, // using member data pointers (MDP). This allows "if (dg)..." syntax // Because some compilers (eg codeplay) don't have a unique value for a zero // MDP, an extra padding member is added to the SafeBool struct. // Some compilers (eg VC6) won't implicitly convert from 0 to an MDP, so // in that case the static function constructor is not made explicit; this // allows "if (dg==0) ..." to compile. //N=0 template class FastDelegate0 { private: typedef typename detail::DefaultVoidToVoid::type DesiredRetType; typedef DesiredRetType (*StaticFunctionPtr)(); typedef RetType (*UnvoidStaticFunctionPtr)(); typedef RetType (detail::GenericClass::*GenericMemFn)(); typedef detail::ClosurePtr ClosureType; ClosureType m_Closure; public: // Typedefs to aid generic programming typedef FastDelegate0 type; // Construction and comparison functions FastDelegate0() { clear(); } FastDelegate0(const FastDelegate0 &x) { m_Closure.CopyFrom(this, x.m_Closure); } void operator = (const FastDelegate0 &x) { m_Closure.CopyFrom(this, x.m_Closure); } bool operator ==(const FastDelegate0 &x) const { return m_Closure.IsEqual(x.m_Closure); } bool operator !=(const FastDelegate0 &x) const { return !m_Closure.IsEqual(x.m_Closure); } bool operator <(const FastDelegate0 &x) const { return m_Closure.IsLess(x.m_Closure); } bool operator >(const FastDelegate0 &x) const { return x.m_Closure.IsLess(m_Closure); } // Binding to non-const member functions template < class X, class Y > FastDelegate0(Y *pthis, DesiredRetType (X::* function_to_bind)() ) { m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } template < class X, class Y > inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)()) { m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } // Binding to const member functions. template < class X, class Y > FastDelegate0(const Y *pthis, DesiredRetType (X::* function_to_bind)() const) { m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } template < class X, class Y > inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)() const) { m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } // Static functions. We convert them into a member function call. // This constructor also provides implicit conversion FastDelegate0(DesiredRetType (*function_to_bind)() ) { bind(function_to_bind); } // for efficiency, prevent creation of a temporary void operator = (DesiredRetType (*function_to_bind)() ) { bind(function_to_bind); } inline void bind(DesiredRetType (*function_to_bind)()) { m_Closure.bindstaticfunc(this, &FastDelegate0::InvokeStaticFunction, function_to_bind); } // Invoke the delegate RetType operator() () const { return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(); } // Implicit conversion to "bool" using the safe_bool idiom private: typedef struct SafeBoolStruct { int a_data_pointer_to_this_is_0_on_buggy_compilers; StaticFunctionPtr m_nonzero; } UselessTypedef; typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; public: operator unspecified_bool_type() const { return empty()? 0: &SafeBoolStruct::m_nonzero; } // necessary to allow ==0 to work despite the safe_bool idiom inline bool operator==(StaticFunctionPtr funcptr) { return m_Closure.IsEqualToStaticFuncPtr(funcptr); } inline bool operator!=(StaticFunctionPtr funcptr) { return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } inline bool operator ! () const { // Is it bound to anything? return !m_Closure; } inline bool empty() const { return !m_Closure; } void clear() { m_Closure.clear();} // Conversion to and from the DelegateMemento storage class const DelegateMemento & GetMemento() { return m_Closure; } void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } private: // Invoker for static functions RetType InvokeStaticFunction() const { return (*(m_Closure.GetStaticFunction()))(); } }; //N=1 template class FastDelegate1 { private: typedef typename detail::DefaultVoidToVoid::type DesiredRetType; typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1); typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1); typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1); typedef detail::ClosurePtr ClosureType; ClosureType m_Closure; public: // Typedefs to aid generic programming typedef FastDelegate1 type; // Construction and comparison functions FastDelegate1() { clear(); } FastDelegate1(const FastDelegate1 &x) { m_Closure.CopyFrom(this, x.m_Closure); } void operator = (const FastDelegate1 &x) { m_Closure.CopyFrom(this, x.m_Closure); } bool operator ==(const FastDelegate1 &x) const { return m_Closure.IsEqual(x.m_Closure); } bool operator !=(const FastDelegate1 &x) const { return !m_Closure.IsEqual(x.m_Closure); } bool operator <(const FastDelegate1 &x) const { return m_Closure.IsLess(x.m_Closure); } bool operator >(const FastDelegate1 &x) const { return x.m_Closure.IsLess(m_Closure); } // Binding to non-const member functions template < class X, class Y > FastDelegate1(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1) ) { m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } template < class X, class Y > inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1)) { m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } // Binding to const member functions. template < class X, class Y > FastDelegate1(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1) const) { m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } template < class X, class Y > inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1) const) { m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } // Static functions. We convert them into a member function call. // This constructor also provides implicit conversion FastDelegate1(DesiredRetType (*function_to_bind)(Param1 p1) ) { bind(function_to_bind); } // for efficiency, prevent creation of a temporary void operator = (DesiredRetType (*function_to_bind)(Param1 p1) ) { bind(function_to_bind); } inline void bind(DesiredRetType (*function_to_bind)(Param1 p1)) { m_Closure.bindstaticfunc(this, &FastDelegate1::InvokeStaticFunction, function_to_bind); } // Invoke the delegate RetType operator() (Param1 p1) const { return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1); } // Implicit conversion to "bool" using the safe_bool idiom private: typedef struct SafeBoolStruct { int a_data_pointer_to_this_is_0_on_buggy_compilers; StaticFunctionPtr m_nonzero; } UselessTypedef; typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; public: operator unspecified_bool_type() const { return empty()? 0: &SafeBoolStruct::m_nonzero; } // necessary to allow ==0 to work despite the safe_bool idiom inline bool operator==(StaticFunctionPtr funcptr) { return m_Closure.IsEqualToStaticFuncPtr(funcptr); } inline bool operator!=(StaticFunctionPtr funcptr) { return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } inline bool operator ! () const { // Is it bound to anything? return !m_Closure; } inline bool empty() const { return !m_Closure; } void clear() { m_Closure.clear();} // Conversion to and from the DelegateMemento storage class const DelegateMemento & GetMemento() { return m_Closure; } void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } private: // Invoker for static functions RetType InvokeStaticFunction(Param1 p1) const { return (*(m_Closure.GetStaticFunction()))(p1); } }; //N=2 template class FastDelegate2 { private: typedef typename detail::DefaultVoidToVoid::type DesiredRetType; typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2); typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2); typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2); typedef detail::ClosurePtr ClosureType; ClosureType m_Closure; public: // Typedefs to aid generic programming typedef FastDelegate2 type; // Construction and comparison functions FastDelegate2() { clear(); } FastDelegate2(const FastDelegate2 &x) { m_Closure.CopyFrom(this, x.m_Closure); } void operator = (const FastDelegate2 &x) { m_Closure.CopyFrom(this, x.m_Closure); } bool operator ==(const FastDelegate2 &x) const { return m_Closure.IsEqual(x.m_Closure); } bool operator !=(const FastDelegate2 &x) const { return !m_Closure.IsEqual(x.m_Closure); } bool operator <(const FastDelegate2 &x) const { return m_Closure.IsLess(x.m_Closure); } bool operator >(const FastDelegate2 &x) const { return x.m_Closure.IsLess(m_Closure); } // Binding to non-const member functions template < class X, class Y > FastDelegate2(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2) ) { m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } template < class X, class Y > inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2)) { m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } // Binding to const member functions. template < class X, class Y > FastDelegate2(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2) const) { m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } template < class X, class Y > inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2) const) { m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } // Static functions. We convert them into a member function call. // This constructor also provides implicit conversion FastDelegate2(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2) ) { bind(function_to_bind); } // for efficiency, prevent creation of a temporary void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2) ) { bind(function_to_bind); } inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2)) { m_Closure.bindstaticfunc(this, &FastDelegate2::InvokeStaticFunction, function_to_bind); } // Invoke the delegate RetType operator() (Param1 p1, Param2 p2) const { return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2); } // Implicit conversion to "bool" using the safe_bool idiom private: typedef struct SafeBoolStruct { int a_data_pointer_to_this_is_0_on_buggy_compilers; StaticFunctionPtr m_nonzero; } UselessTypedef; typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; public: operator unspecified_bool_type() const { return empty()? 0: &SafeBoolStruct::m_nonzero; } // necessary to allow ==0 to work despite the safe_bool idiom inline bool operator==(StaticFunctionPtr funcptr) { return m_Closure.IsEqualToStaticFuncPtr(funcptr); } inline bool operator!=(StaticFunctionPtr funcptr) { return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } inline bool operator ! () const { // Is it bound to anything? return !m_Closure; } inline bool empty() const { return !m_Closure; } void clear() { m_Closure.clear();} // Conversion to and from the DelegateMemento storage class const DelegateMemento & GetMemento() { return m_Closure; } void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } private: // Invoker for static functions RetType InvokeStaticFunction(Param1 p1, Param2 p2) const { return (*(m_Closure.GetStaticFunction()))(p1, p2); } }; //N=3 template class FastDelegate3 { private: typedef typename detail::DefaultVoidToVoid::type DesiredRetType; typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3); typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3); typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3); typedef detail::ClosurePtr ClosureType; ClosureType m_Closure; public: // Typedefs to aid generic programming typedef FastDelegate3 type; // Construction and comparison functions FastDelegate3() { clear(); } FastDelegate3(const FastDelegate3 &x) { m_Closure.CopyFrom(this, x.m_Closure); } void operator = (const FastDelegate3 &x) { m_Closure.CopyFrom(this, x.m_Closure); } bool operator ==(const FastDelegate3 &x) const { return m_Closure.IsEqual(x.m_Closure); } bool operator !=(const FastDelegate3 &x) const { return !m_Closure.IsEqual(x.m_Closure); } bool operator <(const FastDelegate3 &x) const { return m_Closure.IsLess(x.m_Closure); } bool operator >(const FastDelegate3 &x) const { return x.m_Closure.IsLess(m_Closure); } // Binding to non-const member functions template < class X, class Y > FastDelegate3(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3) ) { m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } template < class X, class Y > inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3)) { m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } // Binding to const member functions. template < class X, class Y > FastDelegate3(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3) const) { m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } template < class X, class Y > inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3) const) { m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } // Static functions. We convert them into a member function call. // This constructor also provides implicit conversion FastDelegate3(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3) ) { bind(function_to_bind); } // for efficiency, prevent creation of a temporary void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3) ) { bind(function_to_bind); } inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3)) { m_Closure.bindstaticfunc(this, &FastDelegate3::InvokeStaticFunction, function_to_bind); } // Invoke the delegate RetType operator() (Param1 p1, Param2 p2, Param3 p3) const { return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3); } // Implicit conversion to "bool" using the safe_bool idiom private: typedef struct SafeBoolStruct { int a_data_pointer_to_this_is_0_on_buggy_compilers; StaticFunctionPtr m_nonzero; } UselessTypedef; typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; public: operator unspecified_bool_type() const { return empty()? 0: &SafeBoolStruct::m_nonzero; } // necessary to allow ==0 to work despite the safe_bool idiom inline bool operator==(StaticFunctionPtr funcptr) { return m_Closure.IsEqualToStaticFuncPtr(funcptr); } inline bool operator!=(StaticFunctionPtr funcptr) { return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } inline bool operator ! () const { // Is it bound to anything? return !m_Closure; } inline bool empty() const { return !m_Closure; } void clear() { m_Closure.clear();} // Conversion to and from the DelegateMemento storage class const DelegateMemento & GetMemento() { return m_Closure; } void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } private: // Invoker for static functions RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3) const { return (*(m_Closure.GetStaticFunction()))(p1, p2, p3); } }; //N=4 template class FastDelegate4 { private: typedef typename detail::DefaultVoidToVoid::type DesiredRetType; typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4); typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4); typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4); typedef detail::ClosurePtr ClosureType; ClosureType m_Closure; public: // Typedefs to aid generic programming typedef FastDelegate4 type; // Construction and comparison functions FastDelegate4() { clear(); } FastDelegate4(const FastDelegate4 &x) { m_Closure.CopyFrom(this, x.m_Closure); } void operator = (const FastDelegate4 &x) { m_Closure.CopyFrom(this, x.m_Closure); } bool operator ==(const FastDelegate4 &x) const { return m_Closure.IsEqual(x.m_Closure); } bool operator !=(const FastDelegate4 &x) const { return !m_Closure.IsEqual(x.m_Closure); } bool operator <(const FastDelegate4 &x) const { return m_Closure.IsLess(x.m_Closure); } bool operator >(const FastDelegate4 &x) const { return x.m_Closure.IsLess(m_Closure); } // Binding to non-const member functions template < class X, class Y > FastDelegate4(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4) ) { m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } template < class X, class Y > inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4)) { m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } // Binding to const member functions. template < class X, class Y > FastDelegate4(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const) { m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } template < class X, class Y > inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const) { m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } // Static functions. We convert them into a member function call. // This constructor also provides implicit conversion FastDelegate4(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4) ) { bind(function_to_bind); } // for efficiency, prevent creation of a temporary void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4) ) { bind(function_to_bind); } inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4)) { m_Closure.bindstaticfunc(this, &FastDelegate4::InvokeStaticFunction, function_to_bind); } // Invoke the delegate RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4) const { return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4); } // Implicit conversion to "bool" using the safe_bool idiom private: typedef struct SafeBoolStruct { int a_data_pointer_to_this_is_0_on_buggy_compilers; StaticFunctionPtr m_nonzero; } UselessTypedef; typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; public: operator unspecified_bool_type() const { return empty()? 0: &SafeBoolStruct::m_nonzero; } // necessary to allow ==0 to work despite the safe_bool idiom inline bool operator==(StaticFunctionPtr funcptr) { return m_Closure.IsEqualToStaticFuncPtr(funcptr); } inline bool operator!=(StaticFunctionPtr funcptr) { return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } inline bool operator ! () const { // Is it bound to anything? return !m_Closure; } inline bool empty() const { return !m_Closure; } void clear() { m_Closure.clear();} // Conversion to and from the DelegateMemento storage class const DelegateMemento & GetMemento() { return m_Closure; } void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } private: // Invoker for static functions RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const { return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4); } }; //N=5 template class FastDelegate5 { private: typedef typename detail::DefaultVoidToVoid::type DesiredRetType; typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5); typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5); typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5); typedef detail::ClosurePtr ClosureType; ClosureType m_Closure; public: // Typedefs to aid generic programming typedef FastDelegate5 type; // Construction and comparison functions FastDelegate5() { clear(); } FastDelegate5(const FastDelegate5 &x) { m_Closure.CopyFrom(this, x.m_Closure); } void operator = (const FastDelegate5 &x) { m_Closure.CopyFrom(this, x.m_Closure); } bool operator ==(const FastDelegate5 &x) const { return m_Closure.IsEqual(x.m_Closure); } bool operator !=(const FastDelegate5 &x) const { return !m_Closure.IsEqual(x.m_Closure); } bool operator <(const FastDelegate5 &x) const { return m_Closure.IsLess(x.m_Closure); } bool operator >(const FastDelegate5 &x) const { return x.m_Closure.IsLess(m_Closure); } // Binding to non-const member functions template < class X, class Y > FastDelegate5(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) ) { m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } template < class X, class Y > inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5)) { m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } // Binding to const member functions. template < class X, class Y > FastDelegate5(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const) { m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } template < class X, class Y > inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const) { m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } // Static functions. We convert them into a member function call. // This constructor also provides implicit conversion FastDelegate5(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) ) { bind(function_to_bind); } // for efficiency, prevent creation of a temporary void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) ) { bind(function_to_bind); } inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5)) { m_Closure.bindstaticfunc(this, &FastDelegate5::InvokeStaticFunction, function_to_bind); } // Invoke the delegate RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const { return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5); } // Implicit conversion to "bool" using the safe_bool idiom private: typedef struct SafeBoolStruct { int a_data_pointer_to_this_is_0_on_buggy_compilers; StaticFunctionPtr m_nonzero; } UselessTypedef; typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; public: operator unspecified_bool_type() const { return empty()? 0: &SafeBoolStruct::m_nonzero; } // necessary to allow ==0 to work despite the safe_bool idiom inline bool operator==(StaticFunctionPtr funcptr) { return m_Closure.IsEqualToStaticFuncPtr(funcptr); } inline bool operator!=(StaticFunctionPtr funcptr) { return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } inline bool operator ! () const { // Is it bound to anything? return !m_Closure; } inline bool empty() const { return !m_Closure; } void clear() { m_Closure.clear();} // Conversion to and from the DelegateMemento storage class const DelegateMemento & GetMemento() { return m_Closure; } void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } private: // Invoker for static functions RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const { return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5); } }; //N=6 template class FastDelegate6 { private: typedef typename detail::DefaultVoidToVoid::type DesiredRetType; typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6); typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6); typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6); typedef detail::ClosurePtr ClosureType; ClosureType m_Closure; public: // Typedefs to aid generic programming typedef FastDelegate6 type; // Construction and comparison functions FastDelegate6() { clear(); } FastDelegate6(const FastDelegate6 &x) { m_Closure.CopyFrom(this, x.m_Closure); } void operator = (const FastDelegate6 &x) { m_Closure.CopyFrom(this, x.m_Closure); } bool operator ==(const FastDelegate6 &x) const { return m_Closure.IsEqual(x.m_Closure); } bool operator !=(const FastDelegate6 &x) const { return !m_Closure.IsEqual(x.m_Closure); } bool operator <(const FastDelegate6 &x) const { return m_Closure.IsLess(x.m_Closure); } bool operator >(const FastDelegate6 &x) const { return x.m_Closure.IsLess(m_Closure); } // Binding to non-const member functions template < class X, class Y > FastDelegate6(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) ) { m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } template < class X, class Y > inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6)) { m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } // Binding to const member functions. template < class X, class Y > FastDelegate6(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const) { m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } template < class X, class Y > inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const) { m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } // Static functions. We convert them into a member function call. // This constructor also provides implicit conversion FastDelegate6(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) ) { bind(function_to_bind); } // for efficiency, prevent creation of a temporary void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) ) { bind(function_to_bind); } inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6)) { m_Closure.bindstaticfunc(this, &FastDelegate6::InvokeStaticFunction, function_to_bind); } // Invoke the delegate RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const { return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6); } // Implicit conversion to "bool" using the safe_bool idiom private: typedef struct SafeBoolStruct { int a_data_pointer_to_this_is_0_on_buggy_compilers; StaticFunctionPtr m_nonzero; } UselessTypedef; typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; public: operator unspecified_bool_type() const { return empty()? 0: &SafeBoolStruct::m_nonzero; } // necessary to allow ==0 to work despite the safe_bool idiom inline bool operator==(StaticFunctionPtr funcptr) { return m_Closure.IsEqualToStaticFuncPtr(funcptr); } inline bool operator!=(StaticFunctionPtr funcptr) { return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } inline bool operator ! () const { // Is it bound to anything? return !m_Closure; } inline bool empty() const { return !m_Closure; } void clear() { m_Closure.clear();} // Conversion to and from the DelegateMemento storage class const DelegateMemento & GetMemento() { return m_Closure; } void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } private: // Invoker for static functions RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const { return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6); } }; //N=7 template class FastDelegate7 { private: typedef typename detail::DefaultVoidToVoid::type DesiredRetType; typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7); typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7); typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7); typedef detail::ClosurePtr ClosureType; ClosureType m_Closure; public: // Typedefs to aid generic programming typedef FastDelegate7 type; // Construction and comparison functions FastDelegate7() { clear(); } FastDelegate7(const FastDelegate7 &x) { m_Closure.CopyFrom(this, x.m_Closure); } void operator = (const FastDelegate7 &x) { m_Closure.CopyFrom(this, x.m_Closure); } bool operator ==(const FastDelegate7 &x) const { return m_Closure.IsEqual(x.m_Closure); } bool operator !=(const FastDelegate7 &x) const { return !m_Closure.IsEqual(x.m_Closure); } bool operator <(const FastDelegate7 &x) const { return m_Closure.IsLess(x.m_Closure); } bool operator >(const FastDelegate7 &x) const { return x.m_Closure.IsLess(m_Closure); } // Binding to non-const member functions template < class X, class Y > FastDelegate7(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) ) { m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } template < class X, class Y > inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7)) { m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } // Binding to const member functions. template < class X, class Y > FastDelegate7(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const) { m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } template < class X, class Y > inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const) { m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } // Static functions. We convert them into a member function call. // This constructor also provides implicit conversion FastDelegate7(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) ) { bind(function_to_bind); } // for efficiency, prevent creation of a temporary void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) ) { bind(function_to_bind); } inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7)) { m_Closure.bindstaticfunc(this, &FastDelegate7::InvokeStaticFunction, function_to_bind); } // Invoke the delegate RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const { return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7); } // Implicit conversion to "bool" using the safe_bool idiom private: typedef struct SafeBoolStruct { int a_data_pointer_to_this_is_0_on_buggy_compilers; StaticFunctionPtr m_nonzero; } UselessTypedef; typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; public: operator unspecified_bool_type() const { return empty()? 0: &SafeBoolStruct::m_nonzero; } // necessary to allow ==0 to work despite the safe_bool idiom inline bool operator==(StaticFunctionPtr funcptr) { return m_Closure.IsEqualToStaticFuncPtr(funcptr); } inline bool operator!=(StaticFunctionPtr funcptr) { return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } inline bool operator ! () const { // Is it bound to anything? return !m_Closure; } inline bool empty() const { return !m_Closure; } void clear() { m_Closure.clear();} // Conversion to and from the DelegateMemento storage class const DelegateMemento & GetMemento() { return m_Closure; } void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } private: // Invoker for static functions RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const { return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7); } }; //N=8 template class FastDelegate8 { private: typedef typename detail::DefaultVoidToVoid::type DesiredRetType; typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8); typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8); typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8); typedef detail::ClosurePtr ClosureType; ClosureType m_Closure; public: // Typedefs to aid generic programming typedef FastDelegate8 type; // Construction and comparison functions FastDelegate8() { clear(); } FastDelegate8(const FastDelegate8 &x) { m_Closure.CopyFrom(this, x.m_Closure); } void operator = (const FastDelegate8 &x) { m_Closure.CopyFrom(this, x.m_Closure); } bool operator ==(const FastDelegate8 &x) const { return m_Closure.IsEqual(x.m_Closure); } bool operator !=(const FastDelegate8 &x) const { return !m_Closure.IsEqual(x.m_Closure); } bool operator <(const FastDelegate8 &x) const { return m_Closure.IsLess(x.m_Closure); } bool operator >(const FastDelegate8 &x) const { return x.m_Closure.IsLess(m_Closure); } // Binding to non-const member functions template < class X, class Y > FastDelegate8(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) ) { m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } template < class X, class Y > inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8)) { m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } // Binding to const member functions. template < class X, class Y > FastDelegate8(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const) { m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } template < class X, class Y > inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const) { m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } // Static functions. We convert them into a member function call. // This constructor also provides implicit conversion FastDelegate8(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) ) { bind(function_to_bind); } // for efficiency, prevent creation of a temporary void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) ) { bind(function_to_bind); } inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8)) { m_Closure.bindstaticfunc(this, &FastDelegate8::InvokeStaticFunction, function_to_bind); } // Invoke the delegate RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const { return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8); } // Implicit conversion to "bool" using the safe_bool idiom private: typedef struct SafeBoolStruct { int a_data_pointer_to_this_is_0_on_buggy_compilers; StaticFunctionPtr m_nonzero; } UselessTypedef; typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; public: operator unspecified_bool_type() const { return empty()? 0: &SafeBoolStruct::m_nonzero; } // necessary to allow ==0 to work despite the safe_bool idiom inline bool operator==(StaticFunctionPtr funcptr) { return m_Closure.IsEqualToStaticFuncPtr(funcptr); } inline bool operator!=(StaticFunctionPtr funcptr) { return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } inline bool operator ! () const { // Is it bound to anything? return !m_Closure; } inline bool empty() const { return !m_Closure; } void clear() { m_Closure.clear();} // Conversion to and from the DelegateMemento storage class const DelegateMemento & GetMemento() { return m_Closure; } void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } private: // Invoker for static functions RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const { return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8); } }; //////////////////////////////////////////////////////////////////////////////// // Fast Delegates, part 4: // // FastDelegate<> class (Original author: Jody Hagins) // Allows boost::function style syntax like: // FastDelegate< double (int, long) > // instead of: // FastDelegate2< int, long, double > // //////////////////////////////////////////////////////////////////////////////// #ifdef FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX // Declare FastDelegate as a class template. It will be specialized // later for all number of arguments. template class FastDelegate; //N=0 // Specialization to allow use of // FastDelegate< R ( ) > // instead of // FastDelegate0 < R > template class FastDelegate< R ( ) > // Inherit from FastDelegate0 so that it can be treated just like a FastDelegate0 : public FastDelegate0 < R > { public: // Make using the base type a bit easier via typedef. typedef FastDelegate0 < R > BaseType; // Allow users access to the specific type of this delegate. typedef FastDelegate SelfType; // Mimic the base class constructors. FastDelegate() : BaseType() { } template < class X, class Y > FastDelegate(Y * pthis, R (X::* function_to_bind)( )) : BaseType(pthis, function_to_bind) { } template < class X, class Y > FastDelegate(const Y *pthis, R (X::* function_to_bind)( ) const) : BaseType(pthis, function_to_bind) { } FastDelegate(R (*function_to_bind)( )) : BaseType(function_to_bind) { } void operator = (const BaseType &x) { *static_cast(this) = x; } }; //N=1 // Specialization to allow use of // FastDelegate< R ( Param1 ) > // instead of // FastDelegate1 < Param1, R > template class FastDelegate< R ( Param1 ) > // Inherit from FastDelegate1 so that it can be treated just like a FastDelegate1 : public FastDelegate1 < Param1, R > { public: // Make using the base type a bit easier via typedef. typedef FastDelegate1 < Param1, R > BaseType; // Allow users access to the specific type of this delegate. typedef FastDelegate SelfType; // Mimic the base class constructors. FastDelegate() : BaseType() { } template < class X, class Y > FastDelegate(Y * pthis, R (X::* function_to_bind)( Param1 p1 )) : BaseType(pthis, function_to_bind) { } template < class X, class Y > FastDelegate(const Y *pthis, R (X::* function_to_bind)( Param1 p1 ) const) : BaseType(pthis, function_to_bind) { } FastDelegate(R (*function_to_bind)( Param1 p1 )) : BaseType(function_to_bind) { } void operator = (const BaseType &x) { *static_cast(this) = x; } }; //N=2 // Specialization to allow use of // FastDelegate< R ( Param1, Param2 ) > // instead of // FastDelegate2 < Param1, Param2, R > template class FastDelegate< R ( Param1, Param2 ) > // Inherit from FastDelegate2 so that it can be treated just like a FastDelegate2 : public FastDelegate2 < Param1, Param2, R > { public: // Make using the base type a bit easier via typedef. typedef FastDelegate2 < Param1, Param2, R > BaseType; // Allow users access to the specific type of this delegate. typedef FastDelegate SelfType; // Mimic the base class constructors. FastDelegate() : BaseType() { } template < class X, class Y > FastDelegate(Y * pthis, R (X::* function_to_bind)( Param1 p1, Param2 p2 )) : BaseType(pthis, function_to_bind) { } template < class X, class Y > FastDelegate(const Y *pthis, R (X::* function_to_bind)( Param1 p1, Param2 p2 ) const) : BaseType(pthis, function_to_bind) { } FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2 )) : BaseType(function_to_bind) { } void operator = (const BaseType &x) { *static_cast(this) = x; } }; //N=3 // Specialization to allow use of // FastDelegate< R ( Param1, Param2, Param3 ) > // instead of // FastDelegate3 < Param1, Param2, Param3, R > template class FastDelegate< R ( Param1, Param2, Param3 ) > // Inherit from FastDelegate3 so that it can be treated just like a FastDelegate3 : public FastDelegate3 < Param1, Param2, Param3, R > { public: // Make using the base type a bit easier via typedef. typedef FastDelegate3 < Param1, Param2, Param3, R > BaseType; // Allow users access to the specific type of this delegate. typedef FastDelegate SelfType; // Mimic the base class constructors. FastDelegate() : BaseType() { } template < class X, class Y > FastDelegate(Y * pthis, R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3 )) : BaseType(pthis, function_to_bind) { } template < class X, class Y > FastDelegate(const Y *pthis, R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3 ) const) : BaseType(pthis, function_to_bind) { } FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3 )) : BaseType(function_to_bind) { } void operator = (const BaseType &x) { *static_cast(this) = x; } }; //N=4 // Specialization to allow use of // FastDelegate< R ( Param1, Param2, Param3, Param4 ) > // instead of // FastDelegate4 < Param1, Param2, Param3, Param4, R > template class FastDelegate< R ( Param1, Param2, Param3, Param4 ) > // Inherit from FastDelegate4 so that it can be treated just like a FastDelegate4 : public FastDelegate4 < Param1, Param2, Param3, Param4, R > { public: // Make using the base type a bit easier via typedef. typedef FastDelegate4 < Param1, Param2, Param3, Param4, R > BaseType; // Allow users access to the specific type of this delegate. typedef FastDelegate SelfType; // Mimic the base class constructors. FastDelegate() : BaseType() { } template < class X, class Y > FastDelegate(Y * pthis, R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4 )) : BaseType(pthis, function_to_bind) { } template < class X, class Y > FastDelegate(const Y *pthis, R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4 ) const) : BaseType(pthis, function_to_bind) { } FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4 )) : BaseType(function_to_bind) { } void operator = (const BaseType &x) { *static_cast(this) = x; } }; //N=5 // Specialization to allow use of // FastDelegate< R ( Param1, Param2, Param3, Param4, Param5 ) > // instead of // FastDelegate5 < Param1, Param2, Param3, Param4, Param5, R > template class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5 ) > // Inherit from FastDelegate5 so that it can be treated just like a FastDelegate5 : public FastDelegate5 < Param1, Param2, Param3, Param4, Param5, R > { public: // Make using the base type a bit easier via typedef. typedef FastDelegate5 < Param1, Param2, Param3, Param4, Param5, R > BaseType; // Allow users access to the specific type of this delegate. typedef FastDelegate SelfType; // Mimic the base class constructors. FastDelegate() : BaseType() { } template < class X, class Y > FastDelegate(Y * pthis, R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5 )) : BaseType(pthis, function_to_bind) { } template < class X, class Y > FastDelegate(const Y *pthis, R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5 ) const) : BaseType(pthis, function_to_bind) { } FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5 )) : BaseType(function_to_bind) { } void operator = (const BaseType &x) { *static_cast(this) = x; } }; //N=6 // Specialization to allow use of // FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6 ) > // instead of // FastDelegate6 < Param1, Param2, Param3, Param4, Param5, Param6, R > template class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6 ) > // Inherit from FastDelegate6 so that it can be treated just like a FastDelegate6 : public FastDelegate6 < Param1, Param2, Param3, Param4, Param5, Param6, R > { public: // Make using the base type a bit easier via typedef. typedef FastDelegate6 < Param1, Param2, Param3, Param4, Param5, Param6, R > BaseType; // Allow users access to the specific type of this delegate. typedef FastDelegate SelfType; // Mimic the base class constructors. FastDelegate() : BaseType() { } template < class X, class Y > FastDelegate(Y * pthis, R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6 )) : BaseType(pthis, function_to_bind) { } template < class X, class Y > FastDelegate(const Y *pthis, R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6 ) const) : BaseType(pthis, function_to_bind) { } FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6 )) : BaseType(function_to_bind) { } void operator = (const BaseType &x) { *static_cast(this) = x; } }; //N=7 // Specialization to allow use of // FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7 ) > // instead of // FastDelegate7 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, R > template class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7 ) > // Inherit from FastDelegate7 so that it can be treated just like a FastDelegate7 : public FastDelegate7 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, R > { public: // Make using the base type a bit easier via typedef. typedef FastDelegate7 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, R > BaseType; // Allow users access to the specific type of this delegate. typedef FastDelegate SelfType; // Mimic the base class constructors. FastDelegate() : BaseType() { } template < class X, class Y > FastDelegate(Y * pthis, R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7 )) : BaseType(pthis, function_to_bind) { } template < class X, class Y > FastDelegate(const Y *pthis, R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7 ) const) : BaseType(pthis, function_to_bind) { } FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7 )) : BaseType(function_to_bind) { } void operator = (const BaseType &x) { *static_cast(this) = x; } }; //N=8 // Specialization to allow use of // FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8 ) > // instead of // FastDelegate8 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, R > template class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8 ) > // Inherit from FastDelegate8 so that it can be treated just like a FastDelegate8 : public FastDelegate8 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, R > { public: // Make using the base type a bit easier via typedef. typedef FastDelegate8 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, R > BaseType; // Allow users access to the specific type of this delegate. typedef FastDelegate SelfType; // Mimic the base class constructors. FastDelegate() : BaseType() { } template < class X, class Y > FastDelegate(Y * pthis, R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8 )) : BaseType(pthis, function_to_bind) { } template < class X, class Y > FastDelegate(const Y *pthis, R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8 ) const) : BaseType(pthis, function_to_bind) { } FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8 )) : BaseType(function_to_bind) { } void operator = (const BaseType &x) { *static_cast(this) = x; } }; #endif //FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX //////////////////////////////////////////////////////////////////////////////// // Fast Delegates, part 5: // // MakeDelegate() helper function // // MakeDelegate(&x, &X::func) returns a fastdelegate of the type // necessary for calling x.func() with the correct number of arguments. // This makes it possible to eliminate many typedefs from user code. // //////////////////////////////////////////////////////////////////////////////// // Also declare overloads of a MakeDelegate() global function to // reduce the need for typedefs. // We need seperate overloads for const and non-const member functions. // Also, because of the weird rule about the class of derived member function pointers, // implicit downcasts may need to be applied later to the 'this' pointer. // That's why two classes (X and Y) appear in the definitions. Y must be implicitly // castable to X. // Workaround for VC6. VC6 needs void return types converted into DefaultVoid. // GCC 3.2 and later won't compile this unless it's preceded by 'typename', // but VC6 doesn't allow 'typename' in this context. // So, I have to use a macro. #ifdef FASTDLGT_VC6 #define FASTDLGT_RETTYPE detail::VoidToDefaultVoid::type #else #define FASTDLGT_RETTYPE RetType #endif //N=0 template FastDelegate0 MakeDelegate(Y* x, RetType (X::*func)()) { return FastDelegate0(x, func); } template FastDelegate0 MakeDelegate(Y* x, RetType (X::*func)() const) { return FastDelegate0(x, func); } //N=1 template FastDelegate1 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1)) { return FastDelegate1(x, func); } template FastDelegate1 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1) const) { return FastDelegate1(x, func); } //N=2 template FastDelegate2 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2)) { return FastDelegate2(x, func); } template FastDelegate2 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2) const) { return FastDelegate2(x, func); } //N=3 template FastDelegate3 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3)) { return FastDelegate3(x, func); } template FastDelegate3 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3) const) { return FastDelegate3(x, func); } //N=4 template FastDelegate4 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4)) { return FastDelegate4(x, func); } template FastDelegate4 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const) { return FastDelegate4(x, func); } //N=5 template FastDelegate5 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5)) { return FastDelegate5(x, func); } template FastDelegate5 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const) { return FastDelegate5(x, func); } //N=6 template FastDelegate6 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6)) { return FastDelegate6(x, func); } template FastDelegate6 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const) { return FastDelegate6(x, func); } //N=7 template FastDelegate7 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7)) { return FastDelegate7(x, func); } template FastDelegate7 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const) { return FastDelegate7(x, func); } //N=8 template FastDelegate8 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8)) { return FastDelegate8(x, func); } template FastDelegate8 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const) { return FastDelegate8(x, func); } // clean up after ourselves... #undef FASTDLGT_RETTYPE } // namespace fastdelegate #endif // !defined(FASTDELEGATE_H) traverso-0.49.4/src/common/Mixer.cpp000755 001750 001750 00000006034 11163362147 017640 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2006 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: Mixer.cpp,v 1.3 2007/11/05 19:19:23 r_sijrier Exp $ */ #include "Mixer.h" #include "defines.h" #include // used for fabs Mixer::compute_peak_t Mixer::compute_peak = 0; Mixer::apply_gain_to_buffer_t Mixer::apply_gain_to_buffer = 0; Mixer::mix_buffers_with_gain_t Mixer::mix_buffers_with_gain = 0; Mixer::mix_buffers_no_gain_t Mixer::mix_buffers_no_gain = 0; float default_compute_peak (const audio_sample_t* buf, nframes_t nsamples, float current) { for (nframes_t i = 0; i < nsamples; ++i) { current = f_max (current, fabsf (buf[i])); } return current; } void default_apply_gain_to_buffer (audio_sample_t* buf, nframes_t nframes, float gain) { for (nframes_t i=0; i float veclib_compute_peak (const audio_sample_t* buf, nframes_t nsamples, float current) { float tmpmax = 0.0f; vDSP_maxmgv(buf, 1, &tmpmax, nsamples); return f_max(current, tmpmax); } void veclib_find_peaks (const audio_sample_t* buf, nframes_t nframes, float *min, float *max) { vDSP_maxv (const_cast(buf), 1, max, nframes); vDSP_minv (const_cast(buf), 1, min, nframes); } void veclib_apply_gain_to_buffer (audio_sample_t * buf, nframes_t nframes, float gain) { vDSP_vsmul(buf, 1, &gain, buf, 1, nframes); } void veclib_mix_buffers_with_gain (audio_sample_t * dst, const audio_sample_t * src, nframes_t nframes, float gain) { vDSP_vsma(src, 1, &gain, dst, 1, dst, 1, nframes); } void veclib_mix_buffers_no_gain (audio_sample_t * dst, const audio_sample_t * src, nframes_t nframes) { // It seems that a vector mult only operation does not exist... float gain = 1.0f; vDSP_vsma(src, 1, &gain, dst, 1, dst, 1, nframes); } #endif traverso-0.49.4/src/common/fpu.h000644 001750 001750 00000002422 11163362147 017005 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Remon Sijrier Copyright (C) 2000-2007 Paul Davis This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef __pbd_fpu_h__ #define __pbd_fpu_h__ class FPU { private: enum Flags { HasFlushToZero = 0x1, HasDenormalsAreZero = 0x2, HasSSE = 0x4, HasSSE2 = 0x8 }; public: FPU (); ~FPU (); bool has_flush_to_zero () const { return _flags & HasFlushToZero; } bool has_denormals_are_zero () const { return _flags & HasDenormalsAreZero; } bool has_sse () const { return _flags & HasSSE; } bool has_sse2 () const { return _flags & HasSSE2; } private: Flags _flags; }; #endif /* __pbd_fpu_h__ */ traverso-0.49.4/src/common/RingBuffer.cpp000755 001750 001750 00000021263 12357214027 020605 0ustar00remonremon000000 000000 /* Copyright (C) 2006 Remon Sijrier Ported to C++ for use in Traverso Copyright (C) 2000 Paul Davis Copyright (C) 2003 Rohan Drape This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ISO/POSIX C version of Paul Davis's lock free ringbuffer C++ code. This is safe for the case of one read thread and one write thread. */ #include #include #include #ifdef USE_MLOCK #ifdef Q_WS_MAC #include #endif /* Q_WS_MAC */ #include #endif /* USE_MLOCK */ #include "RingBuffer.h" // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" /* Create a new ringbuffer to hold at least `sz' bytes of data. The actual buffer size is rounded up to the next power of two. */ RingBuffer::RingBuffer(size_t sz) { int power_of_two; for (power_of_two = 1; 1 << power_of_two < (int)sz; power_of_two++) ; size = 1 << power_of_two; size_mask = size; size_mask -= 1; write_ptr = 0; read_ptr = 0; buf = new char[size]; mlocked = 0; if (mlock_buffer() < 0) { PERROR("Failed to memory lock buffer!"); } } RingBuffer::~RingBuffer() { #ifdef USE_MLOCK if (mlocked) { munlock (buf, size); } #endif /* USE_MLOCK */ delete [] buf; } /* Lock the data block using the system call 'mlock'. */ int RingBuffer::mlock_buffer() { #if defined (USE_MLOCK) if (mlock (buf, size)) { printf("Unable to lock memory\n"); return -1; } mlocked = 1; #endif /* USE_MLOCK */ return 0; } /* Reset the read and write pointers to zero. This is not thread safe. */ void RingBuffer::reset () { read_ptr = 0; write_ptr = 0; } /* Return the number of bytes available for reading. This is the number of bytes in front of the read pointer and behind the write pointer. */ size_t RingBuffer::read_space () { size_t w, r; w = write_ptr; r = read_ptr; if (w > r) { return w - r; } else { return (w - r + size) & size_mask; } } /* Return the number of bytes available for writing. This is the number of bytes in front of the write pointer and behind the read pointer. */ size_t RingBuffer::write_space () { size_t w, r; w = write_ptr; r = read_ptr; if (w > r) { return ((r - w + size) & size_mask) - 1; } else if (w < r) { return (r - w) - 1; } else { return size - 1; } } /* The copying data reader. Copy at most `cnt' bytes to `dest'. Returns the actual number of bytes copied. */ size_t RingBuffer::read (char *dest, size_t cnt) { size_t free_cnt; size_t cnt2; size_t to_read; size_t n1, n2; if ( ( free_cnt = read_space () ) == 0) { return 0; } to_read = cnt > free_cnt ? free_cnt : cnt; cnt2 = read_ptr + to_read; if (cnt2 > size) { n1 = size - read_ptr; n2 = cnt2 & size_mask; } else { n1 = to_read; n2 = 0; } memcpy (dest, &(buf[read_ptr]), n1 * sizeof(char)); read_ptr += n1; read_ptr &= size_mask; if (n2) { memcpy (dest + n1, &(buf[read_ptr]), n2 * sizeof(char)); read_ptr += n2; read_ptr &= size_mask; } return to_read; } /* The copying data reader w/o read pointer advance. Copy at most `cnt' bytes from `dest'. Returns the actual number of bytes copied. */ size_t RingBuffer::peek (char *dest, size_t cnt) { size_t free_cnt; size_t cnt2; size_t to_read; size_t n1, n2; size_t tmp_read_ptr; tmp_read_ptr = read_ptr; if ((free_cnt = read_space ()) == 0) { return 0; } to_read = cnt > free_cnt ? free_cnt : cnt; cnt2 = tmp_read_ptr + to_read; if (cnt2 > size) { n1 = size - tmp_read_ptr; n2 = cnt2 & size_mask; } else { n1 = to_read; n2 = 0; } memcpy (dest, &(buf[tmp_read_ptr]), n1); tmp_read_ptr += n1; tmp_read_ptr &= size_mask; if (n2) { memcpy (dest + n1, &(buf[tmp_read_ptr]), n2); tmp_read_ptr += n2; tmp_read_ptr &= size_mask; } return to_read; } /* The copying data writer. Copy at most `cnt' bytes to `rb' from `src'. Returns the actual number of bytes copied. */ size_t RingBuffer::write (const char *src, size_t cnt) { size_t free_cnt; size_t cnt2; size_t to_write; size_t n1, n2; if ((free_cnt = write_space ()) == 0) { return 0; } to_write = cnt > free_cnt ? free_cnt : cnt; cnt2 = write_ptr + to_write; if (cnt2 > size) { n1 = size - write_ptr; n2 = cnt2 & size_mask; } else { n1 = to_write; n2 = 0; } memcpy (&(buf[write_ptr]), src, n1 * sizeof(char)); write_ptr += n1; write_ptr &= size_mask; if (n2) { memcpy (&(buf[write_ptr]), src + n1, n2 * sizeof(char)); write_ptr += n2; write_ptr &= size_mask; } return to_write; } /* Advance the read pointer `cnt' places. */ void RingBuffer::read_advance (size_t cnt) { read_ptr += cnt; read_ptr &= size_mask; } /* Advance the write pointer `cnt' places. */ void RingBuffer::write_advance (size_t cnt) { write_ptr += cnt; write_ptr &= size_mask; } /* The non-copying data reader. `vec' is an array of two places. Set the values at `vec' to hold the current readable data'. If the readable data is in one segment the second segment has zero length. */ void RingBuffer::get_read_vector (ringbuffer_data_t * vec) { size_t free_cnt; size_t cnt2; size_t w, r; w = write_ptr; r = read_ptr; if (w > r) { free_cnt = w - r; } else { free_cnt = (w - r + size) & size_mask; } cnt2 = r + free_cnt; if (cnt2 > size) { /* Two part vector: the rest of the buffer after the current write ptr, plus some from the start of the buffer. */ vec[0].buf = &(buf[r]); vec[0].len = size - r; vec[1].buf = buf; vec[1].len = cnt2 & size_mask; } else { /* Single part vector: just the rest of the buffer */ vec[0].buf = &(buf[r]); vec[0].len = free_cnt; vec[1].len = 0; } } /* The non-copying data writer. `vec' is an array of two places. Set the values at `vec' to hold the current writeable data. If the writeable data is in one segment the second segment has zero length. */ void RingBuffer::get_write_vector (ringbuffer_data_t * vec) { size_t free_cnt; size_t cnt2; size_t w, r; w = write_ptr; r = read_ptr; if (w > r) { free_cnt = ((r - w + size) & size_mask) - 1; } else if (w < r) { free_cnt = (r - w) - 1; } else { free_cnt = size - 1; } cnt2 = w + free_cnt; if (cnt2 > size) { /* Two part vector: the rest of the buffer after the current write ptr, plus some from the start of the buffer. */ vec[0].buf = &(buf[w]); vec[0].len = size - w; vec[1].buf = buf; vec[1].len = cnt2 & size_mask; } else { vec[0].buf = &(buf[w]); vec[0].len = free_cnt; vec[1].len = 0; } } //eof traverso-0.49.4/src/common/Debugger.h000755 001750 001750 00000025274 11163362147 017754 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2006 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: Debugger.h,v 1.3 2009/02/23 20:12:09 r_sijrier Exp $ */ #ifndef TRAVERSO_DEBUGGER_H #define TRAVERSO_DEBUGGER_H #include #include //Debugging Macros #define CHANGE_COLOR_BLACK printf("%c[0;31m",27) #define CHANGE_COLOR_RED printf("%c[0;31m",27) #define CHANGE_COLOR_GREEN printf("%c[0;32m",27) #define CHANGE_COLOR_ORANGE printf("%c[0;33m",27) #define CHANGE_COLOR_BLUE printf("%c[0;34m",27) #define CHANGE_COLOR_MAGENTA printf("%c[0;35m",27) #define CHANGE_COLOR_CYAN printf("%c[0;36m",27) #define CHANGE_COLOR_WHITE printf("%c[0;37m",27) #define CHANGE_COLOR_YELLOW printf("%c[0;33m",27) #ifdef USE_DEBUGGER class FunctionEnter { const char* m_file; const char* m_function; int lvl; public: FunctionEnter(int level, const char* file, const char* function); ~FunctionEnter(); }; class ConstructorEnter { const char* m_file; const char* m_function; int lvl; public: ConstructorEnter(int level, const char* file, const char* function); ~ConstructorEnter(); }; class DestructorEnter { const char* m_file; const char* m_function; int lvl; public: DestructorEnter(int level, const char* file, const char* function); ~DestructorEnter(); }; #define PMESG(args...) { using namespace TraversoDebugger; if (get_debug_level()>=BASIC) { if (is_logging()) { QString x; x.sprintf(args); QString output = get_tabs() + "[ " + x + " ]\n"; log(output); } else { fill_tabs(); CHANGE_COLOR_MAGENTA; printf("[ "); printf(args); printf(" ]"); CHANGE_COLOR_WHITE; printf("\n"); } } } #define PMESG2(args...) { using namespace TraversoDebugger; if (get_debug_level()>=FLOOD) { if (is_logging()) { QString x; x.sprintf(args); QString output = get_tabs() + "[ " + x + " ]\n"; log(output); } else { fill_tabs(); CHANGE_COLOR_MAGENTA; printf("[ "); printf(args); printf(" ]"); CHANGE_COLOR_WHITE; printf("\n"); } } } #define PMESG3(args...) { using namespace TraversoDebugger; if (get_debug_level()>=SUPER_FLOOD) { if (is_logging()) { QString x; x.sprintf(args); QString output = get_tabs() + "[ " + x + " ]\n"; log(output); } else { fill_tabs(); CHANGE_COLOR_MAGENTA; printf("[ "); printf(args); printf(" ]"); CHANGE_COLOR_WHITE; printf("\n"); } } } #define PMESG4(args...) { using namespace TraversoDebugger; if (get_debug_level()>=ALL) { if (is_logging()) { QString x; x.sprintf(args); QString output = get_tabs() + "[ " + x + " ]\n"; log(output); } else { fill_tabs(); CHANGE_COLOR_MAGENTA; printf("[ "); printf(args); printf(" ]"); CHANGE_COLOR_WHITE; printf("\n"); } } } #define PDEBUG(args...) { using namespace TraversoDebugger; if (is_logging()) { QString x; x.sprintf(args); QString output = "DEBUG : " + QString(__FILE__) + "::" + QString(__FUNCTION__) + ":" + x + "\n"; log(output); } else { CHANGE_COLOR_GREEN; printf("DEBUG : ");printf("%s",__FILE__); printf("::"); printf("%s",__FUNCTION__); printf(":"); printf(args); CHANGE_COLOR_WHITE; printf("\n"); } } #define PERROR(args...) { using namespace TraversoDebugger; if (is_logging()) { QString x; x.sprintf(args); QString output = "\n *** Error in " + QString(__PRETTY_FUNCTION__) + "\n" + x + "\n\n"; } else { printf("\n"); CHANGE_COLOR_RED; printf("*** Error in "); printf("%s",__PRETTY_FUNCTION__); printf("\n"); printf(args); CHANGE_COLOR_WHITE; printf("\n\n"); } } #define PERROR2(args...) { using namespace TraversoDebugger; if (is_logging()) { QString x; x.sprintf(args); QString output = "\n *** Error in " + QString(__PRETTY_FUNCTION__) + "\n" + x + "\n\n"; } else if (get_debug_level()>=FLOOD) { printf("\n"); CHANGE_COLOR_RED; printf("*** Error in "); printf("%s",__PRETTY_FUNCTION__); printf("\n"); printf(args); CHANGE_COLOR_WHITE; printf("\n\n"); } } #define PWARN(args...) { using namespace TraversoDebugger; if (is_logging()) { QString x; x.sprintf(args); QString output = "WARNING: " + x + "\n"; log(output); } else { CHANGE_COLOR_YELLOW; printf("WARNING: "); printf(args); CHANGE_COLOR_WHITE; printf("\n"); } } #define PWARN2(args...) { using namespace TraversoDebugger; if (get_debug_level()>=FLOOD) { if (is_logging()) { QString x; x.sprintf(args); QString output = "WARNING: " + x + "\n"; log(output); } else { CHANGE_COLOR_YELLOW; printf("WARNING: "); printf(args); CHANGE_COLOR_WHITE; printf("\n"); } } } #define PENTER FunctionEnter enter(TraversoDebugger::BASIC, __FILE__, __FUNCTION__) #define PENTER2 FunctionEnter enter(TraversoDebugger::FLOOD, __FILE__, __FUNCTION__) #define PENTER3 FunctionEnter enter(TraversoDebugger::SUPER_FLOOD, __FILE__, __FUNCTION__) #define PENTER4 FunctionEnter enter(TraversoDebugger::ALL, __FILE__, __FUNCTION__) #define PENTERCONS ConstructorEnter enter(TraversoDebugger::BASIC, __FILE__, __FUNCTION__) #define PENTERDES DestructorEnter enter(TraversoDebugger::BASIC, __FILE__, __FUNCTION__) #define PENTERCONS2 ConstructorEnter enter(TraversoDebugger::FLOOD, __FILE__, __FUNCTION__) #define PENTERDES2 DestructorEnter enter(TraversoDebugger::FLOOD, __FILE__, __FUNCTION__) #define PENTERCONS3 ConstructorEnter enter(TraversoDebugger::SUPER_FLOOD, __FILE__, __FUNCTION__) #define PENTERDES3 DestructorEnter enter(TraversoDebugger::SUPER_FLOOD, __FILE__, __FUNCTION__) #define PENTERCONS4 ConstructorEnter enter(TraversoDebugger::ALL, __FILE__, __FUNCTION__) #define PENTERDES4 DestructorEnter enter(TraversoDebugger::ALL, __FILE__, __FUNCTION__) #else #define PMESG(args...) #define PMESG2(args...) #define PMESG3(args...) #define PMESG4(args...) #define PMESG_START(args...) #define PMESG_END(args...) #define PMESG2_START(args...) #define PMESG2_END(args...) #define PDEBUG(args...) #define PERROR(args...) #define PERROR2(args...) #define PWARN(args...) #define PWARN2(args...) #define PMARK(args...) #define PENTER #define PENTER2 #define PENTER3 #define PENTER4 #define PENTERCONS #define PENTERDES #define PENTERCONS2 #define PENTERDES2 #define PENTERCONS3 #define PENTERDES3 #define PENTERCONS4 #define PENTERDES4 #endif /*! TraversoDebugger is a collection of macros that makes easier the job of debugging a Application. PENTER - Outputs a message when entering a method in level 1. Used in the FIRST line of a method; PEXIT - Outputs a message when leaving a method in level 1. Used in the LAST line of a method, except if the last line is a return statement (in this case is put immediately before the return statement PENTER2 - Same as PENTER for levels 1 and 2 PEXIT2 - Same as PEXIT for levels 1 and 2 PENTER3 - Same as PENTER for levels 1 2 and 3 PEXIT3 - Same as PEXIT for levels 1 2 and 3 PENTER4 - Same as PENTER for levels 1 2 3 and 4 PEXIT4 - Same as PEXIT for levels 1 2 3 and 4 PMESG(message) - Outputs a message in level 1 PMESG2(message) - Outputs a message in level 1 and 2 PENTERCONS - Outputs a message when entering a constructor in levels 2, 3, and 4. Similar to PENTER PEXITCONS - Outputs a message when leaving a constructor in levels 2, 3, and 4. Similar to PEXIT PENTERDES - Outputs a message when entering a destructor in levels 2, 3, and 4. Similar to PENTER PEXITDES - Outputs a message when leaving a destructor in levels 2, 3, and 4. Similar to PEXIT Same can be done for PENTERCONS2, PEXITCONS2, PENTERCONS3... and so on... */ namespace TraversoDebugger { static const int OFF = 0; //< no debug output at all static const int BASIC = 1; //< only level 1 calls static const int FLOOD = 2; //< level 1 , level 2 and constructors/destructor calls static const int SUPER_FLOOD = 3; //< all previous plus low level JMB messages static const int ALL = 4; //< all messages (including in timer loops) //! Used internally by TraversoDebugger. Align the output with the level of execution in a given moment void fill_tabs(); //! Used internally by TraversoDebugger. Get a " " (space) sequence whch aligns the output with the level of execution in a given moment, QString get_tabs(); //! Used internally by TraversoDebugger. Increase one level of execution in output messages void more_tabs(); //! Used internally by TraversoDebugger. Decrease one level of execution in output messages void less_tabs(); //! Set the debug level void set_debug_level(int l); //! Used internally by TraversoDebugger. Returns true if debugOn flag is true. int get_debug_level(); //! create a log file "fn" under home dir and enable copy of all debugging messagem to this file. void create_log(QString fn); //! close the log file void close_log(); //! Used internally by TraversoDebugger. Feed the log file. void log(QString msg); //! Used internally to check if output is stdout or a log file bool is_logging(); } #endif // DEBUGGER_H ///:~ //: C02:MemCheck.h // From "Thinking in C++, Volume 2", by Bruce Eckel & Chuck Allison. // (c) 1995-2004 MindView, Inc. All Rights Reserved. // See source code use permissions stated in the file 'License.txt', // distributed with the code package available at www.MindView.net. #ifndef MEMCHECK_H #define MEMCHECK_H #include // For size_t #if defined (USE_MEM_CHECKER) // Usurp the new operator (both scalar and array versions) void* operator new(std::size_t, const char*, long); void* operator new[](std::size_t, const char*, long); #define new new (__FILE__, __LINE__) extern bool traceFlag; #define TRACE_ON() traceFlag = true #define TRACE_OFF() traceFlag = false extern bool activeFlag; #define MEM_ON() activeFlag = true #define MEM_OFF() activeFlag = false #else #define TRACE_OFF() #define TRACE_ON() #define MEM_OFF() #define MEM_ON() #endif // MEMCHECK_H ///:~ #endif //USE_MEM_CHECKER ///:~ traverso-0.49.4/src/common/RingBuffer.h000755 001750 001750 00000015076 11163362147 020260 0ustar00remonremon000000 000000 /* Copyright (C) 2006 Remon Sijrier Ported to C++ for use in Traverso Copyright (C) 2000 Paul Davis Copyright (C) 2003 Rohan Drape This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: RingBuffer.h,v 1.1 2007/10/20 17:38:17 r_sijrier Exp $ */ #ifndef _RINGBUFFER_H #define _RINGBUFFER_H #include #include "defines.h" typedef struct { char *buf; size_t len; } ringbuffer_data_t ; /** * The key attribute of a ringbuffer is that it can be safely accessed * by two threads simultaneously -- one reading from the buffer and * the other writing to it -- without using any synchronization or * mutual exclusion primitives. For this to work correctly, there can * only be a single reader and a single writer thread. Their * identities cannot be interchanged. */ class RingBuffer { public: RingBuffer(size_t size); ~RingBuffer(); /** * Fill a data structure with a description of the current readable * data held in the ringbuffer. This description is returned in a two * element array of ringbuffer_data_t. Two elements are needed * because the data to be read may be split across the end of the * ringbuffer. * * The first element will always contain a valid @a len field, which * may be zero or greater. If the @a len field is non-zero, then data * can be read in a contiguous fashion using the address given in the * corresponding @a buf field. * * If the second element has a non-zero @a len field, then a second * contiguous stretch of data can be read from the address given in * its corresponding @a buf field. * * @param vec a pointer to a 2 element array of ringbuffer_data_t. * */ void get_read_vector(ringbuffer_data_t *vec); /** * Fill a data structure with a description of the current writable * space in the ringbuffer. The description is returned in a two * element array of ringbuffer_data_t. Two elements are needed * because the space available for writing may be split across the end * of the ringbuffer. * * The first element will always contain a valid @a len field, which * may be zero or greater. If the @a len field is non-zero, then data * can be written in a contiguous fashion using the address given in * the corresponding @a buf field. * * If the second element has a non-zero @a len field, then a second * contiguous stretch of data can be written to the address given in * the corresponding @a buf field. * * @param vec a pointer to a 2 element array of ringbuffer_data_t. */ void get_write_vector(ringbuffer_data_t *vec); /** * Read data from the ringbuffer. * * @param dest a pointer to a buffer where data read from the * ringbuffer will go. * @param cnt the number of bytes to read. * * @return the number of bytes read, which may range from 0 to cnt. */ size_t read(char *dest, size_t cnt); /** * Read data from the ringbuffer. Opposed to read() * this function does not move the read pointer. Thus it's * a convenient way to inspect data in the ringbuffer in a * continous fashion. The price is that the data is copied * into a user provided buffer. For "raw" non-copy inspection * of the data in the ringbuffer use get_read_vector(). * * @param dest a pointer to a buffer where data read from the * ringbuffer will go. * @param cnt the number of bytes to read. * * @return the number of bytes read, which may range from 0 to cnt. */ size_t peek(char *dest, size_t cnt); /** * Advance the read pointer. * * After data have been read from the ringbuffer using the pointers * returned by get_read_vector(), use this function to * advance the buffer pointers, making that space available for future * write operations. * * @param cnt the number of bytes read. */ void read_advance(size_t cnt); /** * Return the number of bytes available for reading. * * @return the number of bytes available to read. */ size_t read_space(); /** * Lock a ringbuffer data block into memory. * * Uses the mlock() system call. This is not a realtime operation. */ int mlock_buffer(); /** * Reset the read and write pointers, making an empty buffer. * * This is not thread safe. */ void reset(); /** * Write data into the ringbuffer. * * @param src a pointer to the data to be written to the ringbuffer. * @param cnt the number of bytes to write. * * @return the number of bytes write, which may range from 0 to cnt */ size_t write(const char *src, size_t cnt); /** * Advance the write pointer. * * After data have been written the ringbuffer using the pointers * returned by get_write_vector(), use this function * to advance the buffer pointer, making the data available for future * read operations. * * @param cnt the number of bytes written. */ void write_advance(size_t cnt); /** * Return the number of bytes available for writing. * * @return the amount of free space (in bytes) available for writing. */ size_t write_space(); private: char *buf; volatile size_t write_ptr; volatile size_t read_ptr; size_t size; size_t size_mask; int mlocked; }; #endif traverso-0.49.4/src/common/sse_functions_64bit.S000644 001750 001750 00000027434 11163362147 022072 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2006 Paul Davis, John Rigg This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. Author: Sampo Savolainen 64-bit conversion: John Rigg $Id: sse_functions_64bit.S,v 1.1 2007/11/07 20:28:20 r_sijrier Exp $ */ #; void x86_sse_mix_buffers_with_gain (float *dst, float *src, unsigned int nframes, float gain); .globl x86_sse_mix_buffers_with_gain .type x86_sse_mix_buffers_with_gain,@function x86_sse_mix_buffers_with_gain: #; %rdi float *dst #; %rsi float *src #; %rdx unsigned int nframes #; %xmm0 float gain pushq %rbp movq %rsp, %rbp #; save the registers pushq %rbx pushq %rdi pushq %rsi #; if nframes == 0, go to end cmp $0, %rdx je .MBWG_END #; Check for alignment movq %rdi, %rax andq $12, %rax #; mask alignment offset movq %rsi, %rbx andq $12, %rbx #; mask alignment offset cmp %rax, %rbx jne .MBWG_NONALIGN #; if not aligned, calculate manually #; if we are aligned cmp $0, %rbx jz .MBWG_SSE #; Pre-loop, we need to run 1-3 frames "manually" without #; SSE instructions .MBWG_PRELOOP: #; gain is already in %xmm0 movss (%rsi), %xmm1 mulss %xmm0, %xmm1 addss (%rdi), %xmm1 movss %xmm1, (%rdi) addq $4, %rdi #; dst++ addq $4, %rsi #; src++ decq %rdx #; nframes-- jz .MBWG_END addq $4, %rbx cmp $16, %rbx #; test if we've reached 16 byte alignment jne .MBWG_PRELOOP .MBWG_SSE: cmp $4, %rdx #; we know it's not zero, but if it's not >=4, then jnge .MBWG_NONALIGN #; we jump straight to the "normal" code #; gain is already in %xmm0 shufps $0x00, %xmm0, %xmm0 .MBWG_SSELOOP: movaps (%rsi), %xmm1 #; source => xmm0 mulps %xmm0, %xmm1 #; apply gain to source addps (%rdi), %xmm1 #; mix with destination movaps %xmm1, (%rdi) #; copy result to destination addq $16, %rdi #; dst+=4 addq $16, %rsi #; src+=4 subq $4, %rdx #; nframes-=4 cmp $4, %rdx jge .MBWG_SSELOOP cmp $0, %rdx je .MBWG_END #; if there are remaining frames, the nonalign code will do nicely #; for the rest 1-3 frames. .MBWG_NONALIGN: #; not aligned! #; gain is already in %xmm0 .MBWG_NONALIGNLOOP: movss (%rsi), %xmm1 mulss %xmm0, %xmm1 addss (%rdi), %xmm1 movss %xmm1, (%rdi) addq $4, %rdi addq $4, %rsi decq %rdx jnz .MBWG_NONALIGNLOOP .MBWG_END: popq %rsi popq %rdi popq %rbx #; return leave ret .size x86_sse_mix_buffers_with_gain, .-x86_sse_mix_buffers_with_gain #; void x86_sse_mix_buffers_no_gain (float *dst, float *src, unsigned int nframes); .globl x86_sse_mix_buffers_no_gain .type x86_sse_mix_buffers_no_gain,@function x86_sse_mix_buffers_no_gain: #; %rdi float *dst #; %rsi float *src #; %rdx unsigned int nframes pushq %rbp movq %rsp, %rbp #; save the registers pushq %rbx pushq %rdi pushq %rsi #; the real function #; if nframes == 0, go to end cmp $0, %rdx je .MBNG_END #; Check for alignment movq %rdi, %rax andq $12, %rax #; mask alignment offset movq %rsi, %rbx andq $12, %rbx #; mask alignment offset cmp %rax, %rbx jne .MBNG_NONALIGN #; if not aligned, calculate manually cmp $0, %rbx je .MBNG_SSE #; Pre-loop, we need to run 1-3 frames "manually" without #; SSE instructions .MBNG_PRELOOP: movss (%rsi), %xmm0 addss (%rdi), %xmm0 movss %xmm0, (%rdi) addq $4, %rdi #; dst++ addq $4, %rsi #; src++ decq %rdx #; nframes-- jz .MBNG_END addq $4, %rbx cmp $16, %rbx #; test if we've reached 16 byte alignment jne .MBNG_PRELOOP .MBNG_SSE: cmp $4, %rdx #; if there are frames left, but less than 4 jnge .MBNG_NONALIGN #; we can't run SSE .MBNG_SSELOOP: movaps (%rsi), %xmm0 #; source => xmm0 addps (%rdi), %xmm0 #; mix with destination movaps %xmm0, (%rdi) #; copy result to destination addq $16, %rdi #; dst+=4 addq $16, %rsi #; src+=4 subq $4, %rdx #; nframes-=4 cmp $4, %rdx jge .MBNG_SSELOOP cmp $0, %rdx je .MBNG_END #; if there are remaining frames, the nonalign code will do nicely #; for the rest 1-3 frames. .MBNG_NONALIGN: #; not aligned! movss (%rsi), %xmm0 #; src => xmm0 addss (%rdi), %xmm0 #; xmm0 += dst movss %xmm0, (%rdi) #; xmm0 => dst addq $4, %rdi addq $4, %rsi decq %rdx jnz .MBNG_NONALIGN .MBNG_END: popq %rsi popq %rdi popq %rbx #; return leave ret .size x86_sse_mix_buffers_no_gain, .-x86_sse_mix_buffers_no_gain #; void x86_sse_apply_gain_to_buffer (float *buf, unsigned int nframes, float gain); .globl x86_sse_apply_gain_to_buffer .type x86_sse_apply_gain_to_buffer,@function x86_sse_apply_gain_to_buffer: #; %rdi float *buf 32(%rbp) #; %rsi unsigned int nframes #; %xmm0 float gain #; %xmm1 float buf[0] pushq %rbp movq %rsp, %rbp #; save %rdi pushq %rdi #; the real function #; if nframes == 0, go to end movq %rsi, %rcx #; nframes cmp $0, %rcx je .AG_END #; set up the gain buffer (gain is already in %xmm0) shufps $0x00, %xmm0, %xmm0 #; Check for alignment movq %rdi, %rdx #; buf => %rdx andq $12, %rdx #; mask bits 1 & 2, result = 0, 4, 8 or 12 jz .AG_SSE #; if buffer IS aligned #; PRE-LOOP #; we iterate 1-3 times, doing normal x87 float comparison #; so we reach a 16 byte aligned "buf" (=%rdi) value .AGLP_START: #; Load next value from the buffer into %xmm1 movss (%rdi), %xmm1 mulss %xmm0, %xmm1 movss %xmm1, (%rdi) #; increment buffer, decrement counter addq $4, %rdi #; buf++; decq %rcx #; nframes-- jz .AG_END #; if we run out of frames, we go to the end addq $4, %rdx #; one non-aligned byte less cmp $16, %rdx jne .AGLP_START #; if more non-aligned frames exist, we do a do-over .AG_SSE: #; We have reached the 16 byte aligned "buf" ("rdi") value #; Figure out how many loops we should do movq %rcx, %rax #; copy remaining nframes to %rax for division movq $0, %rdx #; 0 the edx register pushq %rdi movq $4, %rdi divq %rdi #; %rdx = remainder == 0 popq %rdi #; %rax = SSE iterations cmp $0, %rax je .AGPOST_START .AGLP_SSE: movaps (%rdi), %xmm1 mulps %xmm0, %xmm1 movaps %xmm1, (%rdi) addq $16, %rdi subq $4, %rcx #; nframes-=4 decq %rax jnz .AGLP_SSE #; Next we need to post-process all remaining frames #; the remaining frame count is in %rcx #; if no remaining frames, jump to the end cmp $0, %rcx andq $3, %rcx #; nframes % 4 je .AG_END .AGPOST_START: movss (%rdi), %xmm1 mulss %xmm0, %xmm1 movss %xmm1, (%rdi) #; increment buffer, decrement counter addq $4, %rdi #; buf++; decq %rcx #; nframes-- jnz .AGPOST_START #; if we run out of frames, we go to the end .AG_END: popq %rdi #; return leave ret .size x86_sse_apply_gain_to_buffer, .-x86_sse_apply_gain_to_buffer #; end proc #; x86_sse_apply_gain_vector(float *buf, float *gain_vector, unsigned int nframes) .globl x86_sse_apply_gain_vector .type x86_sse_apply_gain_vector,@function x86_sse_apply_gain_vector: #; %rdi float *buf #; %rsi float *gain_vector #; %rdx unsigned int nframes pushq %rbp movq %rsp, %rbp #; Save registers pushq %rdi pushq %rsi pushq %rbx #; if nframes == 0 go to end cmp $0, %rdx je .AGA_END #; Check alignment movq %rdi, %rax andq $12, %rax movq %rsi, %rbx andq $12, %rbx cmp %rax,%rbx jne .AGA_ENDLOOP cmp $0, %rax jz .AGA_SSE #; if buffers are aligned, jump to the SSE loop #; Buffers aren't 16 byte aligned, but they are unaligned by the same amount .AGA_ALIGNLOOP: movss (%rdi), %xmm0 #; buf => xmm0 movss (%rsi), %xmm1 #; gain value => xmm1 mulss %xmm1, %xmm0 #; xmm1 * xmm0 => xmm0 movss %xmm0, (%rdi) #; signal with gain => buf decq %rdx jz .AGA_END addq $4, %rdi #; buf++ addq $4, %rsi #; gab++ addq $4, %rax cmp $16, %rax jne .AGA_ALIGNLOOP #; There are frames left for sure, as that is checked in the beginning #; and within the previous loop. BUT, there might be less than 4 frames #; to process .AGA_SSE: movq %rdx, %rax #; nframes => %rax shr $2, %rax #; unsigned divide by 4 cmp $0, %rax #; Jos toimii ilman t�t�, niin kiva je .AGA_ENDLOOP .AGA_SSELOOP: movaps (%rdi), %xmm0 movaps (%rsi), %xmm1 mulps %xmm1, %xmm0 movaps %xmm0, (%rdi) addq $16, %rdi addq $16, %rsi decq %rax jnz .AGA_SSELOOP andq $3, %rdx #; Remaining frames are nframes & 3 jz .AGA_END #; Inside this loop, we know there are frames left to process #; but because either there are < 4 frames left, or the buffers #; are not aligned, we can't use the parallel SSE ops .AGA_ENDLOOP: movss (%rdi), %xmm0 #; buf => xmm0 movss (%rsi), %xmm1 #; gain value => xmm1 mulss %xmm1, %xmm0 #; xmm1 * xmm0 => xmm0 movss %xmm0, (%rdi) #; signal with gain => buf addq $4,%rdi addq $4,%rsi decq %rdx #; nframes-- jnz .AGA_ENDLOOP .AGA_END: popq %rbx popq %rsi popq %rdi leave ret .size x86_sse_apply_gain_vector, .-x86_sse_apply_gain_vector #; end proc #; float x86_sse_compute_peak(float *buf, long nframes, float current); .globl x86_sse_compute_peak .type x86_sse_compute_peak,@function x86_sse_compute_peak: #; %rdi float *buf 32(%rbp) #; %rsi unsigned int nframes #; %xmm0 float current #; %xmm1 float buf[0] pushq %rbp movq %rsp, %rbp #; save %rdi pushq %rdi #; if nframes == 0, go to end movq %rsi, %rcx #; nframes cmp $0, %rcx je .CP_END #; create the "abs" mask in %xmm2 pushq $2147483647 movss (%rsp), %xmm2 addq $8, %rsp shufps $0x00, %xmm2, %xmm2 #; Check for alignment #;movq 8(%rbp), %rdi #; buf movq %rdi, %rdx #; buf => %rdx andq $12, %rdx #; mask bits 1 & 2, result = 0, 4, 8 or 12 jz .CP_SSE #; if buffer IS aligned #; PRE-LOOP #; we iterate 1-3 times, doing normal x87 float comparison #; so we reach a 16 byte aligned "buf" (=%rdi) value .LP_START: #; Load next value from the buffer movss (%rdi), %xmm1 andps %xmm2, %xmm1 maxss %xmm1, %xmm0 #; increment buffer, decrement counter addq $4, %rdi #; buf++; decq %rcx #; nframes-- jz .CP_END #; if we run out of frames, we go to the end addq $4, %rdx #; one non-aligned byte less cmp $16, %rdx jne .LP_START #; if more non-aligned frames exist, we do a do-over .CP_SSE: #; We have reached the 16 byte aligned "buf" ("rdi") value #; Figure out how many loops we should do movq %rcx, %rax #; copy remaining nframes to %rax for division shr $2,%rax #; unsigned divide by 4 jz .POST_START #; %rax = SSE iterations #; current maximum is at %xmm0, but we need to .. shufps $0x00, %xmm0, %xmm0 #; shuffle "current" to all 4 FP's #;prefetcht0 16(%rdi) .LP_SSE: movaps (%rdi), %xmm1 andps %xmm2, %xmm1 maxps %xmm1, %xmm0 addq $16, %rdi decq %rax jnz .LP_SSE #; Calculate the maximum value contained in the 4 FP's in %xmm0 movaps %xmm0, %xmm1 shufps $0x4e, %xmm1, %xmm1 #; shuffle left & right pairs (1234 => 3412) maxps %xmm1, %xmm0 #; maximums of the two pairs movaps %xmm0, %xmm1 shufps $0xb1, %xmm1, %xmm1 #; shuffle the floats inside the two pairs (1234 => 2143) maxps %xmm1, %xmm0 #; now every float in %xmm0 is the same value, current maximum value #; Next we need to post-process all remaining frames #; the remaining frame count is in %rcx #; if no remaining frames, jump to the end andq $3, %rcx #; nframes % 4 jz .CP_END .POST_START: movss (%rdi), %xmm1 andps %xmm2, %xmm1 maxss %xmm1, %xmm0 addq $4, %rdi #; buf++; decq %rcx #; nframes--; jnz .POST_START .CP_END: popq %rdi #; return leave ret .size x86_sse_compute_peak, .-x86_sse_compute_peak #; end proc #ifdef __ELF__ .section .note.GNU-stack,"",%progbits #endif traverso-0.49.4/src/common/defines.h000644 001750 001750 00000031175 11163362147 017637 0ustar00remonremon000000 000000 #ifndef TRAVERSO_TYPES_H #define TRAVERSO_TYPES_H #include #include #include #include "FastDelegate.h" // Implementation for atomic int get/set from glibc's atomic.h/c // to get rid of the glib dependency! // Arches that need memory bariers: ppc (which we support) // and sparc, alpha, ia64 which we do not support ?? #if defined(__ppc__) || defined(__powerpc__) || defined(__PPC__) # define T_ATOMIC_MEMORY_BARRIER __asm__ ("sync" : : : "memory") static inline int t_atomic_int_get (volatile int *atomic) { T_ATOMIC_MEMORY_BARRIER; return *atomic; } static inline void t_atomic_int_set (volatile int *atomic, int newval) { *atomic = newval; T_ATOMIC_MEMORY_BARRIER; } #else # define t_atomic_int_get(atomic) (*(atomic)) # define t_atomic_int_set(atomic, newval) ((void) (*(atomic) = (newval))) #endif // ENDIF __ppc__ using namespace fastdelegate; /** * Type used to represent sample frame counts. */ typedef uint32_t nframes_t; enum { TransportStopped = 0, TransportRolling = 1, TransportLooping = 2, TransportStarting = 3 }; // Universal samplerate for the frequences 22050, 32000, 44100, 88200, 96000 and 192000 Hz static const qint64 UNIVERSAL_SAMPLE_RATE = 28224000; static const qint64 ONE_HOUR_UNIVERSAL_SAMPLE_RATE = 101606400000LL; static const qint64 ONE_MINUTE_UNIVERSAL_SAMPLE_RATE = 1693440000LL; struct TimeRef { TimeRef() { m_position = 0; } explicit TimeRef(qint64 position) : m_position(position) {} explicit TimeRef(double position) : m_position(qint64(position)) {} TimeRef(nframes_t frame, int rate) { m_position = (UNIVERSAL_SAMPLE_RATE / rate) * frame; } TimeRef(qreal frame, int rate) { m_position = qint64((qreal(UNIVERSAL_SAMPLE_RATE) / rate) * frame); } void add_frames(nframes_t frames, int rate) { m_position += ((UNIVERSAL_SAMPLE_RATE / rate) * frames); } nframes_t to_frame(int rate) { Q_ASSERT(rate); return nframes_t(m_position / (UNIVERSAL_SAMPLE_RATE / rate)); } qint64 universal_frame() const {return m_position;} TimeRef& operator =(const qint64 value) { m_position = value; return *this; } TimeRef& operator =(double value) { m_position = qint64(value); return *this; } friend int operator!=(const TimeRef& left, const TimeRef& right) { return left.m_position != right.m_position; } friend int operator!=(const TimeRef& left, qint64 right) { return left.m_position != right; } friend int operator!=(const TimeRef& left, double right) { return left.m_position != qint64(right); } friend TimeRef operator-(const TimeRef& left, const TimeRef& right) { return TimeRef(left.m_position - right.m_position); } friend TimeRef operator-(const TimeRef& left, qint64 right) { return TimeRef(left.m_position - right); } friend TimeRef operator-(const TimeRef& left, double right) { return TimeRef(left.m_position - qint64(right)); } friend TimeRef& operator-=(TimeRef& left, const TimeRef& right) { left.m_position -= right.m_position; return left; } friend TimeRef& operator-=(TimeRef& left, qint64 right) { left.m_position -= right; return left; } friend TimeRef& operator-=(TimeRef& left, double right) { left.m_position -= qint64(right); return left; } friend TimeRef operator+(const TimeRef& left, const TimeRef& right) { return TimeRef(left.m_position + right.m_position); } friend TimeRef operator+(const TimeRef& left, qint64 right) { return TimeRef(left.m_position + right); } friend TimeRef operator+(const TimeRef& left, double right) { return TimeRef(left.m_position + qint64(right)); } friend TimeRef& operator+=(TimeRef& left, const TimeRef& right) { left.m_position += right.m_position; return left; } friend TimeRef& operator+=(TimeRef& left, qint64 right) { left.m_position += right; return left; } friend TimeRef& operator+=(TimeRef& left, double right) { left.m_position += qint64(right); return left; } friend TimeRef operator/(const TimeRef& left, const TimeRef& right) { Q_ASSERT(right.m_position != 0); return TimeRef(left.m_position / right.m_position); } friend qreal operator/(const TimeRef& left, const qint64 right) { Q_ASSERT(right != 0); return (qreal)left.m_position / right; } friend qreal operator/(const TimeRef& left, double right) { Q_ASSERT(right != 0); return (qreal)left.m_position / qint64(right); } friend TimeRef operator*(const qint64 left, TimeRef& right) { return TimeRef(left * right.m_position); } friend TimeRef operator*(const TimeRef& left, const TimeRef& right) { return TimeRef(left.m_position * right.m_position); } friend TimeRef operator*(const TimeRef& left, double right) { return TimeRef(left.m_position * qint64(right)); } friend int operator<(const TimeRef& left, const TimeRef& right) { return left.m_position < right.m_position; } friend int operator<(const TimeRef& left, qint64 right) { return left.m_position < right; } friend int operator<(const TimeRef& left, double right) { return left.m_position < qint64(right); } friend int operator<(double left, const TimeRef& right) { return (qint64(left) < right.m_position); } friend int operator>(const TimeRef& left, const TimeRef& right) { return left.m_position > right.m_position; } friend int operator>(const TimeRef& left, qint64 right) { return left.m_position > right; } friend int operator>(const TimeRef& left, double right) { return left.m_position > qint64(right); } friend int operator>(double left, const TimeRef& right) { return left > right.m_position; } friend int operator<=(const TimeRef& left, const TimeRef& right) { return left.m_position <= right.m_position; } friend int operator<=(const TimeRef& left, qint64 right) { return left.m_position <= right; } friend int operator<=(const TimeRef& left, double right) { return left.m_position <= qint64(right); } friend int operator>=(const TimeRef& left, const TimeRef& right) { return left.m_position >= right.m_position; } friend int operator>=(const TimeRef& left, qint64 right) { return left.m_position >= right; } friend int operator>=(const TimeRef& left, double right) { return left.m_position >= qint64(right); } friend int operator==(const TimeRef& left, const TimeRef& right) { return left.m_position == right.m_position; } friend int operator==(const TimeRef& left, qint64 right) { return left.m_position == right; } friend int operator==(const TimeRef& left, double right) { return left.m_position == qint64(right); } private: qint64 m_position; }; Q_DECLARE_METATYPE(TimeRef); typedef struct { int tranport; bool isSlave; bool realtime; TimeRef location; } transport_state_t; /** * Type used to represent the value of free running * monotonic clock with units of microseconds. */ typedef double trav_time_t; typedef unsigned long channel_t; typedef float audio_sample_t; // typedef unsigned char peak_data_t; typedef short peak_data_t; typedef FastDelegate1 ProcessCallback; typedef FastDelegate0 RunCycleCallback; typedef FastDelegate1 TransportControlCallback; /** * Used for the type argument of jack_port_register() for default * audio ports. */ #define JACK_DEFAULT_AUDIO_TYPE "32 bit float mono audio" /** * A port has a set of flags that are formed by AND-ing together the * desired values from the list below. The flags "PortIsInput" and * "PortIsOutput" are mutually exclusive and it is an error to use * them both. */ enum PortFlags { /** * if PortIsInput is set, then the port can receive * data. */ PortIsInput = 0x1, /** * if PortIsOutput is set, then data can be read from * the port. */ PortIsOutput = 0x2, /** * if PortIsPhysical is set, then the port corresponds * to some kind of physical I/O connector. */ PortIsPhysical = 0x4, /** * if PortCanMonitor is set, then a call to * jack_port_request_monitor() makes sense. * * Precisely what this means is dependent on the client. A typical * result of it being called with TRUE as the second argument is * that data that would be available from an output port (with * PortIsPhysical set) is sent to a physical output connector * as well, so that it can be heard/seen/whatever. * * Clients that do not control physical interfaces * should never create ports with this bit set. */ PortCanMonitor = 0x8, /** * PortIsTerminal means: * * for an input port: the data received by the port * will not be passed on or made * available at any other port * * for an output port: the data available at the port * does not originate from any other port * * Audio synthesizers, I/O hardware interface clients, HDR * systems are examples of clients that would set this flag for * their ports. */ PortIsTerminal = 0x10 }; #if defined(_MSC_VER) || defined(__MINGW32__) # include #ifndef _TIMEVAL_DEFINED /* also in winsock[2].h */ #define _TIMEVAL_DEFINED struct timeval { long tv_sec; long tv_usec; }; #endif /* _TIMEVAL_DEFINED */ #else # include #endif #if defined(_MSC_VER) || defined(__MINGW32__) #include #ifdef __cplusplus extern "C" { #endif static inline int gettimeofday(struct timeval* tp, void* tzp) { DWORD t; t = timeGetTime(); tp->tv_sec = t / 1000; tp->tv_usec = t % 1000; /* 0 indicates that the call succeeded. */ return 0; } typedef uint8_t u_int8_t; #ifdef __cplusplus } #endif #endif static inline trav_time_t get_microseconds() { struct timeval now; gettimeofday(&now, 0); trav_time_t time = (now.tv_sec * 1000000.0 + now.tv_usec); return time; } #if defined (RELAYTOOL_PRESENT) #define RELAYTOOL_JACK \ extern int libjack_is_present;\ extern int libjack_symbol_is_present(char *s); // since wavpack is not commonly available yet, we link to it statically for now // and set it to available! /*#define RELAYTOOL_WAVPACK \ extern int libwavpack_is_present;\ extern int libwavpack_symbol_is_present(char *s); */ #define RELAYTOOL_WAVPACK \ static const int libwavpack_is_present=1;\ static int __attribute__((unused)) libwavpack_symbol_is_present(char *) { return 1; } #define RELAYTOOL_FLAC \ extern int libFLAC_is_present;\ extern int libFLAC_symbol_is_present(char *s); #define RELAYTOOL_MAD \ extern int libmad_is_present;\ extern int libmad_symbol_is_present(char *s); #define RELAYTOOL_OGG \ extern int libogg_is_present;\ extern int libogg_symbol_is_present(char *s); #define RELAYTOOL_VORBIS \ extern int libvorbis_is_present;\ extern int libvorbis_symbol_is_present(char *s); #define RELAYTOOL_VORBISFILE \ extern int libvorbisfile_is_present;\ extern int libvorbisfile_symbol_is_present(char *s); #define RELAYTOOL_VORBISENC \ extern int libvorbisenc_is_present;\ extern int libvorbisenc_symbol_is_present(char *s); #define RELAYTOOL_MP3LAME \ extern int libmp3lame_is_present;\ extern int libmp3lame_symbol_is_present(char *s); #else #define RELAYTOOL_JACK \ static const int libjack_is_present=1;\ static int __attribute__((unused)) libjack_symbol_is_present(char *) { return 1; } #define RELAYTOOL_WAVPACK \ static const int libwavpack_is_present=1;\ static int __attribute__((unused)) libwavpack_symbol_is_present(char *) { return 1; } #define RELAYTOOL_FLAC \ static const int libFLAC_is_present=1;\ static int __attribute__((unused)) libFLAC_symbol_is_present(char *) { return 1; } #define RELAYTOOL_MAD \ static const int libmad_is_present=1;\ static int __attribute__((unused)) libmad_symbol_is_present(char *) { return 1; } #define RELAYTOOL_OGG \ static const int libogg_is_present=1;\ static int __attribute__((unused)) libogg_symbol_is_present(char *) { return 1; } #define RELAYTOOL_VORBIS \ static const int libvorbis_is_present=1;\ static int __attribute__((unused)) libvorbis_symbol_is_present(char *) { return 1; } #define RELAYTOOL_VORBISFILE \ static const int libvorbisfile_is_present=1;\ static int __attribute__((unused)) libvorbisfile_symbol_is_present(char *) { return 1; } #define RELAYTOOL_VORBISENC \ static const int libvorbisenc_is_present=1;\ static int __attribute__((unused)) libvorbisenc_symbol_is_present(char *) { return 1; } #define RELAYTOOL_MP3LAME \ static const int libmp3lame_is_present=1;\ static int __attribute__((unused)) libmp3lame_symbol_is_present(char *) { return 1; } #endif // endif RELAYTOOL_PRESENT #define PROFILE_START trav_time_t starttime = get_microseconds(); #define PROFILE_END(args...) int processtime = (int) (get_microseconds() - starttime);printf("Process time for %s: %d useconds\n\n", args, processtime); #define DEFAULT_RESAMPLE_QUALITY 2 #endif // endif TRAVERSO_TYPES_H //eof traverso-0.49.4/src/common/fpu.cc000644 001750 001750 00000004315 11163362147 017146 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Remon Sijrier Copyright (C) 2000-2007 Paul Davis This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include #include #include #include FPU::FPU () { unsigned long cpuflags = 0; _flags = Flags (0); #ifndef ARCH_X86 return; #endif #ifndef USE_X86_64_ASM asm volatile ( "mov $1, %%eax\n" "pushl %%ebx\n" "cpuid\n" "movl %%edx, %0\n" "popl %%ebx\n" : "=r" (cpuflags) : : "%eax", "%ecx", "%edx", "memory" ); #else asm volatile ( "pushq %%rbx\n" "movq $1, %%rax\n" "cpuid\n" "movq %%rdx, %0\n" "popq %%rbx\n" : "=r" (cpuflags) : : "%rax", "%rcx", "%rdx", "memory" ); #endif /* USE_X86_64_ASM */ if (cpuflags & (1<<25)) { _flags = Flags (_flags | (HasSSE|HasFlushToZero)); } if (cpuflags & (1<<26)) { _flags = Flags (_flags | HasSSE2); } if (cpuflags & (1 << 24)) { char* fxbuf = 0; char** temp = &fxbuf; #ifdef NO_POSIX_MEMALIGN if ((fxbuf = (char *) malloc(512)) == 0) #else if (posix_memalign ((void**)temp, 16, 512)) #endif { printf("FPU() ERROR: cannot allocate 16 byte aligned buffer for h/w feature detection"); } else { asm volatile ( "fxsave (%0)" : : "r" (fxbuf) : "memory" ); uint32_t mxcsr_mask = *((uint32_t*) &fxbuf[28]); /* if the mask is zero, set its default value (from intel specs) */ if (mxcsr_mask == 0) { mxcsr_mask = 0xffbf; } if (mxcsr_mask & (1<<6)) { _flags = Flags (_flags | HasDenormalsAreZero); } free (fxbuf); } } } FPU::~FPU () { } traverso-0.49.4/src/common/Utils.cpp000755 001750 001750 00000016217 11163362147 017660 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "Utils.h" #include "Mixer.h" #include #include #include #include #include #include #include #include #include TimeRef msms_to_timeref(QString str) { TimeRef out; QStringList lst = str.simplified().split(QRegExp("[;,.:]"), QString::SkipEmptyParts); if (lst.size() >= 1) out += TimeRef(lst.at(0).toInt() * ONE_MINUTE_UNIVERSAL_SAMPLE_RATE); if (lst.size() >= 2) out += TimeRef(lst.at(1).toInt() * UNIVERSAL_SAMPLE_RATE); if (lst.size() >= 3) out += TimeRef(lst.at(2).toInt() * UNIVERSAL_SAMPLE_RATE / 1000); return out; } TimeRef cd_to_timeref(QString str) { TimeRef out; QStringList lst = str.simplified().split(QRegExp("[;,.:]"), QString::SkipEmptyParts); if (lst.size() >= 1) out += TimeRef(lst.at(0).toInt() * ONE_MINUTE_UNIVERSAL_SAMPLE_RATE); if (lst.size() >= 2) out += TimeRef(lst.at(1).toInt() * UNIVERSAL_SAMPLE_RATE); if (lst.size() >= 3) out += TimeRef(lst.at(2).toInt() * UNIVERSAL_SAMPLE_RATE / 75); return out; } TimeRef cd_to_timeref_including_hours(QString str) { TimeRef out; QStringList lst = str.simplified().split(QRegExp("[;,.:]"), QString::SkipEmptyParts); if (lst.size() >= 1) out += TimeRef(lst.at(0).toInt() * ONE_HOUR_UNIVERSAL_SAMPLE_RATE); if (lst.size() >= 2) out += TimeRef(lst.at(1).toInt() * ONE_MINUTE_UNIVERSAL_SAMPLE_RATE); if (lst.size() >= 3) out += TimeRef(lst.at(2).toInt() * UNIVERSAL_SAMPLE_RATE); if (lst.size() >= 4) out += TimeRef(lst.at(3).toInt() * UNIVERSAL_SAMPLE_RATE / 75); return out; } QString coefficient_to_dbstring ( float coeff ) { float db = coefficient_to_dB ( coeff ); QString gainIndB; if ( db < -99 ) gainIndB = "- INF"; else if ( db < 0 ) gainIndB = "- " + QByteArray::number ( ( -1 * db ), 'f', 1 ) + " dB"; else gainIndB = "+ " + QByteArray::number ( db, 'f', 1 ) + " dB"; return gainIndB; } qint64 create_id( ) { int r = rand(); QDateTime time = QDateTime::currentDateTime(); uint timeValue = time.toTime_t(); qint64 id = timeValue; id *= 1000000000; id += r; return id; } QDateTime extract_date_time(qint64 id) { QDateTime time; time.setTime_t(id / 1000000000); return time; } QPixmap find_pixmap ( const QString & pixname ) { QPixmap pixmap; if ( ! QPixmapCache::find ( pixname, pixmap ) ) { pixmap = QPixmap ( pixname ); QPixmapCache::insert ( pixname, pixmap ); } return pixmap; } QString timeref_to_hms(const TimeRef& ref) { qint64 remainder; int hours, mins, secs; qint64 universalframe = ref.universal_frame(); hours = (int) (universalframe / ONE_HOUR_UNIVERSAL_SAMPLE_RATE); remainder = qint64(universalframe - (hours * ONE_HOUR_UNIVERSAL_SAMPLE_RATE)); mins = (int) (remainder / ( ONE_MINUTE_UNIVERSAL_SAMPLE_RATE )); remainder -= mins * ONE_MINUTE_UNIVERSAL_SAMPLE_RATE; secs = (int) (remainder / UNIVERSAL_SAMPLE_RATE); return QString().sprintf("%02d:%02d:%02d", hours, mins, secs); } QString timeref_to_ms(const TimeRef& ref) { qint64 remainder; int mins, secs; qint64 universalframe = ref.universal_frame(); mins = (int) (universalframe / ( ONE_MINUTE_UNIVERSAL_SAMPLE_RATE )); remainder = (long unsigned int) (universalframe - (mins * ONE_MINUTE_UNIVERSAL_SAMPLE_RATE)); secs = (int) (remainder / UNIVERSAL_SAMPLE_RATE); return QString().sprintf("%02d:%02d", mins, secs); } // TimeRef to MM:SS.99 (hundredths) QString timeref_to_ms_2 (const TimeRef& ref) { QString spos; qint64 remainder; int mins, secs, frames; qint64 universalframe = ref.universal_frame(); mins = universalframe / ( ONE_MINUTE_UNIVERSAL_SAMPLE_RATE ); remainder = universalframe - ( mins * ONE_MINUTE_UNIVERSAL_SAMPLE_RATE ); secs = remainder / UNIVERSAL_SAMPLE_RATE; remainder -= secs * UNIVERSAL_SAMPLE_RATE; frames = remainder * 100 / UNIVERSAL_SAMPLE_RATE; spos.sprintf ( " %02d:%02d%c%02d", mins, secs, QLocale::system().decimalPoint().toAscii(), frames ); return spos; } // TimeRef to MM:SS.999 (ms) QString timeref_to_ms_3(const TimeRef& ref) { QString spos; qint64 remainder; int mins, secs, frames; qint64 universalframe = ref.universal_frame(); mins = universalframe / ( ONE_MINUTE_UNIVERSAL_SAMPLE_RATE ); remainder = universalframe - ( mins * ONE_MINUTE_UNIVERSAL_SAMPLE_RATE ); secs = remainder / UNIVERSAL_SAMPLE_RATE; remainder -= secs * UNIVERSAL_SAMPLE_RATE; frames = remainder * 1000 / UNIVERSAL_SAMPLE_RATE; spos.sprintf ( " %02d:%02d%c%03d", mins, secs, QLocale::system().decimalPoint().toAscii(), frames ); return spos; } // Frame to MM:SS:75 (75ths of a second, for CD burning) QString timeref_to_cd (const TimeRef& ref) { QString spos; qint64 remainder; int mins, secs, frames; qint64 universalframe = ref.universal_frame(); mins = universalframe / ( ONE_MINUTE_UNIVERSAL_SAMPLE_RATE ); remainder = universalframe - ( mins * ONE_MINUTE_UNIVERSAL_SAMPLE_RATE ); secs = remainder / UNIVERSAL_SAMPLE_RATE; remainder -= secs * UNIVERSAL_SAMPLE_RATE; frames = remainder * 75 / UNIVERSAL_SAMPLE_RATE; spos.sprintf ( " %02d:%02d:%02d", mins, secs, frames ); return spos; } // Frame to HH:MM:SS,75 (75ths of a second, for CD burning) QString timeref_to_cd_including_hours (const TimeRef& ref) { QString spos; qint64 remainder; int hours, mins, secs, frames; qint64 universalframe = ref.universal_frame(); hours = int(universalframe / ONE_HOUR_UNIVERSAL_SAMPLE_RATE); remainder = qint64(universalframe - (hours * ONE_HOUR_UNIVERSAL_SAMPLE_RATE)); mins = (int) (remainder / ( ONE_MINUTE_UNIVERSAL_SAMPLE_RATE )); remainder -= mins * ONE_MINUTE_UNIVERSAL_SAMPLE_RATE; secs = (int) (remainder / UNIVERSAL_SAMPLE_RATE); remainder -= secs * UNIVERSAL_SAMPLE_RATE; frames = remainder * 75 / UNIVERSAL_SAMPLE_RATE; spos.sprintf("%02d:%02d:%02d,%02d", hours, mins, secs, frames ); return spos; } QString timeref_to_text(const TimeRef & ref, int scalefactor) { if (scalefactor >= 512*640) { return timeref_to_ms_2(ref); } else { return timeref_to_ms_3(ref); } } QStringList find_qm_files() { QDir dir(":/translations"); QStringList fileNames = dir.entryList(QStringList("*.qm"), QDir::Files, QDir::Name); QMutableStringListIterator i(fileNames); while (i.hasNext()) { i.next(); i.setValue(dir.filePath(i.value())); } return fileNames; } QString language_name_from_qm_file(const QString& lang) { QTranslator translator; translator.load(lang); return translator.translate("LanguageName", "English", "The name of this Language, e.g. German would be Deutch"); } traverso-0.49.4/src/common/Resampler.h000644 001750 001750 00000003067 11163362147 020153 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef RESAMPLER_H #define RESAMPLER_H #include "defines.h" #include class Resampler : public QObject { public : Resampler(); ~Resampler(); void set_output_rate(uint rate); void set_input_rate(uint rate); void set_input_buffer(audio_sample_t* buffer); void set_output_buffer(audio_sample_t* buffer); int set_converter_type(int converter_type); int process(nframes_t frames); int prepare_process(nframes_t fileCnt); void reset(); void clear_buffers(); private: SRC_STATE* m_srcState; SRC_DATA m_srcData; audio_sample_t* m_overflowBuffer; audio_sample_t* m_inputBuffer; audio_sample_t* m_outputBuffer; long m_overflowUsed; uint m_outputRate; uint m_inputRate; bool m_isResampleAvailable; nframes_t m_readExtraFrames; nframes_t bufferUsed; nframes_t framesRead; }; #endif traverso-0.49.4/src/precompile.h000644 001750 001750 00000001514 11163362147 017063 0ustar00remonremon000000 000000 #include #include #include // All moc genereated code has this include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "ContextItem.h" #include "ViewItem.h" #include "defines.h" #include "Mixer.h" traverso-0.49.4/src/commands/000755 001750 001750 00000000000 12357214027 016352 5ustar00remonremon000000 000000 traverso-0.49.4/src/commands/TrackPan.h000644 001750 001750 00000003000 11163362147 020220 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2008 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef TRACKPAN_H #define TRACKPAN_H #include "Command.h" class Sheet; class Track; class TrackPan : public Command { Q_OBJECT Q_CLASSINFO("pan_left", tr("To Left")); Q_CLASSINFO("pan_right", tr("To Right")); public : TrackPan(Track* track, QVariantList args); int begin_hold(); int finish_hold(); int prepare_actions(); int do_action(); int undo_action(); void cancel_action(); int jog(); void set_cursor_shape(int useX, int useY); private : struct Data { QPoint mousePos; int origX; }; Data* d; float m_origPan; float m_newPan; Track* m_track; public slots: void pan_left(bool autorepeat); void pan_right(bool autorepeat); }; #endif traverso-0.49.4/src/commands/ArmTracks.cpp000644 001750 001750 00000003421 11163362147 020746 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: ArmTracks.cpp,v 1.4 2008/01/21 16:22:11 r_sijrier Exp $ */ #include "ArmTracks.h" #include #include #include #include #include // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" ArmTracks::ArmTracks(SheetView* view) : Command(view->get_sheet(), tr("Arm Tracks")) , m_sv(view) { } ArmTracks::~ArmTracks() {} int ArmTracks::prepare_actions() { return -1; } int ArmTracks::begin_hold() { m_sv->start_shuttle(true, true); return 1; } int ArmTracks::finish_hold() { m_sv->start_shuttle(false); return 1; } int ArmTracks::do_action() { return 1; } int ArmTracks::undo_action() { return 1; } int ArmTracks::jog() { TrackView* view = m_sv->get_trackview_under(cpointer().scene_pos()); if ( ! view ) { return 0; } Track* track = view->get_track(); if (! m_tracks.contains(track) ) { m_tracks.append(track); track->arm(); } m_sv->update_shuttle_factor(); return 1; } // eof traverso-0.49.4/src/commands/AddRemove.cpp000644 001750 001750 00000017314 11163362147 020733 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2006 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: AddRemove.cpp,v 1.6 2008/11/24 10:12:19 r_sijrier Exp $ */ #include "AddRemove.h" #include "ContextItem.h" #include // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" /** \class AddRemove * \brief Historably add/remove objects into the audio processing path without using locks AddRemove is a flexible class that let's you insert/remove objects into the audio
processing execution path without using locks.
It can also be used with objects that aren't in the audio processing chain, and don't
need the thread safety. Use set_instantanious() to let the created AddRemove object
know that it can bypass the thread save logic, and call the add/remove functions directly. The example below is typical how this Command class should be used. One for example creates the function (slot) Command* add_track() in SheetView. and add
an entry in the keymap file to define which keyfact will be used to call this function.
One also can create a CommandPlugin, and point the keyfact in the keymap file to the
plugin name, this way you don't need to add a function (slot) to the SheetView class. When using the first approach, you create a new Track object in the GUI object SheetView
and return the Command object returned by m_sheet->add_track(track);, see example code below. Using a CommandPlugin for this kind of action doesn't make much sense, you most likely
want to use plugins to manipulate existing objects. \code class Sheet : public ContextItem { Q_OBJECT Sheet() {}; ~Sheet() {}; private: list m_tracks; public slots: Command* add_track(Track* track); Command* remove_track(Track* track); private slots: void private_add_track(Track*); void private_remove_track(Track*); } Command* Sheet::add_track(Track* track) { // first this: The object to which the track has to be added/removed too // track: the argument that will be used by the signal/slots as specified in the second and third line. // true: this command should be considered historable // this: A pointer to Sheet, which in this case is this, which will be used in the AddRemove // Command logic to detect if the private_add/remove slots can be called directly or // thread save via Tsar's thread save logic. // tr("Add Track") The (tranlated) description of this action as it will show up in the HistoryView return new AddRemove(this, track, true, this, "private_add_track(Track*)", "trackAdded(Track*)", "private_remove_track(Track*)", "trackRemoved(Track*)", tr("Add Track")); } Command* Sheet::remove_track(Track* track) { // Same applies as in add_track(), however, the second and third line are switched :-) return new AddRemove(this, track, true, this, "private_remove_track(Track*)", "trackRemoved(Track*)", "private_add_track(Track*)", "trackAdded(Track*)", tr("Remove Track")); } void Sheet::private_add_track(Track* track) { m_tracks.append(track); } void Sheet::private_remove_track(Track* track) { m_tracks.removeAll(track); } // Example usage in a GUI object. Command* SheetView::add_track() { Track* track = new Track(m_sheet); return m_sheet->add_track(track); } \endcode */ AddRemove::AddRemove(ContextItem* parent, void* arg, const QString& des) : Command(parent, des), m_sheet(0), m_doActionSlot(""), m_undoActionSlot(""), m_doSignal(""), m_undoSignal(""), m_instantanious(0) { m_parentItem = parent; m_arg = arg; m_doActionEvent.valid = false; m_undoActionEvent.valid = false; } /** * Constructor with all the paramaters needed for proper operation. * * @param parent The object (which need to inherit ContextItem) where the arg will be added or removed. * @param arg The object that will be added/removed * @param historable Makes the command historable if set to true, else it will be deleted after the do_action call. Only works when the command was requested from the InputEngine. If not, you are responsible yourself to call the do_action, and pushing it to the correct history stack. * @param sheet If a related Sheet object is available you can use it, else supply a 0 * @param doActionSlot (private) slot signature which will be called on do_action() * @param doSignal If supplied, the signal with this signature will be emited in the GUI thread AFTER the actuall adding/removing action in do_action() has happened! * @param undoActionSlot (private) slot signature which will be called in undo_action(); * @param undoSignal If supplied, the signal with this signature will be emited in the GUI thread AFTER the actuall adding/removing in undo_action has happened! * @param des Short description that will show up in the history view. */ AddRemove::AddRemove( ContextItem* parent, void* arg, bool historable, Sheet* sheet, const char * doActionSlot, const char * doSignal, const char * undoActionSlot, const char * undoSignal, const QString& des) : Command(parent, des), m_parentItem(parent), m_arg(arg), m_sheet(sheet), m_doActionSlot(doActionSlot), m_undoActionSlot(undoActionSlot), m_doSignal(doSignal), m_undoSignal(undoSignal), m_instantanious(0) { m_isHistorable = historable; } AddRemove::~AddRemove() {} int AddRemove::prepare_actions() { Q_ASSERT(m_parentItem); Q_ASSERT(m_arg); Q_ASSERT(m_doActionSlot != QString("")); Q_ASSERT(m_undoActionSlot != QString("")); m_doActionEvent = tsar().create_event(m_parentItem, m_arg, m_doActionSlot, m_doSignal); m_undoActionEvent = tsar().create_event(m_parentItem, m_arg, m_undoActionSlot, m_undoSignal); return 1; } int AddRemove::do_action() { PENTER3; if ( ! m_doActionEvent.valid ) { PWARN("No do action defined for this Command"); return -1; } if (m_instantanious) { tsar().process_event_slot_signal(m_doActionEvent); return 1; } if (m_sheet) { if (m_sheet->is_transport_rolling()) { PMESG("Using Thread Save add/remove"); tsar().add_event(m_doActionEvent); } else { tsar().process_event_slot_signal(m_doActionEvent); } } else { tsar().add_event(m_doActionEvent); } return 1; } int AddRemove::undo_action() { PENTER3; if ( ! m_undoActionEvent.valid ) { PWARN("No undo action defined for this Command"); return -1; } if (m_instantanious) { tsar().process_event_slot_signal(m_undoActionEvent); return 1; } if (m_sheet) { if (m_sheet->is_transport_rolling()) { PMESG("Using Thread Save add/remove"); tsar().add_event(m_undoActionEvent); } else { tsar().process_event_slot_signal(m_undoActionEvent); } } else { PMESG("Using direct add/remove/signaling"); tsar().add_event(m_undoActionEvent); } return 1; } /** * Set's the command as instantanious The do/undo actions will call the slot and emit the signal (if they exist) directly, and thus bypassing the RT thread save nature of Tsar. */ void AddRemove::set_instantanious(bool instant) { m_instantanious = instant; } // eof traverso-0.49.4/src/commands/AudioClipExternalProcessing.cpp000644 001750 001750 00000004053 11163362147 024472 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "AudioClipExternalProcessing.h" #include "ExternalProcessingDialog.h" #include #include #include #include #include #include #include #include #include #include "Interface.h" // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" AudioClipExternalProcessing::AudioClipExternalProcessing(AudioClip* clip) : Command(clip, tr("Clip: External Processing")) { m_clip = clip; m_resultingclip = 0; m_track = m_clip->get_track(); } AudioClipExternalProcessing::~AudioClipExternalProcessing() {} int AudioClipExternalProcessing::prepare_actions() { PENTER; ExternalProcessingDialog epdialog(Interface::instance(), this); epdialog.exec(); if (! m_resultingclip) { return -1; } return 1; } int AudioClipExternalProcessing::do_action() { PENTER; Command::process_command(m_track->remove_clip(m_clip, false)); Command::process_command(m_track->add_clip(m_resultingclip, false)); return 1; } int AudioClipExternalProcessing::undo_action() { PENTER; Command::process_command(m_track->remove_clip(m_resultingclip, false)); Command::process_command(m_track->add_clip(m_clip, false)); return 1; } traverso-0.49.4/src/commands/CMakeLists.txt000644 001750 001750 00000002455 11427546420 021122 0ustar00remonremon000000 000000 ADD_SUBDIRECTORY(plugins) INCLUDE_DIRECTORIES( ${CMAKE_SOURCE_DIR}/src/commands ${CMAKE_SOURCE_DIR}/src/common ${CMAKE_SOURCE_DIR}/src/core ${CMAKE_SOURCE_DIR}/src/traverso ${CMAKE_SOURCE_DIR}/src/sheetcanvas ${CMAKE_SOURCE_DIR}/src/plugins ${CMAKE_SOURCE_DIR}/src/plugins/native ${QT_QTGUI_INCLUDE_DIR} ${QT_QTXML_INCLUDE_DIR} ) SET(TRAVERSO_COMMANDS_SOURCES AudioClipExternalProcessing.cpp AddRemove.cpp ClipSelection.cpp CommandGroup.cpp Crop.cpp ExternalProcessingDialog.cpp Fade.cpp Gain.cpp Import.cpp MoveClip.cpp MoveEdge.cpp PCommand.cpp SplitClip.cpp TrackPan.cpp Zoom.cpp Scroll.cpp ArmTracks.cpp PlayHeadMove.cpp WorkCursorMove.cpp RemoveClip.cpp ) SET(TRAVERSO_COMMANDS_MOC_CLASSES Crop.h ExternalProcessingDialog.h Gain.h MoveClip.h TrackPan.h Zoom.h ) SET(TRAVERSO_COMMANDS_UI_FILES ui/ExternalProcessingDialog.ui ) QT4_WRAP_CPP(TRAVERSO_COMMANDS_MOC_SOURCES ${TRAVERSO_COMMANDS_MOC_CLASSES}) QT4_WRAP_UI(TRAVERSO_COMMANDS_UI_SOURCES ${TRAVERSO_COMMANDS_UI_FILES}) SET(TRAVERSO_COMMANDS_LIBRARY "traversocommands") ADD_LIBRARY(${TRAVERSO_COMMANDS_LIBRARY} STATIC ${TRAVERSO_COMMANDS_SOURCES} ${TRAVERSO_COMMANDS_UI_SOURCES} ${TRAVERSO_COMMANDS_MOC_SOURCES}) TARGET_LINK_LIBRARIES(traversocommands traversocore ) IF(USE_PCH) ADD_DEPENDENCIES(traversocommands precompiled_headers) ENDIF(USE_PCH) traverso-0.49.4/src/commands/ExternalProcessingDialog.cpp000644 001750 001750 00000017447 11163362147 024033 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "ExternalProcessingDialog.h" #include "AudioClipExternalProcessing.h" #include #include #include #include #include #include #include #include #include #include "Interface.h" #include #include // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" ExternalProcessingDialog::ExternalProcessingDialog(QWidget * parent, AudioClipExternalProcessing* acep) : QDialog(parent) { setupUi(this); m_acep = acep; m_queryOptions = false; m_processor = new QProcess(this); m_processor->setProcessChannelMode(QProcess::MergedChannels); m_completer = 0; command_lineedit_text_changed("sox"); connect(m_processor, SIGNAL(readyReadStandardOutput()), this, SLOT(read_standard_output())); connect(m_processor, SIGNAL(started()), this, SLOT(process_started())); connect(m_processor, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(process_finished(int, QProcess::ExitStatus))); connect(m_processor, SIGNAL(error( QProcess::ProcessError)), this, SLOT(process_error(QProcess::ProcessError))); connect(argsComboBox, SIGNAL(activated(const QString&)), this, SLOT(arg_combo_index_changed(const QString&))); connect(programLineEdit, SIGNAL(textChanged(const QString&)), this, SLOT(command_lineedit_text_changed(const QString&))); connect(startButton, SIGNAL(clicked()), this, SLOT(prepare_for_external_processing())); connect(cancelButton, SIGNAL(clicked()), this, SLOT(reject())); } ExternalProcessingDialog::~ ExternalProcessingDialog() { delete m_processor; } void ExternalProcessingDialog::prepare_for_external_processing() { m_commandargs = argumentsLineEdit->text(); if (m_commandargs.isEmpty()) { statusText->setText(tr("You have to supply an argument before starting the external process!")); return; } ReadSource* rs = resources_manager()->get_readsource(m_acep->m_clip->get_readsource_id()); //This should NOT be possible, but just in case.... if (! rs) { printf("ExternalProcessing:: resources manager did NOT return a resource for the to be processed audioclip (%lld) !!!!\n", m_acep->m_clip->get_id()); return; } m_filename = rs->get_name(); m_newClipName= rs->get_short_name().remove(".wav") + "-" + m_commandargs.simplified(); m_infilename = rs->get_filename(); // remove the extension and any dots that might confuse the external program, append the // new name and again the extension. m_outfilename = pm().get_project()->get_audiosources_dir() + m_filename.remove(".wav").remove(".").append("-").append(m_commandargs.simplified()).append(".wav"); start_external_processing(); } void ExternalProcessingDialog::start_external_processing() { m_arguments.clear(); // On mac os x (and perhaps windows) the full path is given, so we check if the path contains sox! if (m_program.contains("sox")) { m_arguments.append("-S"); } m_arguments.append(m_infilename); m_arguments.append(m_outfilename); m_arguments += m_commandargs.split(QRegExp("\\s+")); m_processor->start(m_program, m_arguments); } void ExternalProcessingDialog::read_standard_output() { if (m_queryOptions) { QString result = m_processor->readAllStandardOutput(); // This list is used to collect the availabe arguments for the // arugment lineedit completer. QStringList completionlist; // On mac os x (and perhaps windows) the full path is given, so we check if the path contains sox! if (m_program.contains("sox")) { QStringList list = result.split("\n"); foreach(QString string, list) { if (string.contains("Supported effects:") || string.contains("effect:") || string.contains("SUPPORTED EFFECTS:")) { result = string.remove("Supported effects:").remove("effect:").remove("SUPPORTED EFFECTS:"); QStringList options = string.split(QRegExp("\\s+")); foreach(QString string, options) { if (!string.isEmpty()) { argsComboBox->addItem(string); completionlist << string; } } } } } // If there was allready a completer, delete it. if (m_completer) { delete m_completer; } // Set the completer for the arguments line edit. m_completer = new QCompleter(completionlist, this); argumentsLineEdit->setCompleter(m_completer); return; } QString result = m_processor->readAllStandardOutput(); if (result.contains("%")) { QStringList tokens = result.split(QRegExp("\\s+")); foreach(QString token, tokens) { if (token.contains("%")) { token = token.remove("%").remove("(").remove(")"); bool ok; int number = (int)token.toDouble(&ok); if (ok && number > progressBar->value()) { progressBar->setValue(number); } return; } } } statusText->append(result); } void ExternalProcessingDialog::process_started() { statusText->clear(); } void ExternalProcessingDialog::process_finished(int exitcode, QProcess::ExitStatus exitstatus) { Q_UNUSED(exitcode); Q_UNUSED(exitstatus); if (m_queryOptions) { m_queryOptions = false; return; } if (exitstatus == QProcess::CrashExit) { statusText->setHtml(tr("Program %1 crashed!").arg(m_program)); return; } QString dir = pm().get_project()->get_audiosources_dir(); // In case we used the merger, remove the file... QFile::remove(dir + "/merged.wav"); QString result = m_processor->readAllStandardOutput(); // print anything on command line we didn't catch printf("output: \n %s", QS_C(result)); ReadSource* source = resources_manager()->import_source(dir, m_filename); if (!source) { printf("ResourcesManager didn't return a ReadSource, most likely sox didn't understand your command\n"); return rejected(); } m_acep->m_resultingclip = resources_manager()->new_audio_clip(m_newClipName); resources_manager()->set_source_for_clip(m_acep->m_resultingclip, source); // Clips live at project level, we have to set its Sheet, Track and ReadSource explicitely!! m_acep->m_resultingclip->set_sheet(m_acep->m_clip->get_sheet()); m_acep->m_resultingclip->set_track(m_acep->m_clip->get_track()); m_acep->m_resultingclip->set_track_start_location(m_acep->m_clip->get_track_start_location()); close(); } void ExternalProcessingDialog::query_options() { m_queryOptions = true; argsComboBox->clear(); m_processor->start(m_program, QStringList() << "-h"); } void ExternalProcessingDialog::arg_combo_index_changed(const QString & text) { argumentsLineEdit->setText(text); } void ExternalProcessingDialog::command_lineedit_text_changed(const QString & text) { m_program = text.simplified(); if (m_program == "sox") { #if defined (Q_WS_MAC) m_program = qApp->applicationDirPath() + "/sox"; #endif query_options(); argsComboBox->show(); argsComboBox->setToolTip(tr("Available arguments for the sox program")); return; } argsComboBox->hide(); } void ExternalProcessingDialog::process_error(QProcess::ProcessError error) { if (error == QProcess::FailedToStart) { statusText->setHtml(tr("Program %1 not installed, or insufficient permissions to run!").arg(m_program)); } } traverso-0.49.4/src/commands/WorkCursorMove.cpp000644 001750 001750 00000004731 11163362147 022033 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "WorkCursorMove.h" #include #include #include #include WorkCursorMove::WorkCursorMove(PlayHead* cursor, SheetView* sv) : Command("Play Cursor Move") , m_sheet(sv->get_sheet()) , m_sv(sv) , m_playCursor(cursor) { } int WorkCursorMove::finish_hold() { int x = cpointer().scene_x(); if (x < 0) { x = 0; } m_sheet->get_work_snap()->set_snappable(true); m_sv->start_shuttle(false); return -1; } int WorkCursorMove::begin_hold() { if (m_sheet->is_transport_rolling()) { m_playCursor->disable_follow(); } m_sheet->get_work_snap()->set_snappable(false); m_sv->start_shuttle(true, true); m_origPos = m_sheet->get_work_location(); return 1; } void WorkCursorMove::cancel_action() { m_sv->start_shuttle(false); m_sheet->set_work_at(m_origPos); } void WorkCursorMove::set_cursor_shape(int useX, int useY) { Q_UNUSED(useX); Q_UNUSED(useY); cpointer().get_viewport()->set_holdcursor(":/cursorHoldLr"); } int WorkCursorMove::jog() { int x = cpointer().scene_x(); if (x < 0) { x = 0; } TimeRef newLocation(x * m_sv->timeref_scalefactor); if (m_sheet->is_snap_on()) { SnapList* slist = m_sheet->get_snap_list(); newLocation = slist->get_snap_value(newLocation); } m_sheet->set_work_at(newLocation); m_sv->update_shuttle_factor(); cpointer().get_viewport()->set_holdcursor_text(timeref_to_text(newLocation, m_sv->timeref_scalefactor)); // Hmm, the alignment of the holdcursor isn't in the center, so we have to // substract half the width of it to make it appear centered... :-( cpointer().get_viewport()->set_holdcursor_pos(QPoint(cpointer().scene_x() - 16, cpointer().scene_y() - 16)); return 1; } traverso-0.49.4/src/commands/Zoom.h000644 001750 001750 00000003447 11163362147 017460 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2006 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: Zoom.h,v 1.7 2008/01/22 20:47:16 r_sijrier Exp $ */ #ifndef ZOOM_H #define ZOOM_H #include "Command.h" class SheetView; class QPoint; class Zoom : public Command { Q_OBJECT Q_CLASSINFO("vzoom_in", tr("Zoom Vertical In")); Q_CLASSINFO("vzoom_out", tr("Zoom Vertical Out")); Q_CLASSINFO("toggle_vertical_horizontal_jog_zoom", tr("Toggle Vertical / Horizontal")); public : Zoom(SheetView* sv, QVariantList args); ~Zoom() {}; int begin_hold(); int finish_hold(); int prepare_actions(); int do_action(); int undo_action(); int jog(); void set_cursor_shape(int useX, int useY); private : int horizontalJogZoomLastX; int verticalJogZoomLastY; bool m_jogVertical; bool m_jogHorizontal; qreal m_xScalefactor; qreal m_yScalefactor; QPoint mousePos; QPoint origPos; SheetView* m_sv; public slots: void vzoom_in(bool autorepeat); void vzoom_out(bool autorepeat); void toggle_vertical_horizontal_jog_zoom(bool autorepeat); }; #endif traverso-0.49.4/src/commands/ArmTracks.h000644 001750 001750 00000002245 11163362147 020416 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef ARM_TRACKS_H #define ARM_TRACKS_H #include "Command.h" #include class SheetView; class Track; class ArmTracks : public Command { public : ArmTracks(SheetView* view); ~ArmTracks(); int begin_hold(); int finish_hold(); int prepare_actions(); int do_action(); int undo_action(); int jog(); private: SheetView* m_sv; QList m_tracks; }; #endif traverso-0.49.4/src/commands/precompile.h000644 001750 001750 00000000336 11163362147 020665 0ustar00remonremon000000 000000 #include #include // All moc genereated code has this include #include #include #include #include #include #include traverso-0.49.4/src/commands/SplitClip.h000644 001750 001750 00000002757 11163362147 020442 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef SPLITCLIPACTION_H #define SPLITCLIPACTION_H #include "Command.h" #include "defines.h" class AudioClip; class Track; class SheetView; class AudioClipView; class LineView; class SplitClip : public Command { public : SplitClip(AudioClipView* view); ~SplitClip() {}; int prepare_actions(); int do_action(); int undo_action(); int begin_hold(); int finish_hold(); void cancel_action(); void set_cursor_shape(int useX, int useY); int jog(); private : SheetView* m_sv; AudioClipView* m_cv; Track* m_track; AudioClip* m_clip; AudioClip* leftClip; AudioClip* rightClip; TimeRef m_splitPoint; LineView* m_splitcursor; }; #endif traverso-0.49.4/src/commands/Gain.h000644 001750 001750 00000003466 11163362147 017413 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2006 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: Gain.h,v 1.15 2008/02/12 20:39:08 r_sijrier Exp $ */ #ifndef GAIN_H #define GAIN_H #include "Command.h" #include class ContextItem; class SheetView; class Gain : public Command { Q_OBJECT Q_CLASSINFO("increase_gain", tr("Increase")); Q_CLASSINFO("decrease_gain", tr("Decrease")); public : Gain(ContextItem* context, SheetView* sv, QVariantList args); ~Gain(); int begin_hold(); int finish_hold(); int prepare_actions(); int do_action(); int undo_action(); void cancel_action(); void set_collected_number(const QString & collected); int jog(); void set_cursor_shape(int useX, int useY); private : ContextItem* gainObject; SheetView* m_sv; float origGain; float newGain; QPoint origPos; QPoint mousePos; bool horiz; int get_gain_from_object(float& gain); public slots: void increase_gain(bool autorepeat); void decrease_gain(bool autorepeat); }; #endif traverso-0.49.4/src/commands/WorkCursorMove.h000644 001750 001750 00000002417 11163362147 021477 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef WORKCURSOR_MOVE_H #define WORKCURSOR_MOVE_H #include #include class Sheet; class SheetView; class PlayHead; class WorkCursorMove : public Command { public : WorkCursorMove (PlayHead* cursor, SheetView* sv); ~WorkCursorMove (){}; int finish_hold(); int begin_hold(); void cancel_action(); int jog(); void set_cursor_shape(int useX, int useY); private : Sheet* m_sheet; SheetView* m_sv; PlayHead* m_playCursor; TimeRef m_origPos; }; #endif traverso-0.49.4/src/commands/PlayHeadMove.h000644 001750 001750 00000002432 11163362147 021043 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef PLAYHEAD_MOVE_H #define PLAYHEAD_MOVE_H #include class Sheet; class SheetView; class PlayHead; class PlayHeadMove : public Command { public : PlayHeadMove(PlayHead* cursor, SheetView* sv); ~PlayHeadMove(){}; int finish_hold(); int begin_hold(); void cancel_action(); int jog(); void set_cursor_shape(int useX, int useY); private : PlayHead* m_cursor; Sheet* m_sheet; SheetView* m_sv; bool m_resync; int m_origXPos; int m_newXPos; int m_newYPos; }; #endif traverso-0.49.4/src/commands/MoveEdge.h000644 001750 001750 00000002765 11163362147 020231 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2006 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: MoveEdge.h,v 1.11 2009/03/07 17:33:12 r_sijrier Exp $ */ #ifndef MOVEEDGE_H #define MOVEEDGE_H #include "Command.h" #include "defines.h" #include class AudioClip; class SheetView; class AudioClipView; class MoveEdge : public Command { public : MoveEdge(AudioClipView* cv, SheetView* sv, QByteArray whichEdge); ~MoveEdge(); int begin_hold(); int finish_hold(); void cancel_action(); int prepare_actions(); int do_action(); int undo_action(); int jog(); private : AudioClip* m_clip; SheetView* m_sv; QByteArray m_edge; TimeRef m_originalPos; TimeRef m_newPos; TimeRef m_otherEdgePos; }; #endif traverso-0.49.4/src/commands/Scroll.h000644 001750 001750 00000002311 11163362147 017757 0ustar00remonremon000000 000000 /* Copyright (C) 2008 Remon Sijrier Copyright (C) 2007 Ben Levitt This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef SCROLL_H #define SCROLL_H #include "Command.h" class SheetView; class QPoint; class Scroll : public Command { public : Scroll(SheetView* sv, QVariantList args); ~Scroll() {}; int begin_hold(); int finish_hold(); int prepare_actions(); int do_action(); int undo_action(); private : SheetView* m_sv; int m_dx; int m_dy; }; #endif traverso-0.49.4/src/commands/PlayHeadMove.cpp000644 001750 001750 00000006312 11163362147 021377 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "PlayHeadMove.h" #include #include #include #include PlayHeadMove::PlayHeadMove(PlayHead* cursor, SheetView* sv) : Command("Play Cursor Move") , m_cursor(cursor) , m_sheet(sv->get_sheet()) , m_sv(sv) { m_resync = config().get_property("AudioClip", "SyncDuringDrag", false).toBool(); } int PlayHeadMove::finish_hold() { int x = cpointer().scene_x(); if (x < 0) { x = 0; } // When SyncDuringDrag is true, don't seek in finish_hold() // since that causes another audio glitch. if (!(m_resync && m_sheet->is_transport_rolling())) { // if the sheet is transporting, the seek action will cause // the playcursor to be moved to the correct location. // Until then hide it, it will be shown again when the seek is finished! if (m_sheet->is_transport_rolling()) { m_cursor->hide(); } TimeRef location(x * m_sv->timeref_scalefactor); m_sheet->set_transport_pos(location); } m_sv->start_shuttle(false); return -1; } int PlayHeadMove::begin_hold() { m_cursor->set_active(false); m_origXPos = m_newXPos = int(m_sheet->get_transport_location() / m_sv->timeref_scalefactor); m_sv->start_shuttle(true, true); // Mabye a technically more proper fix is to check if // m_origXPos and the x pos in finish_hold() are equal or not ?? jog(); return 1; } void PlayHeadMove::cancel_action() { m_sv->start_shuttle(false); m_cursor->set_active(m_sheet->is_transport_rolling()); if (!m_resync) { m_cursor->setPos(m_origXPos, 0); } } void PlayHeadMove::set_cursor_shape(int useX, int useY) { Q_UNUSED(useX); Q_UNUSED(useY); cpointer().get_viewport()->set_holdcursor(":/cursorHoldLr"); } int PlayHeadMove::jog() { int x = cpointer().scene_x(); int y = cpointer().scene_y(); if (x < 0) { x = 0; } if (x == m_newXPos && y == m_newYPos) { return 0; } if (x != m_newXPos) { m_cursor->setPos(x, 0); TimeRef newpos(x * m_sv->timeref_scalefactor); if (m_resync && m_sheet->is_transport_rolling()) { m_sheet->set_transport_pos(newpos); } m_sv->update_shuttle_factor(); cpointer().get_viewport()->set_holdcursor_text(timeref_to_text(newpos, m_sv->timeref_scalefactor)); } // Hmm, the alignment of the holdcursor isn't in the center, so we have to // substract half the width of it to make it appear centered... :-( cpointer().get_viewport()->set_holdcursor_pos(QPoint(x - 16, y - 16)); m_newXPos = x; m_newYPos = y; return 1; } traverso-0.49.4/src/commands/Import.h000644 001750 001750 00000003437 11163362147 020005 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2006 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: Import.h,v 1.10 2008/05/25 13:59:10 n_doebelin Exp $ */ #ifndef IMPORT_H #define IMPORT_H #include "Command.h" class QString; class AudioClip; class ReadSource; class Import : public Command { public : Import(const QString& fileName); Import(Track* track, const TimeRef& length, bool silent = false); Import(Track* track, const QString& fileName); Import(Track* track, const QString& fileName, const TimeRef& position); ~Import(); int prepare_actions(); int do_action(); int undo_action(); int create_readsource(); void create_audioclip(); void set_track(Track* track); void set_position(const TimeRef& position); ReadSource* readsource() {return m_source;}; private : Track* m_track; AudioClip* m_clip; ReadSource* m_source; QString m_fileName; QString m_name; bool m_silent; TimeRef m_initialLength; bool m_hasPosition; TimeRef m_position; void init(Track* track, const QString& filename); }; #endif traverso-0.49.4/src/commands/plugins/000755 001750 001750 00000000000 11427546476 020050 5ustar00remonremon000000 000000 traverso-0.49.4/src/commands/plugins/TraversoCommands/000755 001750 001750 00000000000 11163362200 023311 5ustar00remonremon000000 000000 traverso-0.49.4/src/commands/plugins/TraversoCommands/CMakeLists.txt000644 001750 001750 00000001465 11163362147 026071 0ustar00remonremon000000 000000 INCLUDE_DIRECTORIES( ${CMAKE_SOURCE_DIR}/src/common ${CMAKE_SOURCE_DIR}/src/core ${CMAKE_SOURCE_DIR}/src/sheetcanvas ${CMAKE_SOURCE_DIR}/src/commands ${CMAKE_SOURCE_DIR}/src/plugins ${CMAKE_SOURCE_DIR}/src/plugins/native ${QT_QTXML_INCLUDE_DIR} ) SET(TRAVERSO_COMMAND_PLUGIN_SOURCES TraversoCommands.cpp ) SET(TRAVERSO_TRAVERSO_COMMANDS_MOC_CLASSES TraversoCommands.h ) ADD_DEFINITIONS(-DQT_PLUGIN) ADD_DEFINITIONS(-DQT_STATICPLUGIN) QT4_WRAP_CPP(TRAVERSO_TRAVERSSO_COMMANDS_MOC_SOURCES ${TRAVERSO_TRAVERSO_COMMANDS_MOC_CLASSES}) SET(TRAVERSO_COMMAND_PLUGIN_LIBRARY "tcp_traversocommands") ADD_LIBRARY(${TRAVERSO_COMMAND_PLUGIN_LIBRARY} STATIC ${TRAVERSO_COMMAND_PLUGIN_SOURCES} ${TRAVERSO_TRAVERSSO_COMMANDS_MOC_SOURCES}) IF(USE_PCH) ADD_DEPENDENCIES(tcp_traversocommands precompiled_headers) ENDIF(USE_PCH) traverso-0.49.4/src/commands/plugins/TraversoCommands/TraversoCommands.h000644 001750 001750 00000005710 11163362147 026766 0ustar00remonremon000000 000000 /* Copyright (C) 2007-2008 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef TRAVERSO_COMMANDS_H #define TRAVERSO_COMMANDS_H #include class TraversoCommands : public CommandPlugin { Q_OBJECT Q_CLASSINFO("Gain", tr("Gain")) Q_CLASSINFO("ResetGain", tr("Gain: Reset")) Q_CLASSINFO("TrackPan", tr("Panorama")) Q_CLASSINFO("ResetTrackPan", tr("Panorama: Reset")) Q_CLASSINFO("ImportAudio", tr("Import Audio")) Q_CLASSINFO("InsertSilence", tr("Insert Silence")) Q_CLASSINFO("CopyClip", tr("Copy Clip")) Q_CLASSINFO("AddNewTrack", tr("New Track")) Q_CLASSINFO("RemoveClip", tr("Remove Clip")) Q_CLASSINFO("RemoveTrack", tr("Remove Track")) Q_CLASSINFO("AudioClipExternalProcessing", tr("External Processing")) Q_CLASSINFO("ClipSelectionSelect", tr("(De)Select")) Q_CLASSINFO("ClipSelectionSelectAll", tr("(De)Select All")) Q_CLASSINFO("MoveClip", tr("Move Clip")) Q_CLASSINFO("DragEdge", tr("Drag Edge")) Q_CLASSINFO("MoveClipOrEdge", tr("Move Or Resize Clip")) Q_CLASSINFO("SplitClip", tr("Split")) Q_CLASSINFO("CropClip", tr("Magnetic Cut")) Q_CLASSINFO("ArmTracks", tr("Arm Tracks")) Q_CLASSINFO("FoldSheet", tr("Fold Sheet")) Q_CLASSINFO("FoldTrack", tr("Fold Track")) Q_CLASSINFO("FoldMarkers", tr("Fold Markers")) Q_CLASSINFO("VZoomIn", tr("Vertical In")) Q_CLASSINFO("HZoomOut", tr("Horizontal Out")) Q_CLASSINFO("HZoomIn", tr("Horizontal In")) Q_CLASSINFO("VZoomOut", tr("Vertical Out")) Q_CLASSINFO("Zoom", tr("Omnidirectional")) Q_CLASSINFO("HJogZoom", tr("Horizontal")) Q_CLASSINFO("VJogZoom", tr("Vertical")) Q_CLASSINFO("ScrollRightHold", tr("Right")) Q_CLASSINFO("ScrollLeftHold", tr("Left")) Q_CLASSINFO("ScrollUpHold", tr("Up")) Q_CLASSINFO("ScrollDownHold", tr("Down")) public: TraversoCommands(); Command* create(QObject* obj, const QString& command, QVariantList arguments); private: enum Commands { GainCommand, TrackPanCommand, ImportAudioCommand, InsertSilenceCommand, AddNewTrackCommand, RemoveClipCommand, RemoveTrackCommand, AudioClipExternalProcessingCommand, ClipSelectionCommand, MoveClipCommand, DragEdgeCommand, MoveClipOrEdgeCommand, SplitClipCommand, CropClipCommand, ArmTracksCommand, ZoomCommand, ScrollCommand }; }; #endif //eof traverso-0.49.4/src/commands/plugins/TraversoCommands/TraversoCommands.cpp000644 001750 001750 00000031014 11163362147 027315 0ustar00remonremon000000 000000 /* Copyright (C) 2007-2008 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "TraversoCommands.h" #include #include #include // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" /** * \class TraversoCommands \brief The Traverso CommandPlugin class which 'implements' many of the default Commands With this plugin, the InputEngine is able to dispatch key actions by directly asking this Plugin for the needed Command object. Dispatching key events to a specific object to create a Command object is accomplished by creating entries in the keymap.xml file, which has the following syntax: \code \endcode \code objectname: The class name of the object that we want to dispatch the key action on mousehint Used to set the mouse cursor. Use "LR" for horizontal suggestion, "UD" for vertical suggestion, or "RLUD" for omnidirectional suggestion. modes: Modes for which this command can be used, like All, Edit or Effects. Modes are to be defined in the keymap itself! sortorder: The order of where the key action should show up in the ContextMenu of 'objectname' plugniname: The plugin to ask the Command for, the only one available right now is TraversoCommands commandname: The Command to be created, which by convention tries to be the same name as the actuall class implementing the Command arguments: One, or more values (seperated by semicolons), each Command explains which (list of) values it can understand \endcode Available Command classes, their required Object (to operate on) and arguments are: \code MoveClip: Move or Copy-move an AudioClip. objectname: AudioClipView arguments: First entry, either one of the following: "move", "copy", "move_to_end", "move_to_start" Second (optional) entry: Move vertical only: "true" for vertical moving only, "false" for omnidirectional moving (the default if none is given) commandname: MoveClip \endcode \code Gain: Change (jog), or reset the Gain of audio processing items objectname: SheetView, TrackView, AudioClipView arguments: No argument: Move Mouse vertically. Argument "horizontal": Move Mouse horizontally commandname: Gain \endcode \code ResetGain: Set Gain value to a pre-defined value (by means of the supplied argument). objectname: SheetView, TrackView, AudioClipView arguments: a floating point value, eg: "0.5" commandname: ResetGain \endcode TODO document all remaining Commands \code ?: ? Objects(s): arguments: commandname: \endcode */ TraversoCommands::TraversoCommands() { m_dict.insert("Gain", GainCommand); m_dict.insert("ResetGain", GainCommand); m_dict.insert("TrackPan", TrackPanCommand); m_dict.insert("ResetTrackPan", TrackPanCommand); m_dict.insert("ImportAudio", ImportAudioCommand); m_dict.insert("InsertSilence", InsertSilenceCommand); m_dict.insert("AddNewTrack", AddNewTrackCommand); m_dict.insert("RemoveClip", RemoveClipCommand); m_dict.insert("RemoveTrack", RemoveTrackCommand); m_dict.insert("AudioClipExternalProcessing", AudioClipExternalProcessingCommand); m_dict.insert("ClipSelectionSelect", ClipSelectionCommand); m_dict.insert("ClipSelectionSelectAll", ClipSelectionCommand); m_dict.insert("ClipSelectionAdd", ClipSelectionCommand); m_dict.insert("ClipSelectionRemove", ClipSelectionCommand); m_dict.insert("MoveClip", MoveClipCommand); m_dict.insert("FoldSheet", MoveClipCommand); m_dict.insert("FoldTrack", MoveClipCommand); m_dict.insert("FoldMarkers", MoveClipCommand); m_dict.insert("DragEdge", DragEdgeCommand); m_dict.insert("MoveClipOrEdge", MoveClipOrEdgeCommand); m_dict.insert("CopyClip", MoveClipCommand); m_dict.insert("SplitClip", SplitClipCommand); m_dict.insert("CropClip", CropClipCommand); m_dict.insert("ArmTracks", ArmTracksCommand); m_dict.insert("VZoomIn", ZoomCommand); m_dict.insert("VZoomOut", ZoomCommand); m_dict.insert("HZoomIn", ZoomCommand); m_dict.insert("HZoomOut", ZoomCommand); m_dict.insert("HJogZoom", ZoomCommand); m_dict.insert("VJogZoom", ZoomCommand); m_dict.insert("JogZoom", ZoomCommand); m_dict.insert("ScrollRightHold", ScrollCommand); m_dict.insert("ScrollLeftHold", ScrollCommand); m_dict.insert("ScrollUpHold", ScrollCommand); m_dict.insert("ScrollDownHold", ScrollCommand); } Command* TraversoCommands::create(QObject* obj, const QString& command, QVariantList arguments) { switch (m_dict.value(command)) { case GainCommand: { ContextItem* item = qobject_cast(obj); SheetView* sheetview = 0; if (item->metaObject()->className() == QString("TrackPanelGain")) { item = item->get_context(); } else if (item->metaObject()->className() == QString("SheetPanelGain")) { item = item->get_context(); } else if (AudioClipView* view = qobject_cast(item)) { sheetview = view->get_sheetview(); item = view->get_context(); } else if (TrackView* view = qobject_cast(item)) { sheetview = view->get_sheetview(); item = view->get_context(); } else if (SheetView* view = qobject_cast(item)) { sheetview = view; item = view->get_context(); } // ugly hack to avoid assigning a sheetview when the // mouse cursor is above the trackpanel.... if (cpointer().scene_x() < 0) { sheetview = 0; } if (!item) { PERROR("TraversoCommands: Supplied QObject was not a ContextItem, " "GainCommand only works with ContextItem objects!!"); return 0; } return new Gain(item, sheetview, arguments); } case TrackPanCommand: { Track* track = qobject_cast(obj); if (! track) { TrackPanelPan* tpp = qobject_cast(obj); if (! tpp ) { PERROR("TraversoCommands: Supplied QObject was not a Track! " "TrackPanCommand needs a Track as argument"); return 0; } track = (Track*)(tpp->get_context()); } return new TrackPan(track, arguments); } case ImportAudioCommand: { Track* track = qobject_cast(obj); if (! track) { PERROR("TraversoCommands: Supplied QObject was not a Track! " "ImportAudioCommand needs a Track as argument"); return 0; } return new Import(track, TimeRef()); } case InsertSilenceCommand: { Track* track = qobject_cast(obj); if (! track) { PERROR("TraversoCommands: Supplied QObject was not a Track! " "ImportAudioCommand needs a Track as argument"); return 0; } TimeRef length(10*UNIVERSAL_SAMPLE_RATE); return new Import(track, length, true); } case AddNewTrackCommand: { Sheet* sheet = qobject_cast(obj); if (!sheet) { PERROR("TraversoCommands: Supplied QObject was not a Sheet! " "AddNewTrackCommand needs a Sheet as argument"); return 0; } return sheet->add_track(new Track(sheet, "Unnamed", Track::INITIAL_HEIGHT)); } case RemoveClipCommand: { AudioClip* clip = qobject_cast(obj); if (!clip) { PERROR("TraversoCommands: Supplied QObject was not a Clip! " "RemoveClipCommand needs a Clip as argument"); return 0; } return new AddRemoveClip(clip, AddRemoveClip::REMOVE); } case RemoveTrackCommand: { Track* track = qobject_cast(obj); if (!track) { PERROR("TraversoCommands: Supplied QObject was not a Track! " "RemoveTrackCommand needs a Track as argument"); return 0; } return track->get_sheet()->remove_track(track); } case AudioClipExternalProcessingCommand: { AudioClip* clip = qobject_cast(obj); if (!clip) { PERROR("TraversoCommands: Supplied QObject was not an AudioClip! " "AudioClipExternalProcessingCommand needs an AudioClip as argument"); return 0; } return new AudioClipExternalProcessing(clip); } case ClipSelectionCommand: { Sheet* sheet = qobject_cast(obj); if (sheet) { QString action; if (arguments.size()) { action = arguments.at(0).toString(); if (action == "select_all_clips") { return sheet->get_audioclip_manager()->select_all_clips(); } } } AudioClip* clip = qobject_cast(obj); if (!clip) { PERROR("TraversoCommands: Supplied QObject was not an AudioClip! " "ClipSelectionCommand needs an AudioClip as argument"); return 0; } return new ClipSelection(clip, arguments); } case MoveClipCommand: { ViewItem* view = qobject_cast(obj); if (!view) { PERROR("TraversoCommands: Supplied QObject was not an AudioClipView! " "MoveClipCommand needs an AudioClipView as argument"); return 0; } return new MoveClip(view, arguments); } case DragEdgeCommand: { AudioClipView* view = qobject_cast(obj); if (!view) { PERROR("TraversoCommands: Supplied QObject was not an AudioClipView! " "DragEdgeCommand needs an AudioClipView as argument"); return 0; } int x = (int) (cpointer().on_first_input_event_scene_x() - view->scenePos().x()); if (x < (view->boundingRect().width() / 2)) { return new MoveEdge(view, view->get_sheetview(), "set_left_edge"); } else { return new MoveEdge(view, view->get_sheetview(), "set_right_edge"); } } // The existence of this is doubtfull. Using [ E ] is so much easier // then trying to mimic 'if near to edge, drag edge' features. case MoveClipOrEdgeCommand: { AudioClipView* view = qobject_cast(obj); if (!view) { PERROR("TraversoCommands: Supplied QObject was not an AudioClipView! " "MoveClipOrEdgeCommand needs an AudioClipView as argument"); return 0; } int x = (int) (cpointer().on_first_input_event_scene_x() - view->scenePos().x()); int edge_width = 0; if (arguments.size() == 2) { edge_width = arguments[0].toInt(); } if (x < edge_width) { return new MoveEdge(view, view->get_sheetview(), "set_left_edge"); } else if (x > (view->boundingRect().width() - edge_width)) { return new MoveEdge(view, view->get_sheetview(), "set_right_edge"); } return new MoveClip(view, QVariantList() << "move"); } case SplitClipCommand: { AudioClipView* view = qobject_cast(obj); if (!view) { PERROR("TraversoCommands: Supplied QObject was not an AudioClipView! " "SplitClipCommand needs an AudioClipView as argument"); return 0; } return new SplitClip(view); } case CropClipCommand: { AudioClipView* view = qobject_cast(obj); if (!view) { PERROR("TraversoCommands: Supplied QObject was not an AudioClipView! " "CropClipCommand needs an AudioClipView as argument"); return 0; } return new Crop(view); } case ArmTracksCommand: { SheetView* view = qobject_cast(obj); if (!view) { PERROR("TraversoCommands: Supplied QObject was not an SheetView! " "ArmTracksCommand needs an SheetView as argument"); return 0; } return new ArmTracks(view); } case ZoomCommand: { SheetView* view = qobject_cast(obj); if (!view) { PERROR("TraversoCommands: Supplied QObject was not an SheetView! " "ArmTracksCommand needs an SheetView as argument"); return 0; } return new Zoom(view, arguments); } case ScrollCommand: { SheetView* view = qobject_cast(obj); if (!view) { PERROR("TraversoCommands: Supplied QObject was not an SheetView! " "ArmTracksCommand needs an SheetView as argument"); return 0; } return new Scroll(view, arguments); } } return 0; } Q_EXPORT_PLUGIN2(tcp_traversocommands, TraversoCommands) // eof traverso-0.49.4/src/commands/plugins/CMakeLists.txt000644 001750 001750 00000000043 11427546440 022574 0ustar00remonremon000000 000000 ADD_SUBDIRECTORY(TraversoCommands) traverso-0.49.4/src/commands/RemoveClip.h000644 001750 001750 00000002265 11163362147 020576 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef REMOVE_CLIP_H #define REMOVE_CLIP_HS #include "Command.h" #include "AudioClipGroup.h" class AudioClip; class Track; class AddRemoveClip : public Command { public : AddRemoveClip(AudioClip* clip, int type); ~AddRemoveClip() {}; enum { ADD, REMOVE }; int prepare_actions(); int do_action(); int undo_action(); private : AudioClipGroup m_group; int m_type; }; #endif traverso-0.49.4/src/commands/PCommand.h000644 001750 001750 00000002575 11163362147 020233 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2009 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef PCOMMAND_H #define PCOMMAND_H #include "Command.h" class ContextItem; class PCommand : public Command { public : PCommand(ContextItem* item, const char* slot, const QString& des); PCommand(ContextItem* item, const char* slot, QVariant doValue, QVariant undoValue, const QString& des); ~PCommand(); int prepare_actions(); int do_action(); int undo_action(); int begin_hold(); int finish_hold(); private : ContextItem* m_contextitem; const char* m_slot; QVariant m_doValue; QVariant m_undoValue; }; #endif traverso-0.49.4/src/commands/AddRemove.h000644 001750 001750 00000003437 11163362147 020401 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2006 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: AddRemove.h,v 1.3 2008/01/21 16:22:11 r_sijrier Exp $ */ #ifndef ADD_ITEM_COMMAND_H #define ADD_ITEM_COMMAND_H #include "Command.h" #include class ContextItem; class Sheet; class AddRemove : public Command { public : AddRemove(ContextItem* parent, void* arg, const QString& des); AddRemove(ContextItem* parent, void* arg, bool historable, Sheet* sheet, const char* doActionSlot, const char* doSignal, const char* undoActionSlot, const char* undoSignal, const QString& des); ~AddRemove(); int prepare_actions(); int do_action(); int undo_action(); void set_instantanious(bool instant); private : ContextItem* m_parentItem; void* m_arg; TsarEvent m_doActionEvent; TsarEvent m_undoActionEvent; Sheet* m_sheet; const char* m_doActionSlot; const char* m_undoActionSlot; const char* m_doSignal; const char* m_undoSignal; bool m_instantanious; }; #endif traverso-0.49.4/src/commands/RemoveClip.cpp000644 001750 001750 00000003416 11163362147 021130 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "RemoveClip.h" #include "AudioClip.h" #include "AudioClipManager.h" #include "Sheet.h" // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" AddRemoveClip::AddRemoveClip(AudioClip* clip, int type) : Command(clip, tr("Remove Clip")) { if (clip->is_selected()) { QList selectedClips; clip->get_sheet()->get_audioclip_manager()->get_selected_clips(selectedClips); m_group.set_clips(selectedClips); setText(tr("Remove Selected Clips")); } else { m_group.add_clip(clip); } m_type = type; } int AddRemoveClip::prepare_actions() { return 1; } int AddRemoveClip::do_action() { PENTER; if (m_type == REMOVE) { m_group.remove_all_clips_from_tracks(); } if (m_type == ADD) { m_group.add_all_clips_to_tracks(); } return 1; } int AddRemoveClip::undo_action() { PENTER; if (m_type == REMOVE) { m_group.add_all_clips_to_tracks(); } if (m_type == ADD) { m_group.remove_all_clips_from_tracks(); } return 1; } // eof traverso-0.49.4/src/commands/Zoom.cpp000644 001750 001750 00000010141 11163362147 020000 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2006 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "Zoom.h" #include "SheetView.h" #include "Sheet.h" #include "ClipsViewPort.h" #include "ContextPointer.h" #include // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" Zoom::Zoom(SheetView* sv, QVariantList args) : Command("Zoom") { m_jogHorizontal = m_jogVertical = false; if (args.size() > 0) { QString type = args.at(0).toString(); if (type == "JogZoom") { m_jogHorizontal = m_jogVertical = true; } else if (type == "HJogZoom") { m_jogHorizontal = true; } else if (type == "VJogZoom") { m_jogVertical = true; } } if (args.size() > 1) { m_xScalefactor = args.at(1).toDouble(); } else { m_xScalefactor = 1; } if (args.size() > 2) { m_yScalefactor = args.at(2).toDouble(); } else { m_yScalefactor = 0; } m_sv = sv; } int Zoom::prepare_actions() { return 1; } int Zoom::begin_hold() { verticalJogZoomLastY = cpointer().y(); horizontalJogZoomLastX = cpointer().x(); origPos = cpointer().pos(); return 1; } int Zoom::finish_hold() { QCursor::setPos(mousePos); return -1; } void Zoom::set_cursor_shape( int useX, int useY ) { Q_UNUSED(useX); Q_UNUSED(useY); if (useX && useY) { cpointer().get_viewport()->set_holdcursor(":/cursorZoom"); } else if(useX) { cpointer().get_viewport()->set_holdcursor(":/cursorZoomHorizontal"); } else if (useY) { cpointer().get_viewport()->set_holdcursor(":/cursorZoomVertical"); } mousePos = QCursor::pos(); } int Zoom::jog() { PENTER; if (m_jogVertical) { int y = cpointer().y(); int dy = y - verticalJogZoomLastY; if (abs(dy) > 8) { verticalJogZoomLastY = y; if (dy > 0) { m_sv->vzoom(1 + m_yScalefactor); } else { m_sv->vzoom(1 - m_yScalefactor); } } } if (m_jogHorizontal) { int x = cpointer().x(); int dx = x - horizontalJogZoomLastX; // TODO // values between /* */ are for use when using non power of 2 zoom levels! if (abs(dx) > 10 /*1*/) { horizontalJogZoomLastX = x; Sheet* sheet = m_sv->get_sheet(); if (dx > 0) { sheet->set_hzoom(sheet->get_hzoom() / 2 /*(m_xScalefactor + dx/18)*/); } else { sheet->set_hzoom(sheet->get_hzoom() * 2 /*(m_xScalefactor + abs(dx)/18)*/); } m_sv->center(); } } cpointer().get_viewport()->set_holdcursor_pos(m_sv->get_clips_viewport()->mapToScene(origPos).toPoint()); return 1; } int Zoom::do_action( ) { if (m_yScalefactor != 0) { m_sv->vzoom(1 + m_yScalefactor); } if (m_xScalefactor != 1) { m_sv->hzoom(m_xScalefactor); // m_sv->center(); } return -1; } int Zoom::undo_action( ) { return -1; } void Zoom::vzoom_in(bool autorepeat) { m_sv->vzoom(1.3); } void Zoom::vzoom_out(bool autorepeat) { m_sv->vzoom(0.7); } void Zoom::toggle_vertical_horizontal_jog_zoom(bool autorepeat) { if (autorepeat) return; if (m_jogVertical) { cpointer().get_viewport()->set_holdcursor(":/cursorZoomHorizontal"); cpointer().get_viewport()->set_holdcursor_pos(m_sv->get_clips_viewport()->mapToScene(origPos).toPoint()); m_jogVertical = false; m_jogHorizontal = true; } else { cpointer().get_viewport()->set_holdcursor(":/cursorZoomVertical"); cpointer().get_viewport()->set_holdcursor_pos(m_sv->get_clips_viewport()->mapToScene(origPos).toPoint()); m_jogVertical = true; m_jogHorizontal = false; } } traverso-0.49.4/src/commands/Crop.h000644 001750 001750 00000003215 11163362147 017430 0ustar00remonremon000000 000000 /* Copyright (C) 2009 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef CROP_H #define CROP_H #include "Command.h" class AudioClipView; class Track; class AudioClip; class QGraphicsRectItem; class Crop : public Command { Q_OBJECT Q_CLASSINFO("adjust_left", tr("Adjust Left")) Q_CLASSINFO("adjust_right", tr("Adjust Right")) public : Crop(AudioClipView* cv); ~Crop(); int begin_hold(); int finish_hold(); int prepare_actions(); int do_action(); int undo_action(); void cancel_action(); int jog(); private: AudioClipView* m_cv; Track* m_track; AudioClip* m_clip; AudioClip* leftClip; AudioClip* rightClip; QGraphicsRectItem* m_selection; qint64 x1; qint64 x2; public slots: void adjust_left(bool autorepeat); void adjust_right(bool autorepeat); }; #endif traverso-0.49.4/src/commands/Scroll.cpp000644 001750 001750 00000003163 11163362147 020320 0ustar00remonremon000000 000000 /* Copyright (C) 2008 Remon Sijrier Copyright (C) 2007 Ben Levitt This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "Scroll.h" #include "SheetView.h" #include "ContextPointer.h" #include "ClipsViewPort.h" Scroll::Scroll(SheetView* sv, QVariantList args) : Command("Scroll") { m_sv = sv; m_dx = m_dy = 0; if (args.size() > 0) { m_dx = args.at(0).toInt(); } if (args.size() > 1) { m_dy = args.at(1).toInt(); } } int Scroll::prepare_actions() { return -1; } int Scroll::begin_hold() { m_sv->start_shuttle(true); m_sv->set_shuttle_factor_values(m_dx, m_dy); if (m_dx) { cpointer().get_viewport()->setCursor(themer()->get_cursor("LR")); } else { cpointer().get_viewport()->setCursor(themer()->get_cursor("UD")); } return 1; } int Scroll::finish_hold() { m_sv->start_shuttle(false); return 1; } int Scroll::do_action( ) { return -1; } int Scroll::undo_action( ) { return -1; } // eof traverso-0.49.4/src/commands/TrackPan.cpp000644 001750 001750 00000006061 11163362147 020565 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2008 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "TrackPan.h" #include "ViewPort.h" #include "ContextPointer.h" #include "Track.h" // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" /** * \class TrackPan \brief Change (jog) the Panorama of a Track, or set to a pre-defined value \sa TraversoCommands */ TrackPan::TrackPan(Track* track, QVariantList args) : Command(track, "") , d(new Data) { m_track = track; QString des; if (args.size() > 0) { m_newPan = args.at(0).toDouble(); des = tr("Track Pan: %1").arg("Reset"); m_origPan = m_track->get_pan(); } else { des = tr("Track Pan"); } setText(des); } int TrackPan::prepare_actions() { delete d; return 1; } int TrackPan::begin_hold() { d->origX = cpointer().x(); m_origPan = m_newPan = m_track->get_pan(); return 1; } int TrackPan::finish_hold() { QCursor::setPos(d->mousePos); return 1; } int TrackPan::do_action() { m_track->set_pan(m_newPan); return 1; } int TrackPan::undo_action() { m_track->set_pan(m_origPan); return 1; } void TrackPan::cancel_action() { finish_hold(); undo_action(); } void TrackPan::set_cursor_shape(int useX, int useY) { Q_UNUSED(useX); Q_UNUSED(useY); d->mousePos = QCursor::pos(); cpointer().get_viewport()->set_holdcursor(":/cursorHoldLr"); } int TrackPan::jog() { float w = 600.0; float ofx = (float) d->origX - cpointer().x(); float p = -2.0f * (ofx) / w ; m_newPan = p + m_newPan; if (m_newPan < -1.0) m_newPan = -1.0; if (m_newPan > 1.0) m_newPan = 1.0; m_track->set_pan(m_newPan); QCursor::setPos(d->mousePos); cpointer().get_viewport()->set_holdcursor_text(QByteArray::number(m_newPan, 'f', 2)); return 1; } void TrackPan::pan_left(bool autorepeat) { Q_UNUSED(autorepeat); m_newPan -= 0.05; if (m_newPan < -1.0) m_newPan = -1.0; m_track->set_pan(m_newPan); cpointer().get_viewport()->set_holdcursor_text(QByteArray::number(m_newPan, 'f', 2)); } void TrackPan::pan_right(bool autorepeat) { Q_UNUSED(autorepeat); m_newPan += 0.05; if (m_newPan > 1.0) m_newPan = 1.0; m_track->set_pan(m_newPan); cpointer().get_viewport()->set_holdcursor_text(QByteArray::number(m_newPan, 'f', 2)); } traverso-0.49.4/src/commands/ExternalProcessingDialog.h000644 001750 001750 00000003622 11163362147 023466 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef AUDIOCLIP_EXTERNAL_PROCESSING_DIALOG_H #define AUDIOCLIP_EXTERNAL_PROCESSING_DIALOG_H #include #include "ui_ExternalProcessingDialog.h" #include class AudioClip; class Track; class AudioClipExternalProcessing; class QCompleter; class ExternalProcessingDialog : public QDialog, protected Ui::ExternalProcessingDialog { Q_OBJECT public: ExternalProcessingDialog(QWidget* parent, AudioClipExternalProcessing* acep); ~ExternalProcessingDialog(); private: AudioClipExternalProcessing* m_acep; QProcess* m_processor; QCompleter* m_completer; QString m_filename; QString m_program; bool m_queryOptions; QStringList m_arguments; QString m_commandargs; QString m_infilename; QString m_outfilename; QString m_newClipName; void query_options(); private slots: void read_standard_output(); void prepare_for_external_processing(); void process_started(); void process_finished(int exitcode, QProcess::ExitStatus exitstatus); void arg_combo_index_changed ( const QString & text ); void start_external_processing(); void command_lineedit_text_changed(const QString & text); void process_error(QProcess::ProcessError error); }; #endif //eof traverso-0.49.4/src/commands/ClipSelection.h000644 001750 001750 00000002534 11163362147 021265 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2008 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef CLIPSELECTION_H #define CLIPSELECTION_H #include "Command.h" #include #include class AudioClip; class AudioClipManager; class ClipSelection : public Command { public : ClipSelection(AudioClip* clip, QVariantList args); ClipSelection(QList clips, AudioClipManager* manager, const char* slot, const QString& des); ~ClipSelection(); int begin_hold(); int finish_hold(); int prepare_actions(); int do_action(); int undo_action(); void cancel_action(); int jog(); private : QList m_clips; const char* m_slot; AudioClipManager* m_acmanager; }; #endif traverso-0.49.4/src/commands/SplitClip.cpp000644 001750 001750 00000010302 11163362147 020756 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "SplitClip.h" #include #include #include #include "LineView.h" #include #include "Fade.h" // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" SplitClip::SplitClip(AudioClipView* view) : Command(view->get_clip(), tr("Split Clip")) { m_clip = view->get_clip(); m_sv = view->get_sheetview(); m_cv = view; m_track = m_clip->get_track(); leftClip = 0; rightClip = 0; m_splitPoint = TimeRef(); Q_ASSERT(m_clip->get_sheet()); } int SplitClip::prepare_actions() { if (m_splitPoint == qint64(0)) { m_splitPoint = TimeRef(cpointer().scene_x() * m_sv->timeref_scalefactor); } if (m_splitPoint <= m_clip->get_track_start_location() || m_splitPoint >= m_clip->get_track_start_location() + m_clip->get_length()) { return -1; } leftClip = resources_manager()->get_clip(m_clip->get_id()); rightClip = resources_manager()->get_clip(m_clip->get_id()); leftClip->set_sheet(m_clip->get_sheet()); leftClip->set_track_start_location(m_clip->get_track_start_location()); leftClip->set_right_edge(m_splitPoint); if (leftClip->get_fade_out()) { FadeRange* cmd = (FadeRange*)leftClip->reset_fade_out(); cmd->set_historable(false); Command::process_command(cmd); } rightClip->set_sheet(m_clip->get_sheet()); rightClip->set_left_edge(m_splitPoint); rightClip->set_track_start_location(m_splitPoint); if (rightClip->get_fade_in()) { FadeRange* cmd = (FadeRange*)rightClip->reset_fade_in(); cmd->set_historable(false); Command::process_command(cmd); } return 1; } int SplitClip::do_action() { PENTER; Command::process_command(m_track->add_clip(leftClip, false)); Command::process_command(m_track->add_clip(rightClip, false)); Command::process_command(m_track->remove_clip(m_clip, false)); return 1; } int SplitClip::undo_action() { PENTER; Command::process_command(m_track->add_clip(m_clip, false)); Command::process_command(m_track->remove_clip(leftClip, false)); Command::process_command(m_track->remove_clip(rightClip, false)); return 1; } int SplitClip::begin_hold() { m_sv->start_shuttle(true, true); m_splitcursor = new LineView(m_cv); m_splitcursor->set_color(themer()->get_color("AudioClip:contour")); m_cv->scene()->addItem(m_splitcursor); return 1; } int SplitClip::finish_hold() { delete m_splitcursor; m_cv->update(); m_sv->start_shuttle(false); return 1; } void SplitClip::cancel_action() { finish_hold(); } void SplitClip::set_cursor_shape(int useX, int useY) { Q_UNUSED(useX); Q_UNUSED(useY); cpointer().get_viewport()->set_holdcursor(":/cursorHoldLr"); } int SplitClip::jog() { int x = cpointer().scene_x(); if (x < 0) { x = 0; } m_splitPoint = x * m_sv->timeref_scalefactor; if (m_clip->get_sheet()->is_snap_on()) { SnapList* slist = m_clip->get_sheet()->get_snap_list(); m_splitPoint = slist->get_snap_value(m_splitPoint); } QPointF point = m_cv->mapFromScene(m_splitPoint / m_sv->timeref_scalefactor, cpointer().y()); int xpos = (int) point.x(); if (xpos < 0) { xpos = 0; } if (xpos > m_cv->boundingRect().width()) { xpos = (int)m_cv->boundingRect().width(); } m_splitcursor->setPos(xpos, 0); m_sv->update_shuttle_factor(); cpointer().get_viewport()->set_holdcursor_text(timeref_to_text(m_splitPoint, m_sv->timeref_scalefactor)); cpointer().get_viewport()->set_holdcursor_pos(QPoint(cpointer().scene_x() - 16, cpointer().scene_y() - 16)); return 1; } // eof traverso-0.49.4/src/commands/Gain.cpp000644 001750 001750 00000015270 11163362147 017742 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2006 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: Gain.cpp,v 1.27 2008/02/13 10:25:25 r_sijrier Exp $ */ #include "Gain.h" #include "ContextItem.h" #include "ContextPointer.h" #include "Mixer.h" #include #include #include "Sheet.h" #include "SheetView.h" // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" /** * \class Gain \brief Change (jog) the Gain of a Sheet, Track or AudioClip, or set to a pre-defined value \sa TraversoCommands */ Gain::Gain(ContextItem* context, SheetView* sv, QVariantList args) : Command(context, "") , m_sv(sv) { gainObject = context; horiz = false; float gain = -1; QString des = ""; if (args.size() > 0 && args[0].toString() != "horizontal") { gain = args.at(0).toDouble(); des = QString(context->metaObject()->className()) + ": Reset gain"; } else { des = QString(context->metaObject()->className()) + " Gain"; } if (args.size() > 0 && args[0].toString() == "horizontal") { horiz = true; } setText(des); if (gain >= 0) { newGain = gain; get_gain_from_object(origGain); } Track* track = qobject_cast(context); if (track && origGain == 0.5) { newGain = 1.0; } else { Sheet* sheet = qobject_cast(context); if (sheet && origGain == 0.5) { newGain = 1.0; } } } Gain::~Gain() {} int Gain::prepare_actions() { if (origGain == newGain) { // Nothing happened! return -1; } return 1; } int Gain::begin_hold() { if ( ! get_gain_from_object(origGain)) { return -1; } newGain = origGain; origPos = cpointer().pos(); return 1; } int Gain::finish_hold() { QCursor::setPos(mousePos); return 1; } int Gain::do_action() { PENTER; if ( ! QMetaObject::invokeMethod(gainObject, "set_gain", Q_ARG(float, newGain))) { PWARN("Gain::do_action QMetaObject::invokeMethod failed"); return 0; } return 1; } int Gain::undo_action() { PENTER; if ( ! QMetaObject::invokeMethod(gainObject, "set_gain", Q_ARG(float, origGain)) ) { PWARN("Gain::undo_action QMetaObject::invokeMethod failed"); return 0; } return 1; } void Gain::cancel_action() { finish_hold(); undo_action(); } void Gain::set_collected_number(const QString & collected) { if (collected.size() == 0) { cpointer().get_viewport()->set_holdcursor_text(" dB"); return; } bool ok; float dbFactor = collected.toDouble(&ok); if (!ok) { if (collected.contains(".") || collected.contains("-")) { QString s = collected; s.append(" dB"); cpointer().get_viewport()->set_holdcursor_text(s); } return; } int rightfromdot = 0; if (collected.contains(".")) { rightfromdot = collected.size() - collected.lastIndexOf(".") - 1; } newGain = dB_to_scale_factor(dbFactor); QMetaObject::invokeMethod(gainObject, "set_gain", Q_ARG(float, newGain)); // now we get the new gain value from gainObject, since we don't know if // gainobject accepted the change or not! get_gain_from_object(newGain); // Update the vieport's hold cursor with the _actuall_ gain value! if(rightfromdot) { cpointer().get_viewport()->set_holdcursor_text(QByteArray::number(dbFactor, 'f', rightfromdot).append(" dB")); } else { cpointer().get_viewport()->set_holdcursor_text(QByteArray::number(dbFactor).append(" dB")); } } void Gain::set_cursor_shape(int useX, int useY) { Q_UNUSED(useX); Q_UNUSED(useY); mousePos = QCursor::pos(); if (horiz) { cpointer().get_viewport()->set_holdcursor(":/cursorHoldLr"); } else { cpointer().get_viewport()->set_holdcursor(":/cursorGain"); } } void Gain::increase_gain( bool autorepeat ) { Q_UNUSED(autorepeat); float dbFactor = coefficient_to_dB(newGain); dbFactor += 0.2; newGain = dB_to_scale_factor(dbFactor); QMetaObject::invokeMethod(gainObject, "set_gain", Q_ARG(float, newGain)); if (!horiz) { // now we get the new gain value from gainObject, since we don't know if // gainobject accepted the change or not! get_gain_from_object(newGain); // Update the vieport's hold cursor with the _actuall_ gain value! cpointer().get_viewport()->set_holdcursor_text(QByteArray::number(dbFactor, 'f', 2).append(" dB")); } } void Gain::decrease_gain(bool autorepeat) { Q_UNUSED(autorepeat); float dbFactor = coefficient_to_dB(newGain); dbFactor -= 0.2; newGain = dB_to_scale_factor(dbFactor); QMetaObject::invokeMethod(gainObject, "set_gain", Q_ARG(float, newGain)); if (!horiz) { // now we get the new gain value from gainObject, since we don't know if // gainobject accepted the change or not! get_gain_from_object(newGain); // Update the vieport's hold cursor with the _actuall_ gain value! cpointer().get_viewport()->set_holdcursor_text(QByteArray::number(dbFactor, 'f', 2).append(" dB")); } } int Gain::jog() { PENTER; float of = 0; float dbFactor = coefficient_to_dB(newGain); int diff; if (horiz) { diff = cpointer().x() - origPos.x(); } else { diff = origPos.y() - cpointer().y(); } if (dbFactor > -1) { of = diff * 0.05; } if (dbFactor <= -1) { of = diff * ((1 - dB_to_scale_factor(dbFactor)) / 3); } newGain = dB_to_scale_factor( dbFactor + of ); // Set the gain for gainObject QMetaObject::invokeMethod(gainObject, "set_gain", Q_ARG(float, newGain)); // now we get the new gain value from gainObject, since we don't know if // gainobject accepted the change or not! int result = get_gain_from_object(newGain); // Update the vieport's hold cursor! if (!horiz) { cpointer().get_viewport()->set_holdcursor_text(QByteArray::number(dbFactor, 'f', 2).append(" dB")); if (m_sv) { cpointer().get_viewport()->set_holdcursor_pos(origPos + QPoint(m_sv->hscrollbar_value(), m_sv->vscrollbar_value()) - QPoint(16, 16)); } } QCursor::setPos(mousePos); // origPos = cpointer().pos(); return result; } int Gain::get_gain_from_object(float& gain) { if ( ! QMetaObject::invokeMethod(gainObject, "get_gain", Qt::DirectConnection, Q_RETURN_ARG(float, gain)) ) { PWARN("Gain::get_gain_from_object QMetaObject::invokeMethod failed"); return 0; } return 1; } traverso-0.49.4/src/commands/PCommand.cpp000644 001750 001750 00000010332 11163362147 020554 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2009 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "PCommand.h" #include "ContextItem.h" #include "defines.h" // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" /** \class PCommand * \brief A Command class that can be used to create historable actions Use this class to create actions that basically involve calling one function to set and restore a value. E.g. setting and resetting the gain of an object can be done like this: \code PCommand(SomeObject, "do_something", newvalue, oldvalue, tr("MyObject: Did something")); \endcode where SomeObject is a pointer to a QObject derived class, and "do_something" is a function that accepts a value of the type of newvalue/oldvalue. "do_something" needs to be declared as a public slot! \n Supported types are: TimeRef, double and float. * */ PCommand::PCommand(ContextItem* item, const char* slot, const QString& des) : Command(item, des) , m_contextitem(item) , m_slot(slot) { } PCommand::PCommand(ContextItem * item, const char * slot, QVariant doValue, QVariant undoValue, const QString & des) : Command(item, des) , m_contextitem(item) , m_slot(slot) , m_doValue(doValue) , m_undoValue(undoValue) { } PCommand::~PCommand() {} int PCommand::prepare_actions() { return 1; } int PCommand::do_action() { PENTER; if (!m_doValue.isNull()) { if (m_doValue.typeName() == QString("TimeRef")) { if (QMetaObject::invokeMethod(m_contextitem, m_slot, Qt::DirectConnection, Q_ARG(TimeRef, m_doValue.value()))) { return 1; } } // covers both the float and double types! if (m_doValue.type() == QVariant::Double) { bool ok; if (QMetaObject::invokeMethod(m_contextitem, m_slot, Qt::DirectConnection, Q_ARG(float, m_doValue.toDouble(&ok)))) { return 1; } else if (QMetaObject::invokeMethod(m_contextitem, m_slot, Qt::DirectConnection, Q_ARG(double, m_doValue.toDouble(&ok)))) { return 1; } } return -1; } return QMetaObject::invokeMethod(m_contextitem, m_slot); } int PCommand::undo_action() { PENTER; if (!m_undoValue.isNull()) { if (m_undoValue.typeName() == QString("TimeRef")) { if (QMetaObject::invokeMethod(m_contextitem, m_slot, Qt::DirectConnection, Q_ARG(TimeRef, m_undoValue.value()))) { return 1; } } // covers both the float and double types! if (m_undoValue.type() == QVariant::Double) { bool ok; if (QMetaObject::invokeMethod(m_contextitem, m_slot, Qt::DirectConnection, Q_ARG(float, m_undoValue.toDouble(&ok)))) { return 1; } else if (QMetaObject::invokeMethod(m_contextitem, m_slot, Qt::DirectConnection, Q_ARG(double, m_undoValue.toDouble(&ok)))) { return 1; } } return -1; } return QMetaObject::invokeMethod(m_contextitem, m_slot); } int PCommand::finish_hold( ) { return 1; } int PCommand::begin_hold( ) { return QMetaObject::invokeMethod(m_contextitem, m_slot); } traverso-0.49.4/src/commands/Fade.cpp000644 001750 001750 00000016347 11163362147 017731 0ustar00remonremon000000 000000 /* Copyright (C) 2006-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "Fade.h" #include "Curve.h" #include "AudioClip.h" #include "ContextPointer.h" #include #include #include #include #include #include "Project.h" #include "ProjectManager.h" // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" static const float CURSOR_SPEED = 150.0; static const float RASTER_SIZE = 0.05; FadeRange::FadeRange(AudioClip* clip, FadeCurve* curve, qint64 scalefactor) : Command(clip, "") , d(new Private()) { m_curve = curve; d->direction = (m_curve->get_fade_type() == FadeCurve::FadeIn) ? 1 : -1; d->scalefactor = scalefactor; setText( (d->direction == 1) ? tr("Fade In: length") : tr("Fade Out: length")); } FadeRange::FadeRange(AudioClip* clip, FadeCurve* curve, double newRange) : Command(clip, "") , d(new Private()) { m_curve = curve; d->direction = (m_curve->get_fade_type() == FadeCurve::FadeIn) ? 1 : -1; m_origRange = m_curve->get_range(); m_newRange = newRange; setText( (d->direction == 1) ? tr("Fade In: remove") : tr("Fade Out: remove")); } FadeRange::~FadeRange() {} int FadeRange::prepare_actions() { return 1; } int FadeRange::begin_hold() { d->origX = cpointer().on_first_input_event_x(); m_newRange = m_origRange = m_curve->get_range(); return 1; } int FadeRange::finish_hold() { QCursor::setPos(d->mousePos); delete d; return 1; } int FadeRange::do_action() { m_curve->set_range( m_newRange ); return 1; } int FadeRange::undo_action() { m_curve->set_range( m_origRange ); return 1; } void FadeRange::cancel_action() { finish_hold(); undo_action(); } void FadeRange::set_cursor_shape(int useX, int useY) { Q_UNUSED(useX); Q_UNUSED(useY); d->mousePos = QCursor::pos(); cpointer().get_viewport()->set_holdcursor(":/cursorHoldLr"); } int FadeRange::jog() { int dx = (d->origX - (cpointer().x()) ) * d->direction; m_newRange = m_origRange - ( dx * d->scalefactor); if (m_newRange < 1) { m_newRange = 1; } m_curve->set_range( m_newRange ); TimeRef location = TimeRef(m_newRange); cpointer().get_viewport()->set_holdcursor_text(timeref_to_ms_3(location)); return 1; } static float round_float( float f) { return float(int(0.5 + f / RASTER_SIZE)) * RASTER_SIZE; } /********** FadeBend **********/ /******************************/ FadeBend::FadeBend(FadeView * fadeview) : Command(fadeview->get_fade()) , m_fade(fadeview->get_fade()) , m_fv(fadeview) { setText( (m_fade->get_fade_type() == FadeCurve::FadeIn) ? tr("Fade In: bend") : tr("Fade Out: bend")); } FadeBend::FadeBend(FadeCurve *fade, double val) : Command(fade) , m_fade(fade) , m_fv(0) { setText( (m_fade->get_fade_type() == FadeCurve::FadeIn) ? tr("Fade In: bend") : tr("Fade Out: bend")); origBend = m_fade->get_bend_factor(); newBend = val; } int FadeBend::begin_hold() { PENTER; origY = cpointer().on_first_input_event_y(); oldValue = m_fade->get_bend_factor(); newBend = origBend = oldValue; m_fv->set_holding(true); return 1; } int FadeBend::finish_hold() { QCursor::setPos(mousePos); m_fv->set_holding(false); return 1; } int FadeBend::prepare_actions() { return 1; } int FadeBend::do_action() { m_fade->set_bend_factor(newBend); return 1; } int FadeBend::undo_action() { m_fade->set_bend_factor(origBend); return 1; } void FadeBend::cancel_action() { finish_hold(); undo_action(); } void FadeBend::set_cursor_shape(int useX, int useY) { Q_UNUSED(useX); Q_UNUSED(useY); mousePos = QCursor::pos(); cpointer().get_viewport()->set_holdcursor(":/cursorHoldUd"); } int FadeBend::jog() { int direction = (m_fade->get_fade_type() == FadeCurve::FadeIn) ? 1 : -1; float dx = (float(origY - cpointer().y()) / CURSOR_SPEED); if (m_fade->get_raster()) { float value = round_float(oldValue + dx * direction); m_fade->set_bend_factor(value); } else { m_fade->set_bend_factor(oldValue + dx * direction); } oldValue = m_fade->get_bend_factor(); newBend = oldValue; cpointer().get_viewport()->set_holdcursor_text(QByteArray::number(newBend, 'f', 2)); origY = cpointer().y(); return 1; } /********** FadeStrength **********/ /******************************/ FadeStrength::FadeStrength(FadeView* fadeview) : Command(fadeview->get_fade()) , m_fade(fadeview->get_fade()) , m_fv(fadeview) { setText( (m_fade->get_fade_type() == FadeCurve::FadeIn) ? tr("Fade In: strength") : tr("Fade Out: strength")); } FadeStrength::FadeStrength(FadeCurve *fade, double val) : Command(fade) , m_fade(fade) , m_fv(0) { setText( (m_fade->get_fade_type() == FadeCurve::FadeIn) ? tr("Fade In: strength") : tr("Fade Out: strength")); origStrength = m_fade->get_strength_factor(); newStrength = val; } int FadeStrength::begin_hold() { PENTER; origY = cpointer().on_first_input_event_y(); oldValue = m_fade->get_strength_factor(); newStrength = origStrength = oldValue; m_fv->set_holding(true); return 1; } int FadeStrength::finish_hold() { QCursor::setPos(mousePos); m_fv->set_holding(false); return 1; } int FadeStrength::prepare_actions() { return 1; } int FadeStrength::do_action() { m_fade->set_strength_factor(newStrength); return 1; } int FadeStrength::undo_action() { m_fade->set_strength_factor(origStrength); return 1; } void FadeStrength::cancel_action() { finish_hold(); undo_action(); } void FadeStrength::set_cursor_shape(int useX, int useY) { Q_UNUSED(useX); Q_UNUSED(useY); mousePos = QCursor::pos(); cpointer().get_viewport()->set_holdcursor(":/cursorHoldUd"); } int FadeStrength::jog() { float dy = float(origY - cpointer().y()) / CURSOR_SPEED; if (m_fade->get_bend_factor() >= 0.5) { m_fade->set_strength_factor(oldValue + dy ); } else { if (m_fade->get_raster()) { float value = round_float(oldValue + dy); m_fade->set_strength_factor(value); } else { m_fade->set_strength_factor(oldValue - dy); } } oldValue = m_fade->get_strength_factor(); newStrength = oldValue; cpointer().get_viewport()->set_holdcursor_text(QByteArray::number(newStrength, 'f', 2)); origY = cpointer().y(); return 1; } /********** FadeMode **********/ /******************************/ FadeMode::FadeMode(FadeCurve* fade, int oldMode, int newMode) : Command(fade) , m_fade(fade) { setText( (m_fade->get_fade_type() == FadeCurve::FadeIn) ? tr("Fade In: shape") : tr("Fade Out: shape")); m_newMode = newMode; m_oldMode = oldMode; } int FadeMode::prepare_actions() { return 1; } int FadeMode::do_action() { m_fade->set_mode(m_newMode); return 1; } int FadeMode::undo_action() { m_fade->set_mode(m_oldMode); return 1; } traverso-0.49.4/src/commands/CommandGroup.h000644 001750 001750 00000002664 11163362147 021127 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2006 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: CommandGroup.h,v 1.4 2007/04/17 19:56:45 r_sijrier Exp $ */ #ifndef COMMAND_GROUP_H #define COMMAND_GROUP_H #include "Command.h" #include class CommandGroup : public Command { public : CommandGroup(ContextItem* parent, const QString& des, bool historable=true) : Command(parent, des) { m_isHistorable = historable; }; ~CommandGroup(); int prepare_actions(); int do_action(); int undo_action(); void add_command(Command* cmd) { Q_ASSERT(cmd); m_commands.append(cmd); } ; private : QList m_commands; }; #endif traverso-0.49.4/src/commands/Import.cpp000644 001750 001750 00000010270 11163362147 020331 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include #include #include "ReadSource.h" #include "Import.h" #include "Utils.h" // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" Import::Import(const QString& fileName) : Command("") { init(0, fileName); } Import::Import(Track* track, const TimeRef& length, bool silent) : Command(track, "") { init(track, ""); m_silent = silent; m_initialLength = length; if (!m_silent) { setText(tr("Import Audio File")); } else { setText(tr("Insert Silence")); } } Import::Import(Track* track, const QString& fileName) : Command(track, tr("Import Audio File")) { init(track, fileName); } Import::Import(Track* track, const QString& fileName, const TimeRef& position) : Command(track, tr("Import Audio File")) { init(track, fileName); m_hasPosition = true; m_position = position; } void Import::init(Track* track, const QString& fileName) { m_clip = 0; m_source = 0; m_position = TimeRef(); m_silent = false; m_hasPosition = false; m_fileName = fileName; m_track = track; m_initialLength = TimeRef(); } Import::~Import() {} int Import::prepare_actions() { PENTER; if (m_silent) { m_source = resources_manager()->get_silent_readsource(); m_name = tr("Silence"); m_fileName = tr("Silence"); create_audioclip(); } else if (m_fileName.isEmpty()) { QString allFiles = tr("All files (*)"); QString activeFilter = tr("Audio files (*.wav *.flac *.ogg *.mp3 *.wv *.w64)"); m_fileName = QFileDialog::getOpenFileName(0, tr("Import audio source"), pm().get_project()->get_import_dir(), allFiles + ";;" + activeFilter, &activeFilter); int splitpoint = m_fileName.lastIndexOf("/") + 1; QString dir = m_fileName.left(splitpoint - 1); if (m_fileName.isEmpty()) { PWARN("Import:: FileName is empty!"); return -1; } pm().get_project()->set_import_dir(dir); if (create_readsource() == -1) { return -1; } create_audioclip(); } return 1; } int Import::create_readsource() { int splitpoint = m_fileName.lastIndexOf("/") + 1; int length = m_fileName.length(); QString dir = m_fileName.left(splitpoint - 1) + "/"; m_name = m_fileName.right(length - splitpoint); m_source = resources_manager()->import_source(dir, m_name); if (! m_source) { PERROR("Can't import audiofile %s", QS_C(m_fileName)); return -1; } return 1; } void Import::create_audioclip() { Q_ASSERT(m_track); m_clip = resources_manager()->new_audio_clip(m_name); resources_manager()->set_source_for_clip(m_clip, m_source); m_clip->set_sheet(m_track->get_sheet()); m_clip->set_track(m_track); TimeRef startLocation; if (!m_hasPosition) { if (!m_track->get_cliplist().isEmpty()) { AudioClip* lastClip = m_track->get_cliplist().last(); startLocation = lastClip->get_track_end_location(); } } else { startLocation = m_position; } m_clip->set_track_start_location(startLocation); if (m_initialLength > qint64(0)) { m_clip->set_right_edge(m_initialLength + startLocation); } } void Import::set_track(Track * track) { m_track = track; } void Import::set_position(const TimeRef& position) { m_hasPosition = true; m_position = position; } int Import::do_action() { PENTER; if (! m_clip) { create_audioclip(); } Command::process_command(m_track->add_clip(m_clip, false)); return 1; } int Import::undo_action() { PENTER; Command::process_command(m_track->remove_clip(m_clip, false)); return 1; } // eof traverso-0.49.4/src/commands/MoveClip.cpp000644 001750 001750 00000030437 11163362147 020604 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2008 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "MoveClip.h" #include "AudioClip.h" #include "AudioClipManager.h" #include "ContextPointer.h" #include "InputEngine.h" #include "SnapList.h" #include "Sheet.h" #include "Track.h" #include "TimeLine.h" #include "ClipsViewPort.h" #include "SheetView.h" #include "TrackView.h" #include "AudioClipView.h" #include "Zoom.h" // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" /** * \class MoveClip \brief A Command class for Dragging or Copy-dragging an AudioClip \sa TraversoCommands */ /** * Creates a Move Clip or Copy Clip Command object. */ MoveClip::MoveClip(ViewItem* view, QVariantList args) : Command(view->get_context(), "") , d(new Data) { QString action = "move"; // default action! if (args.size() > 0) { action = args.at(0).toString(); } if (args.size() > 1) { d->verticalOnly = args.at(1).toBool(); } else { d->verticalOnly = false; } QString des; if (action == "copy") { des = tr("Copy Clip"); m_actionType = COPY; } else if (action == "move") { des = tr("Move Clip"); m_actionType = MOVE; } else if (action == "move_to_start") { des = tr("Move Clip To Start"); m_actionType = MOVE_TO_START; } else if (action == "move_to_end") { des = tr("Move Clip To End"); m_actionType = MOVE_TO_END; } else if (action == "fold_sheet") { des = tr("Fold Sheet"); m_actionType = FOLD_SHEET; } else if (action == "fold_track") { des = tr("Fold Track"); m_actionType = FOLD_TRACK; } else if (action == "fold_markers") { des = tr("Fold Markers"); m_actionType = FOLD_MARKERS; } else { PERROR("MoveClip: Unknown action type: %s", QS_C(action)); } setText(des); if (m_actionType == FOLD_SHEET || m_actionType == FOLD_TRACK || m_actionType == FOLD_MARKERS) { QList movingClips; QList tracks; if (m_actionType == FOLD_TRACK) { TrackView* tv = qobject_cast(view); Q_ASSERT(tv); d->sv= tv->get_sheetview(); tracks.append(tv->get_track()); } else if (m_actionType == FOLD_SHEET) { d->sv = qobject_cast(view); Q_ASSERT(d->sv); tracks = d->sv->get_sheet()->get_tracks(); } else { d->sv = qobject_cast(view->get_sheetview()); Q_ASSERT(d->sv); } TimeRef currentLocation = TimeRef(cpointer().on_first_input_event_scene_x() * d->sv->timeref_scalefactor); if (d->sv->get_trackview_under(cpointer().scene_pos())) { d->pointedTrackIndex = d->sv->get_trackview_under(cpointer().scene_pos())->get_track()->get_sort_index(); } else { d->pointedTrackIndex = 0; } if (m_actionType == FOLD_SHEET || m_actionType == FOLD_MARKERS) { QList movingMarkers = d->sv->get_sheet()->get_timeline()->get_markers(); foreach(Marker* marker, movingMarkers) { if (marker->get_when() > currentLocation) { MarkerAndOrigin markerAndOrigin; markerAndOrigin.marker = marker; markerAndOrigin.origin = marker->get_when(); m_markers.append(markerAndOrigin); } } } if (m_actionType == FOLD_SHEET || m_actionType == FOLD_TRACK) { foreach(Track* track, tracks) { QList clips = track->get_cliplist(); foreach(AudioClip* clip, clips) { if (clip->get_track_end_location() > currentLocation) { movingClips.append(clip); } } } } m_group.set_clips(movingClips); } else { AudioClipView* cv = qobject_cast(view); Q_ASSERT(cv); d->sv = cv->get_sheetview(); AudioClip* clip = cv->get_clip(); if (clip->is_selected()) { QList selected; clip->get_sheet()->get_audioclip_manager()->get_selected_clips(selected); m_group.set_clips(selected); } else { m_group.add_clip(clip); } d->pointedTrackIndex = clip->get_track()->get_sort_index(); } m_origTrackIndex = m_newTrackIndex = m_group.get_track_index(); if (m_group.get_size() == 0 && m_markers.count() > 0) { m_trackStartLocation = m_markers[0].origin; } else { m_trackStartLocation = m_group.get_track_start_location(); } m_sheet = d->sv->get_sheet(); d->zoom = 0; } MoveClip::~MoveClip() { if (d) { if (d->zoom) { delete d->zoom; } delete d; } } int MoveClip::begin_hold() { if ((!m_group.get_size() || m_group.is_locked()) && !m_markers.count()) { return -1; } if (m_actionType == COPY) { // FIXME Memory leak here! QList newclips = m_group.copy_clips(); m_group.set_clips(newclips); m_group.add_all_clips_to_tracks(); m_group.move_to(m_origTrackIndex, m_trackStartLocation + TimeRef(d->sv->timeref_scalefactor * 3)); } m_group.set_as_moving(true); d->sv->stop_follow_play_head(); d->sv->start_shuttle(true, true); d->sceneXStartPos = cpointer().on_first_input_event_scene_x(); return 1; } int MoveClip::finish_hold() { m_group.set_as_moving(false); d->sv->start_shuttle(false); return 1; } int MoveClip::prepare_actions() { if (d->zoom) { delete d->zoom; } delete d; d = 0; if (m_actionType == COPY) { m_group.remove_all_clips_from_tracks(); } if (m_origTrackIndex == m_newTrackIndex && m_posDiff == TimeRef() && ! (m_actionType == COPY || m_actionType == MOVE_TO_START || m_actionType == MOVE_TO_END) ) { return -1; } return 1; } int MoveClip::do_action() { PENTER; if (m_actionType == MOVE || m_actionType == FOLD_SHEET || m_actionType == FOLD_TRACK) { m_group.move_to(m_newTrackIndex, m_trackStartLocation + m_posDiff); } else if (m_actionType == COPY) { m_group.add_all_clips_to_tracks(); m_group.move_to(m_newTrackIndex, m_trackStartLocation + m_posDiff); } else if (m_actionType == MOVE_TO_START) { move_to_start(false); } else if (m_actionType == MOVE_TO_END) { move_to_end(false); } foreach(MarkerAndOrigin markerAndOrigin, m_markers) { markerAndOrigin.marker->set_when(markerAndOrigin.origin + m_posDiff); } return 1; } int MoveClip::undo_action() { PENTER; if (m_actionType == COPY) { m_group.remove_all_clips_from_tracks(); } else { m_group.move_to(m_origTrackIndex, m_trackStartLocation); } foreach(MarkerAndOrigin markerAndOrigin, m_markers) { markerAndOrigin.marker->set_when(markerAndOrigin.origin); } return 1; } void MoveClip::cancel_action() { finish_hold(); undo_action(); } int MoveClip::jog() { if (d->zoom) { d->zoom->jog(); return 0; } TrackView* trackView = d->sv->get_trackview_under(cpointer().scene_pos()); int deltaTrackIndex = 0; if (trackView/* && !(m_actionType == FOLD_SHEET)*/) { deltaTrackIndex = trackView->get_track()->get_sort_index() - d->pointedTrackIndex; m_group.check_valid_track_index_delta(deltaTrackIndex); m_newTrackIndex = m_newTrackIndex + deltaTrackIndex; d->pointedTrackIndex = trackView->get_track()->get_sort_index(); } // Calculate the distance moved based on the current scene x pos and the initial one. // Only assign if we the movements is allowed in horizontal direction TimeRef diff_f; if (!d->verticalOnly) { diff_f = (cpointer().scene_x() - d->sceneXStartPos) * d->sv->timeref_scalefactor; } // If the moved distance (diff_f) makes as go beyond the left most position (== 0, or TimeRef()) // set the newTrackStartLocation to 0. Else calculate it based on the original track start location // and the distance moved. TimeRef newTrackStartLocation; if (diff_f < TimeRef() && m_trackStartLocation < (-1 * diff_f)) { newTrackStartLocation = qint64(0); } else { newTrackStartLocation = m_trackStartLocation + diff_f; } // substract the snap distance, if snap is turned on. if (m_sheet->is_snap_on() && !d->verticalOnly) { newTrackStartLocation -= m_sheet->get_snap_list()->calculate_snap_diff(newTrackStartLocation, newTrackStartLocation + m_group.get_length()); } // Now that the new track start location is known, the position diff can be calculated m_posDiff = newTrackStartLocation - m_trackStartLocation; // and used to move the group to it's new location. m_group.move_to(m_newTrackIndex, m_trackStartLocation + m_posDiff); // and used to move the markers foreach(MarkerAndOrigin markerAndOrigin, m_markers) { markerAndOrigin.marker->set_when(markerAndOrigin.origin + m_posDiff); } d->sv->update_shuttle_factor(); cpointer().get_viewport()->set_holdcursor_pos(d->sv->get_clips_viewport()->mapToScene(cpointer().pos()).toPoint()); cpointer().get_viewport()->set_holdcursor_text(timeref_to_text(newTrackStartLocation, d->sv->timeref_scalefactor)); return 1; } void MoveClip::next_snap_pos(bool autorepeat) { Q_UNUSED(autorepeat); do_prev_next_snap(m_sheet->get_snap_list()->next_snap_pos(m_group.get_track_start_location()), m_sheet->get_snap_list()->next_snap_pos(m_group.get_track_end_location())); } void MoveClip::prev_snap_pos(bool autorepeat) { Q_UNUSED(autorepeat); do_prev_next_snap(m_sheet->get_snap_list()->prev_snap_pos(m_group.get_track_start_location()), m_sheet->get_snap_list()->prev_snap_pos(m_group.get_track_end_location())); } void MoveClip::do_prev_next_snap(TimeRef trackStartLocation, TimeRef trackEndLocation) { if (d->verticalOnly) return; ie().bypass_jog_until_mouse_movements_exceeded_manhattenlength(); trackStartLocation -= m_sheet->get_snap_list()->calculate_snap_diff(trackStartLocation, trackEndLocation); m_posDiff = trackStartLocation - m_trackStartLocation; do_move(); } void MoveClip::move_to_start(bool autorepeat) { Q_UNUSED(autorepeat); m_group.move_to(m_group.get_track_index(), TimeRef()); } void MoveClip::move_to_end(bool autorepeat) { Q_UNUSED(autorepeat); m_group.move_to(m_group.get_track_index(), m_sheet->get_last_location()); } void MoveClip::move_up(bool autorepeat) { Q_UNUSED(autorepeat); ie().bypass_jog_until_mouse_movements_exceeded_manhattenlength(); int deltaTrackIndex = -1; m_group.check_valid_track_index_delta(deltaTrackIndex); m_newTrackIndex = m_newTrackIndex + deltaTrackIndex; do_move(); } void MoveClip::move_down(bool autorepeat) { Q_UNUSED(autorepeat); ie().bypass_jog_until_mouse_movements_exceeded_manhattenlength(); int deltaTrackIndex = 1; m_group.check_valid_track_index_delta(deltaTrackIndex); m_newTrackIndex = m_newTrackIndex + deltaTrackIndex; do_move(); } void MoveClip::move_left(bool autorepeat) { Q_UNUSED(autorepeat); if (d->verticalOnly) return; ie().bypass_jog_until_mouse_movements_exceeded_manhattenlength(); m_posDiff -= d->sv->timeref_scalefactor; do_move(); } void MoveClip::move_right(bool autorepeat) { Q_UNUSED(autorepeat); if (d->verticalOnly) return; ie().bypass_jog_until_mouse_movements_exceeded_manhattenlength(); m_posDiff += d->sv->timeref_scalefactor; do_move(); } void MoveClip::start_zoom(bool autorepeat) { if (autorepeat) return; if (!d->zoom) { d->zoom = new Zoom(d->sv, QList() << "HJogZoom" << "1.2" << "0.2"); d->zoom->begin_hold(); cpointer().get_viewport()->set_holdcursor(":/cursorZoomHorizontal"); d->sv->start_shuttle(false); } else { cpointer().get_viewport()->set_holdcursor(":/cursorHoldLrud"); d->sv->start_shuttle(true, true); } } void MoveClip::set_cursor_shape(int useX, int useY) { if (useX && useY) { cpointer().get_viewport()->set_holdcursor(":/cursorHoldLrud"); } else if (useX) { cpointer().get_viewport()->set_holdcursor(":/cursorHoldLr"); } else { cpointer().get_viewport()->set_holdcursor(":/cursorHoldUd"); } } void MoveClip::toggle_vertical_only(bool autorepeat) { if (autorepeat) return; d->verticalOnly = !d->verticalOnly; if (d->verticalOnly) { set_cursor_shape(0, 1); } else { set_cursor_shape(1, 1); } } void MoveClip::do_move() { m_group.move_to(m_newTrackIndex, m_trackStartLocation + m_posDiff); if (d) { cpointer().get_viewport()->set_holdcursor_text(timeref_to_text(m_trackStartLocation + m_posDiff, d->sv->timeref_scalefactor)); } } traverso-0.49.4/src/commands/commands.h000644 001750 001750 00000000603 11163362147 020324 0ustar00remonremon000000 000000 #include "SplitClip.h" #include "MoveClip.h" #include "MoveEdge.h" #include "TrackPan.h" #include "Zoom.h" #include "Import.h" #include "PCommand.h" #include "ClipSelection.h" #include "Fade.h" #include "Gain.h" #include "CommandGroup.h" #include "AddRemove.h" #include "AudioClipExternalProcessing.h" #include "ArmTracks.h" #include "RemoveClip.h" #include "Scroll.h" #include "Crop.h" traverso-0.49.4/src/commands/ClipSelection.cpp000644 001750 001750 00000004217 11163362147 021620 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2008 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "ClipSelection.h" #include "AudioClipManager.h" #include #include "ContextPointer.h" #include #include #include "Debugger.h" ClipSelection::ClipSelection(AudioClip* clip, QVariantList args) : Command("") { QString slot = args.at(0).toString(); if (slot == "remove_from_selection") { setText(tr("Selection: Remove Clip")); } else if (slot == "add_to_selection") { setText(tr("Selection: Add Clip")); } else if (slot == "select_clip") { setText(tr("Select Clip")); } m_clips.append( clip ); m_slot = qstrdup(QS_C(slot)); m_acmanager = clip->get_sheet()->get_audioclip_manager(); } ClipSelection::ClipSelection( QList< AudioClip * > clips, AudioClipManager * manager, const char * slot, const QString& des ) : Command("") { m_clips = clips; m_slot = slot; m_acmanager = manager; } ClipSelection::~ClipSelection() {} int ClipSelection::begin_hold() { return -1; } int ClipSelection::finish_hold() { return -1; } int ClipSelection::prepare_actions() { return 1; } int ClipSelection::do_action() { foreach(AudioClip* clip, m_clips) { if ( ! QMetaObject::invokeMethod(m_acmanager, m_slot, Q_ARG(AudioClip*, clip))) { PERROR("AudioClip::%s failed for %s", m_slot, QS_C(clip->get_name())); } } return 1; } int ClipSelection::undo_action() { return 1; } void ClipSelection::cancel_action() { undo_action(); } int ClipSelection::jog() { return -1; } traverso-0.49.4/src/commands/MoveClip.h000644 001750 001750 00000005474 11163362147 020254 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2008 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef MOVECLIPACTION_H #define MOVECLIPACTION_H #include "Command.h" #include #include #include "AudioClipGroup.h" #include "Marker.h" class AudioClip; class Sheet; class Track; class SheetView; class ViewItem; class Zoom; typedef struct { Marker* marker; TimeRef origin; } MarkerAndOrigin; class MoveClip : public Command { Q_OBJECT Q_CLASSINFO("next_snap_pos", tr("To next snap position")); Q_CLASSINFO("prev_snap_pos", tr("To previous snap position")); Q_CLASSINFO("start_zoom", tr("Jog Zoom")); Q_CLASSINFO("move_up", tr("Move Up")); Q_CLASSINFO("move_down", tr("Move Down")); Q_CLASSINFO("move_left", tr("Move Left")); Q_CLASSINFO("move_right", tr("Move Right")); Q_CLASSINFO("toggle_vertical_only", tr("Toggle Vertical Only")); public : MoveClip(ViewItem* view, QVariantList args); ~MoveClip(); int begin_hold(); int finish_hold(); int prepare_actions(); int do_action(); int undo_action(); void cancel_action(); int jog(); void set_cursor_shape(int useX, int useY); private : enum ActionType { MOVE, COPY, FOLD_TRACK, FOLD_SHEET, FOLD_MARKERS, MOVE_TO_START, MOVE_TO_END }; Sheet* m_sheet; AudioClipGroup m_group; QList m_markers; TimeRef m_trackStartLocation; TimeRef m_posDiff; ActionType m_actionType; int m_origTrackIndex; int m_newTrackIndex; struct Data { SheetView* sv; int sceneXStartPos; int pointedTrackIndex; bool verticalOnly; Zoom* zoom; }; Data* d; void do_prev_next_snap(TimeRef trackStartLocation, TimeRef trackEndLocation); void do_move(); public slots: void next_snap_pos(bool autorepeat); void prev_snap_pos(bool autorepeat); void move_to_start(bool autorepeat); void move_to_end(bool autorepeat); void move_up(bool autorepeat);; void move_down(bool autorepeat); void move_left(bool autorepeat); void move_right(bool autorepeat); void start_zoom(bool autorepeat); void toggle_vertical_only(bool autorepeat); }; #endif traverso-0.49.4/src/commands/ui/000755 001750 001750 00000000000 11163362200 016756 5ustar00remonremon000000 000000 traverso-0.49.4/src/commands/ui/ExternalProcessingDialog.ui000644 001750 001750 00000010672 11163362147 024274 0ustar00remonremon000000 000000 ExternalProcessingDialog 0 0 430 316 380 0 460 400 External Processing 9 6 0 6 0 6 Program Arguments Progress 0 6 sox 0 6 100 0 0 true Qt::Horizontal 0 6 Qt::Horizontal 40 20 Start Cancel Program output false Qt::TextSelectableByMouse traverso-0.49.4/src/commands/MoveEdge.cpp000644 001750 001750 00000005745 11163362147 020565 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2009 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "MoveEdge.h" #include "AudioClip.h" #include "ContextPointer.h" #include "Sheet.h" #include "SnapList.h" #include #include // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" // FIXME: MoveEdge::jog() continuously calls Snaplist::mark_dirty() MoveEdge::MoveEdge(AudioClipView* cv, SheetView* sv, QByteArray whichEdge) : Command(cv->get_clip(), tr("Move Clip Edge")) { m_sv = sv; m_clip = cv->get_clip(); m_edge = whichEdge; } MoveEdge::~MoveEdge() {} int MoveEdge::prepare_actions() { PENTER; if (m_newPos == m_originalPos) { // Nothing happened! return -1; } return 1; } int MoveEdge::begin_hold() { PENTER; if (m_edge == "set_left_edge") { m_newPos = m_originalPos = m_clip->get_track_start_location(); m_otherEdgePos = m_clip->get_track_end_location(); } if (m_edge == "set_right_edge") { m_newPos = m_originalPos = m_clip->get_track_end_location(); m_otherEdgePos = m_clip->get_track_start_location(); } m_clip->set_snappable(false); m_sv->stop_follow_play_head(); return 1; } int MoveEdge::finish_hold() { m_clip->set_snappable(true); return 1; } void MoveEdge::cancel_action() { finish_hold(); undo_action(); } int MoveEdge::do_action() { if (m_edge == "set_right_edge") { m_clip->set_right_edge(m_newPos); } if (m_edge == "set_left_edge") { m_clip->set_left_edge(m_newPos); } return 1; } int MoveEdge::undo_action() { if (m_edge == "set_right_edge") { m_clip->set_right_edge(m_originalPos); } if (m_edge == "set_left_edge") { m_clip->set_left_edge(m_originalPos); } return 1; } int MoveEdge::jog() { m_newPos = TimeRef(cpointer().scene_x() * m_sv->timeref_scalefactor); if (m_sv->get_sheet()->is_snap_on()) { SnapList* slist = m_sv->get_sheet()->get_snap_list(); m_newPos = slist->get_snap_value(m_newPos); } if (m_edge == "set_right_edge" && m_newPos < (m_otherEdgePos + (2 * m_sv->timeref_scalefactor)) ) { m_newPos = m_otherEdgePos + (2 * m_sv->timeref_scalefactor); } if (m_edge == "set_left_edge" && m_newPos > (m_otherEdgePos - (2 * m_sv->timeref_scalefactor)) ) { m_newPos = m_otherEdgePos - (2 * m_sv->timeref_scalefactor); } return do_action(); } // eof traverso-0.49.4/src/commands/Crop.cpp000644 001750 001750 00000013310 11163362147 017760 0ustar00remonremon000000 000000 /* Copyright (C) 2009 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "Crop.h" #include "AudioClipView.h" #include "ContextPointer.h" #include "Command.h" #include "Fade.h" #include "SheetView.h" #include "LineView.h" #include "AudioClip.h" #include "ResourcesManager.h" #include "ProjectManager.h" #include "Sheet.h" #include "Track.h" #include "InputEngine.h" #include #include // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" /** * \class Crop \brief \sa TraversoCommands */ Crop::Crop(AudioClipView* view) : Command(view->get_context(), tr("AudioClip: Magnetic Cut")) , m_cv(view) { m_clip = view->get_clip(); m_track = m_clip->get_track(); m_selection = new QGraphicsRectItem(m_cv); m_selection->setBrush(QColor(0, 0, 255, 100)); m_selection->setPen(QPen(Qt::NoPen)); // Set the selection Z value to something sufficiently high // to be _always_ on top of all the child views of m_cv m_selection->setZValue(m_cv->zValue() + 20); x2 = -1; x1 = LLONG_MAX; } Crop::~Crop() {} int Crop::prepare_actions() { leftClip = resources_manager()->get_clip(m_clip->get_id()); rightClip = resources_manager()->get_clip(m_clip->get_id()); leftClip->set_sheet(m_clip->get_sheet()); leftClip->set_track_start_location(m_clip->get_track_start_location()); leftClip->set_right_edge(TimeRef(x1 * m_cv->get_sheetview()->timeref_scalefactor) + m_clip->get_track_start_location()); if (leftClip->get_fade_out()) { FadeRange* cmd = (FadeRange*)leftClip->reset_fade_out(); cmd->set_historable(false); Command::process_command(cmd); } rightClip->set_sheet(m_clip->get_sheet()); rightClip->set_left_edge(TimeRef(x2 * m_cv->get_sheetview()->timeref_scalefactor) + m_clip->get_track_start_location()); rightClip->set_track_start_location(leftClip->get_track_end_location()); if (rightClip->get_fade_in()) { FadeRange* cmd = (FadeRange*)rightClip->reset_fade_in(); cmd->set_historable(false); Command::process_command(cmd); } return 1; } int Crop::begin_hold() { return 1; } int Crop::finish_hold() { delete m_selection; return 1; } int Crop::do_action() { PENTER; Command::process_command(m_track->add_clip(leftClip, false)); Command::process_command(m_track->add_clip(rightClip, false)); Command::process_command(m_track->remove_clip(m_clip, false)); return 1; } int Crop::undo_action() { PENTER; Command::process_command(m_track->add_clip(m_clip, false)); Command::process_command(m_track->remove_clip(leftClip, false)); Command::process_command(m_track->remove_clip(rightClip, false)); return 1; } void Crop::cancel_action() { finish_hold(); } int Crop::jog() { PENTER; int x = cpointer().scene_x(); if (x < 0) { x = 0; } long long splitPoint = x * m_cv->get_sheetview()->timeref_scalefactor; QPointF point = m_cv->mapFromScene(splitPoint / m_cv->get_sheetview()->timeref_scalefactor, cpointer().y()); int xpos = (int) point.x(); if (xpos < 0) { xpos = 0; } if (xpos > m_cv->boundingRect().width()) { xpos = (int)m_cv->boundingRect().width(); } if (xpos < x1) x1 = xpos; if (xpos > x2) x2 = xpos; QRectF rect(0, 0, x2 - x1, m_cv->boundingRect().height()); m_selection->setRect(rect); m_selection->setPos(x1, 0); return 1; } void Crop::adjust_left(bool autorepeat) { ie().bypass_jog_until_mouse_movements_exceeded_manhattenlength(); int x = (int) m_selection->mapFromScene(cpointer().scene_x(), cpointer().y()).x(); if (x < (m_selection->boundingRect().width() / 2)) { x1 -= 1; if (x1 < 0) x1 = 0; } else { if (x2 > (x1 + 1)) { x2 -= 1; } } QRectF rect(0, 0, x2 - x1, m_cv->boundingRect().height()); m_selection->setRect(rect); m_selection->setPos(x1, 0); } void Crop::adjust_right(bool autorepeat) { ie().bypass_jog_until_mouse_movements_exceeded_manhattenlength(); int x = (int) m_selection->mapFromScene(cpointer().scene_x(), cpointer().y()).x(); if (x < (m_selection->boundingRect().width() / 2)) { if (x2 > (x1 + 1)) { x1 += 1; } } else { x2 += 1; if (x2 > m_cv->boundingRect().width()) { x2 = (int)m_cv->boundingRect().width(); } } QRectF rect(0, 0, x2 - x1, m_cv->boundingRect().height()); m_selection->setRect(rect); m_selection->setPos(x1, 0); } traverso-0.49.4/src/commands/CommandGroup.cpp000644 001750 001750 00000003317 12357214027 021455 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2006 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: CommandGroup.cpp,v 1.6 2007/04/30 10:09:11 r_sijrier Exp $ */ #include "CommandGroup.h" #include // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" /** \class CommandGroup * \brief A class to return a group of Command objects as one history object to the historystack * */ CommandGroup::~ CommandGroup() { foreach(Command* cmd, m_commands) { delete cmd; } } int CommandGroup::prepare_actions() { if (m_commands.size() == 0) { return -1; } int result = 1; foreach(Command* cmd, m_commands) { if (cmd->prepare_actions() == -1) { printf("one of the commands in the group failed prepare_actions\n"); result = -1; } } return result; } int CommandGroup::do_action() { foreach(Command* cmd, m_commands) { cmd->do_action(); } return 1; } int CommandGroup::undo_action() { foreach(Command* cmd, m_commands) { cmd->undo_action(); } return 1; } // eof traverso-0.49.4/src/commands/Fade.h000644 001750 001750 00000005433 11163362147 017370 0ustar00remonremon000000 000000 /* Copyright (C) 2006 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: Fade.h,v 1.13 2008/01/21 16:22:11 r_sijrier Exp $ */ #ifndef FADE_H #define FADE_H #include "Command.h" class Curve; class AudioClip; class FadeCurve; class FadeView; class SheetView; class FadeRange : public Command { public : FadeRange(AudioClip* clip, FadeCurve* curve, qint64 scalefactor); FadeRange(AudioClip* clip, FadeCurve* curve, double newVal); ~FadeRange(); int begin_hold(); int finish_hold(); int prepare_actions(); int do_action(); int undo_action(); void cancel_action(); int jog(); void set_cursor_shape(int useX, int useY); private : FadeCurve* m_curve; double m_origRange; double m_newRange; class Private { public: int origX; int direction; QPoint mousePos; qint64 scalefactor; }; Private* d; }; class FadeStrength : public Command { public : FadeStrength(FadeView* fadeview); FadeStrength(FadeCurve* fade, double val); ~FadeStrength(){}; int begin_hold(); int finish_hold(); int prepare_actions(); int do_action(); int undo_action(); void cancel_action(); int jog(); void set_cursor_shape(int useX, int useY); private : float oldValue; int origY; double origStrength; double newStrength; FadeCurve* m_fade; FadeView* m_fv; QPoint mousePos; }; class FadeBend : public Command { public : FadeBend(FadeView* fadeview); FadeBend(FadeCurve* fade, double val); ~FadeBend(){}; int begin_hold(); int finish_hold(); int prepare_actions(); int do_action(); int undo_action(); void cancel_action(); int jog(); void set_cursor_shape(int useX, int useY); private : float oldValue; int origY; double origBend; double newBend; FadeCurve* m_fade; FadeView* m_fv; QPoint mousePos; }; class FadeMode : public Command { public : FadeMode(FadeCurve* fade, int oldMode, int newMode); ~FadeMode(){}; int prepare_actions(); int do_action(); int undo_action(); private : int m_oldMode; int m_newMode; FadeCurve* m_fade; }; #endif traverso-0.49.4/src/commands/AudioClipExternalProcessing.h000644 001750 001750 00000002322 11163362147 024134 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef AUDIOCLIP_EXTERNAL_PROCESSING_H #define AUDIOCLIP_EXTERNAL_PROCESSING_H #include class AudioClip; class Track; class AudioClipExternalProcessing : public Command { public : AudioClipExternalProcessing(AudioClip* object); ~AudioClipExternalProcessing(); int prepare_actions(); int do_action(); int undo_action(); // private : Track* m_track; AudioClip* m_clip; AudioClip* m_resultingclip; // friend class ExternalProcessingDialog; }; #endif //eof traverso-0.49.4/src/core/000755 001750 001750 00000000000 12417542747 015513 5ustar00remonremon000000 000000 traverso-0.49.4/src/core/AudioSource.h000644 001750 001750 00000003704 11163362147 020101 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef AUDIOSOURCE_H #define AUDIOSOURCE_H #include "defines.h" #include #include "RingBufferNPT.h" class QString; /// The base class for AudioSources like ReadSource and WriteSource class AudioSource : public QObject { public : AudioSource(); AudioSource(const QString& dir, const QString& name); ~AudioSource(); void set_name(const QString& name); void set_dir(const QString& name); void set_original_bit_depth(uint bitDepth); void set_created_by_sheet(qint64 id); QString get_filename() const; QString get_dir() const; QString get_name() const; QString get_short_name() const; qint64 get_id() const; qint64 get_orig_sheet_id() const {return m_origSheetId;} int get_rate() const; uint get_channel_count() const; int get_bit_depth() const; protected: QList*> m_buffers; uint m_bufferSize; uint m_chunkSize; int m_channelCount; qint64 m_origSheetId; QString m_dir; qint64 m_id; QString m_name; QString m_shortName; uint m_origBitDepth; QString m_fileName; uint m_rate; int m_wasRecording; }; inline uint AudioSource::get_channel_count( ) const {return m_channelCount;} inline qint64 AudioSource::get_id( ) const {return m_id;} #endif traverso-0.49.4/src/core/Sheet.cpp000644 001750 001750 00000114632 12417542747 017276 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include #include #include #include #include #include #include #include #include #include "AbstractAudioReader.h" #include #include #include #include "ProjectManager.h" #include "ContextPointer.h" #include "Information.h" #include "Sheet.h" #include "Project.h" #include "Track.h" #include "Mixer.h" #include "AudioSource.h" #include "AudioClip.h" #include "Peak.h" #include "Export.h" #include "DiskIO.h" #include "WriteSource.h" #include "AudioClipManager.h" #include "Tsar.h" #include "SnapList.h" #include "Config.h" #include "Utils.h" #include "ContextItem.h" #include "TimeLine.h" #include "Marker.h" #include "InputEngine.h" #include #include // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" /** \class Sheet \brief The 'work space' (as in WorkSheet) holding the Track 's and the Master Out AudioBus A Sheet processes each Track, and mixes the result into it's Master Out AudioBus. Sheet connects it's Client to the AudioDevice, to become part of audio processing chain. The connection is instantiated by Project, who owns the Sheet objects. */ Sheet::Sheet(Project* project) : ContextItem() , m_project(project) { PENTERCONS; title = tr("Untitled"); m_id = create_id(); artists = tr("No artists name set"); init(); } Sheet::Sheet(Project* project, int numtracks) : ContextItem() , m_project(project) { PENTERCONS; title = tr("Untitled"); m_id = create_id(); artists = tr("No artists name set"); m_hzoom = config().get_property("Sheet", "hzoomLevel", 8192).toInt(); init(); for (int i=1; i <= numtracks; i++) { Track* track = create_track(); private_add_track(track); } } Sheet::Sheet(Project* project, const QDomNode node) : ContextItem(), m_project(project) { PENTERCONS; QDomNode propertiesNode = node.firstChildElement("Properties"); m_id = node.toElement().attribute("id", "0").toLongLong(); if (m_id == 0) { m_id = create_id(); } init(); set_state( node ); } Sheet::~Sheet() { PENTERDES; delete [] mixdown; delete [] gainbuffer; delete m_diskio; delete m_masterOut; delete m_renderBus; delete m_clipRenderBus; delete m_hs; delete m_audiodeviceClient; delete snaplist; delete workSnap; } void Sheet::init() { PENTER2; #if defined (THREAD_CHECK) threadId = QThread::currentThreadId (); #endif QObject::tr("Sheet"); m_diskio = new DiskIO(this); m_currentSampleRate = audiodevice().get_sample_rate(); m_diskio->output_rate_changed(m_currentSampleRate); int converter_type = config().get_property("Conversion", "RTResamplingConverterType", DEFAULT_RESAMPLE_QUALITY).toInt(); m_diskio->set_resample_quality(converter_type); connect(this, SIGNAL(seekStart()), m_diskio, SLOT(seek()), Qt::QueuedConnection); connect(this, SIGNAL(prepareRecording()), this, SLOT(prepare_recording())); connect(&audiodevice(), SIGNAL(clientRemoved(TAudioDeviceClient*)), this, SLOT (audiodevice_client_removed(TAudioDeviceClient*))); connect(&audiodevice(), SIGNAL(started()), this, SLOT(audiodevice_started())); connect(&audiodevice(), SIGNAL(driverParamsChanged()), this, SLOT(audiodevice_params_changed()), Qt::DirectConnection); connect(m_diskio, SIGNAL(seekFinished()), this, SLOT(seek_finished()), Qt::QueuedConnection); connect (m_diskio, SIGNAL(readSourceBufferUnderRun()), this, SLOT(handle_diskio_readbuffer_underrun())); connect (m_diskio, SIGNAL(writeSourceBufferOverRun()), this, SLOT(handle_diskio_writebuffer_overrun())); connect(&config(), SIGNAL(configChanged()), this, SLOT(config_changed())); connect(this, SIGNAL(transportStarted()), m_diskio, SLOT(start_io())); connect(this, SIGNAL(transportStopped()), m_diskio, SLOT(stop_io())); mixdown = gainbuffer = 0; m_masterOut = new AudioBus("Master Out", 2); m_renderBus = new AudioBus("Render Bus", 2); m_clipRenderBus = new AudioBus("Clip Render Bus", 2); resize_buffer(false, audiodevice().get_buffer_size()); m_hs = new QUndoStack(pm().get_undogroup()); set_history_stack(m_hs); m_acmanager = new AudioClipManager(this); set_context_item( m_acmanager ); m_playBackBus = audiodevice().get_playback_bus("Playback 1"); m_transport = m_stopTransport = m_resumeTransport = m_readyToRecord = false; snaplist = new SnapList(this); workSnap = new Snappable(); workSnap->set_snap_list(snaplist); m_realtimepath = false; m_scheduledForDeletion = false; m_isSnapOn=true; changed = m_rendering = m_recording = m_prepareRecording = false; firstVisibleFrame=0; m_workLocation = TimeRef(); m_seeking = m_startSeek = 0; // TODO seek to old position on project exit ? m_transportLocation = TimeRef(); m_mode = EDIT; m_sbx = m_sby = 0; m_hzoom = config().get_property("Sheet", "hzoomLevel", 8192).toInt(); m_pluginChain = new PluginChain(this, this); m_fader = m_pluginChain->get_fader(); m_fader->set_gain(0.5); m_timeline = new TimeLine(this); m_skipTimer.setSingleShot(true); m_audiodeviceClient = new TAudioDeviceClient("sheet_" + QByteArray::number(get_id())); m_audiodeviceClient->set_process_callback( MakeDelegate(this, &Sheet::process) ); m_audiodeviceClient->set_transport_control_callback( MakeDelegate(this, &Sheet::transport_control) ); } int Sheet::set_state( const QDomNode & node ) { PENTER; QDomNode propertiesNode = node.firstChildElement("Properties"); QDomElement e = propertiesNode.toElement(); title = e.attribute( "title", "" ); artists = e.attribute( "artists", "" ); set_gain(e.attribute( "mastergain", "1.0").toFloat() ); qreal zoom = e.attribute("hzoom", "4096").toDouble(); set_hzoom(zoom); m_sbx = e.attribute("sbx", "0").toInt(); m_sby = e.attribute("sby", "0").toInt(); set_first_visible_frame(e.attribute( "firstVisibleFrame", "0" ).toUInt()); bool ok; TimeRef location(e.attribute( "m_workLocation", "0").toLongLong(&ok)); set_work_at(location); m_transportLocation = TimeRef(e.attribute( "transportlocation", "0").toLongLong(&ok)); // Start seeking to the 'old' transport pos set_transport_pos(m_transportLocation); set_snapping(e.attribute("snapping", "0").toInt()); m_mode = e.attribute("mode", "0").toInt(); m_timeline->set_state(node.firstChildElement("TimeLine")); QDomNode tracksNode = node.firstChildElement("Tracks"); QDomNode trackNode = tracksNode.firstChild(); while(!trackNode.isNull()) { Track* track = new Track(this, trackNode); private_add_track(track); track->set_state(trackNode); trackNode = trackNode.nextSibling(); } m_acmanager->set_state(node.firstChildElement("ClipManager")); QDomNode pluginChainNode = node.firstChildElement("PluginChain"); m_pluginChain->set_state(pluginChainNode); return 1; } QDomNode Sheet::get_state(QDomDocument doc, bool istemplate) { QDomElement sheetNode = doc.createElement("Sheet"); if (! istemplate) { sheetNode.setAttribute("id", m_id); } QDomElement properties = doc.createElement("Properties"); properties.setAttribute("title", title); properties.setAttribute("artists", artists); properties.setAttribute("firstVisibleFrame", firstVisibleFrame); properties.setAttribute("m_workLocation", m_workLocation.universal_frame()); properties.setAttribute("transportlocation", m_transportLocation.universal_frame()); properties.setAttribute("hzoom", m_hzoom); properties.setAttribute("sbx", m_sbx); properties.setAttribute("sby", m_sby); properties.setAttribute("snapping", m_isSnapOn); properties.setAttribute("mode", m_mode); sheetNode.appendChild(properties); doc.appendChild(sheetNode); sheetNode.appendChild(m_acmanager->get_state(doc)); sheetNode.appendChild(m_timeline->get_state(doc)); QDomNode tracksNode = doc.createElement("Tracks"); apill_foreach(Track* track, Track, m_tracks) { tracksNode.appendChild(track->get_state(doc, istemplate)); } sheetNode.appendChild(tracksNode); QDomNode pluginChainNode = doc.createElement("PluginChain"); pluginChainNode.appendChild(m_pluginChain->get_state(doc)); sheetNode.appendChild(pluginChainNode); return sheetNode; } void Sheet::connect_to_audiodevice( ) { PENTER; audiodevice().add_client(m_audiodeviceClient); } void Sheet::disconnect_from_audiodevice() { PENTER; if (is_transport_rolling()) { m_transport = false; emit transportStopped(); } audiodevice().remove_client(m_audiodeviceClient); } void Sheet::schedule_for_deletion() { m_scheduledForDeletion = true; pm().scheduled_for_deletion(this); } void Sheet::audiodevice_client_removed(TAudioDeviceClient* client ) { PENTER; if (m_audiodeviceClient == client) { if (m_scheduledForDeletion) { pm().delete_sheet(this); } } } Command* Sheet::add_track(Track* track, bool historable) { apill_foreach(Track* existing, Track, m_tracks) { if (existing->is_solo()) { track->set_muted_by_solo( true ); break; } } return new AddRemove(this, track, historable, this, "private_add_track(Track*)", "trackAdded(Track*)", "private_remove_track(Track*)", "trackRemoved(Track*)", tr("Add Track")); } Command* Sheet::remove_track(Track* track, bool historable) { return new AddRemove(this, track, historable, this, "private_remove_track(Track*)", "trackRemoved(Track*)", "private_add_track(Track*)", "trackAdded(Track*)", tr("Remove Track")); } bool Sheet::any_track_armed() { apill_foreach(Track* track, Track, m_tracks) { if (track->armed()) { return true; } } return false; } int Sheet::prepare_export(ExportSpecification* spec) { PENTER; if ( ! (spec->renderpass == ExportSpecification::CREATE_CDRDAO_TOC) ) { if (is_transport_rolling()) { spec->resumeTransport = true; // When transport is rolling, this equals stopping the transport! // prepare_export() is called from another thread, so use a queued connection // to call the function in the correct thread! if (!QMetaObject::invokeMethod(this, "start_transport", Qt::QueuedConnection)) { printf("Invoking Sheet::start_transport() failed\n"); return -1; } int count = 0; uint msecs = (audiodevice().get_buffer_size() * 1000) / audiodevice().get_sample_rate(); // wait a number (max 10) of process() cycles to be sure we really stopped transport while (m_transport) { spec->thread->sleep_for(msecs); count++; if (count > 10) { break; } } printf("Sheet::prepare_export: had to wait %d process cycles before the transport was stopped\n", count); } m_rendering = true; } spec->startLocation = LONG_LONG_MAX; spec->endLocation = TimeRef(); TimeRef endlocation, startlocation; apill_foreach(Track* track, Track, m_tracks) { track->get_render_range(startlocation, endlocation); if (track->is_solo()) { spec->endLocation = endlocation; spec->startLocation = startlocation; break; } if (endlocation > spec->endLocation) { spec->endLocation = endlocation; } if (startlocation < spec->startLocation) { spec->startLocation = startlocation; } } if (spec->isCdExport) { QList markers = m_timeline->get_markers(); if (m_timeline->get_start_location(startlocation)) { PMESG2(" Start marker found at %s", QS_C(timeref_to_ms(startlocation))); // round down to the start of the CD frame (75th of a sec) startlocation = cd_to_timeref(timeref_to_cd(startlocation)); spec->startLocation = startlocation; } else { PMESG2(" No start marker found"); } if (m_timeline->get_end_location(endlocation)) { PMESG2(" End marker found at %s", QS_C(timeref_to_ms(endlocation))); spec->endLocation = endlocation; } else { PMESG2(" No end marker found"); } } spec->totalTime = spec->endLocation - spec->startLocation; // PWARN("Render length is: %s",timeref_to_ms_3(spec->totalTime).toAscii().data() ); spec->pos = spec->startLocation; spec->progress = 0; spec->basename = "Sheet_" + QString::number(m_project->get_sheet_index(m_id)) +"-" + title; spec->name = spec->basename; if (spec->startLocation == spec->endLocation) { info().warning(tr("No audio to export! (Is everything muted?)")); return -1; } else if (spec->startLocation > spec->endLocation) { info().warning(tr("Export start frame starts beyond export end frame!!")); return -1; } if (spec->channels == 0) { info().warning(tr("Export tries to render to 0 channels wav file??")); return -1; } if (spec->renderpass == ExportSpecification::CREATE_CDRDAO_TOC) { return 1; } if (spec->renderpass == ExportSpecification::WRITE_TO_HARDDISK) { m_exportSource = new WriteSource(spec); if (m_exportSource->prepare_export() == -1) { delete m_exportSource; return -1; } } m_transportLocation = spec->startLocation; resize_buffer(false, spec->blocksize); renderDecodeBuffer = new DecodeBuffer; return 1; } int Sheet::finish_audio_export() { m_exportSource->finish_export(); delete m_exportSource; delete renderDecodeBuffer; resize_buffer(false, audiodevice().get_buffer_size()); return 0; } int Sheet::render(ExportSpecification* spec) { int chn; uint32_t x; int ret = -1; int progress; nframes_t diff = (spec->endLocation - spec->pos).to_frame(audiodevice().get_sample_rate()); nframes_t nframes = spec->blocksize; nframes_t this_nframes = std::min(diff, nframes); if (!spec->running || spec->stop || this_nframes == 0) { process_export (nframes); /* PWARN("Finished Rendering for this sheet"); PWARN("running is %d", spec->running); PWARN("stop is %d", spec->stop); PWARN("this_nframes is %d", this_nframes);*/ if (spec->renderpass == ExportSpecification::WRITE_TO_HARDDISK) { return finish_audio_export(); } else { return 0; } } /* do the usual stuff */ process_export(nframes); /* and now export the results */ nframes = this_nframes; memset (spec->dataF, 0, sizeof (spec->dataF[0]) * nframes * spec->channels); /* foreach output channel ... */ float* buf; for (chn = 0; chn < spec->channels; ++chn) { buf = m_masterOut->get_buffer(chn, nframes); if (!buf) { // Seem we are exporting at least to Stereo from an AudioBus with only one channel... // Use the first channel.. buf = m_masterOut->get_buffer(0, nframes); } for (x = 0; x < nframes; ++x) { spec->dataF[chn+(x*spec->channels)] = buf[x]; } } int bufsize = spec->blocksize * spec->channels; if (spec->normalize) { if (spec->renderpass == ExportSpecification::CALC_NORM_FACTOR) { spec->peakvalue = Mixer::compute_peak(spec->dataF, bufsize, spec->peakvalue); } } if (spec->renderpass == ExportSpecification::WRITE_TO_HARDDISK) { if (spec->normalize) { Mixer::apply_gain_to_buffer(spec->dataF, bufsize, spec->normvalue); } if (m_exportSource->process (nframes)) { goto out; } } spec->pos.add_frames(nframes, audiodevice().get_sample_rate()); if (! spec->normalize ) { progress = int((double((spec->pos - spec->startLocation).universal_frame()) / spec->totalTime.universal_frame()) * 100); } else { progress = (int) (double( 100 * (spec->pos - spec->startLocation).universal_frame()) / (spec->totalTime.universal_frame() * 2)); if (spec->renderpass == ExportSpecification::WRITE_TO_HARDDISK) { progress += 50; } } if (progress > spec->progress) { spec->progress = progress; m_project->set_sheet_export_progress(progress); } /* and we're good to go */ ret = 1; out: if (!ret) { spec->running = false; spec->status = ret; m_rendering = false; } return ret; } SnapList* Sheet::get_snap_list() const { return snaplist; } void Sheet::set_artists(const QString& pArtists) { artists = pArtists; } void Sheet::set_gain(float gain) { if (gain < 0.0) gain = 0.0; if (gain > 2.0) gain = 2.0; m_fader->set_gain(gain); emit masterGainChanged(); } void Sheet::set_title(const QString& sTitle) { title=sTitle; emit propertyChanged(); } void Sheet::set_first_visible_frame(nframes_t pos) { PENTER; firstVisibleFrame = pos; emit firstVisibleFrameChanged(); } void Sheet::set_work_at(const TimeRef& location) { m_workLocation = location; if (workSnap->is_snappable()) { snaplist->mark_dirty(); } emit workingPosChanged(); } Command* Sheet::toggle_snap() { set_snapping( ! m_isSnapOn ); return 0; } void Sheet::set_snapping(bool snapping) { m_isSnapOn = snapping; emit snapChanged(); } /******************************** SLOTS *****************************/ Track* Sheet::create_track() { int height = Track::INITIAL_HEIGHT; Track* track = new Track(this, "Unnamed", height); return track; } void Sheet::solo_track(Track* t) { bool wasSolo = t->is_solo(); t->set_muted_by_solo(!wasSolo); t->set_solo(!wasSolo); bool hasSolo = false; apill_foreach(Track* track, Track, m_tracks) { track->set_muted_by_solo(!track->is_solo()); if (track->is_solo()) hasSolo = true; } if (!hasSolo) { apill_foreach(Track* track, Track, m_tracks) { track->set_muted_by_solo(false); } } } Command* Sheet::toggle_solo() { bool hasSolo = false; apill_foreach(Track* track, Track, m_tracks) { if (track->is_solo()) hasSolo = true; } apill_foreach(Track* track, Track, m_tracks) { track->set_solo(!hasSolo); track->set_muted_by_solo(false); } return (Command*) 0; } Command *Sheet::toggle_mute() { bool hasMute = false; apill_foreach(Track* track, Track, m_tracks) { if (track->is_muted()) hasMute = true; } apill_foreach(Track* track, Track, m_tracks) { track->set_muted(!hasMute); } return (Command*) 0; } Command *Sheet::toggle_arm() { bool hasArmed = false; apill_foreach(Track* track, Track, m_tracks) { if (track->armed()) hasArmed = true; } apill_foreach(Track* track, Track, m_tracks) { if (hasArmed) { track->disarm(); } else { track->arm(); } } return (Command*) 0; } Command* Sheet::work_next_edge() { /* nframes_t w = m_acmanager->get_last_frame(); foreach(Track* track, m_tracks) { AudioClip* c=track->get_clip_after(m_workLocation); if ((c) && (c->get_track_start_location() < w && c->get_track_start_location() > m_workLocation)) w = c->get_track_start_location(); } set_work_at(w); emit setCursorAtEdge(); */ return (Command*) 0; } Command* Sheet::work_previous_edge() { /* TimeRef w(0); foreach(Track* track, m_tracks) { AudioClip* c = track->get_clip_before(m_workLocation); if ((c) && (c->get_track_end_location() >= w && c->get_track_end_location() < m_workLocation) ) w=c->get_track_end_location(); } set_work_at(w); emit setCursorAtEdge(); */ return (Command*) 0; } void Sheet::set_hzoom( qreal hzoom ) { // Traverso <= 0.42.0 doesn't store the real zoom factor, but an // index. This currently causes problems as there is no real support // (yet) for zoomlevels other then powers of 2, so we force that for now. // NOTE: Remove those 2 lines when floating point zoomlevel is implemented! int highbit; hzoom = nearest_power_of_two(hzoom, highbit); if (hzoom > Peak::max_zoom_value()) { hzoom = Peak::max_zoom_value(); } if (hzoom < 1.0) { hzoom = 1.0; } if (m_hzoom == hzoom) { return; } m_hzoom = hzoom; emit hzoomChanged(); } // // Function called in RealTime AudioThread processing path // int Sheet::process( nframes_t nframes ) { if (m_startSeek) { start_seek(); return 0; } // If no need for playback/record, return. if (!is_transport_rolling()) { return 0; } if (m_stopTransport) { m_transport = false; m_realtimepath = false; m_stopTransport = false; RT_THREAD_EMIT(this, 0, transportStopped()); return 0; } // zero the m_masterOut buffers m_masterOut->silence_buffers(nframes); int processResult = 0; // Process all Tracks. apill_foreach(Track* track, Track, m_tracks) { processResult |= track->process(nframes); } // update the transport location m_transportLocation.add_frames(nframes, audiodevice().get_sample_rate()); if (!processResult) { return 0; } // Mix the result into the AudioDevice "physical" buffers if (m_playBackBus) { Mixer::mix_buffers_with_gain(m_playBackBus->get_buffer(0, nframes), m_masterOut->get_buffer(0, nframes), nframes, get_gain()); Mixer::mix_buffers_with_gain(m_playBackBus->get_buffer(1, nframes), m_masterOut->get_buffer(1, nframes), nframes, get_gain()); m_pluginChain->process_post_fader(m_masterOut, nframes); } return 1; } int Sheet::process_export( nframes_t nframes ) { // Get the masterout buffers, and fill with zero's m_masterOut->silence_buffers(nframes); memset (mixdown, 0, sizeof (audio_sample_t) * nframes); // Process all Tracks. apill_foreach(Track* track, Track, m_tracks) { track->process(nframes); } Mixer::apply_gain_to_buffer(m_masterOut->get_buffer(0, nframes), nframes, get_gain()); Mixer::apply_gain_to_buffer(m_masterOut->get_buffer(1, nframes), nframes, get_gain()); // update the m_transportFrame // m_transportFrame += nframes; m_transportLocation.add_frames(nframes, audiodevice().get_sample_rate()); return 1; } QString Sheet::get_cdrdao_tracklist(ExportSpecification* spec, bool pregap) { QString output; QList mlist = m_timeline->get_markers(); QList tempmarkers; // Here we make the marker-stuff idiot-proof ;-). Traverso doesn't insist on having any // marker at all, so we need to handle cases like: // - no markers at all // - one marker (doesn't make sense) // - enough markers, but no end marker Marker* temp; if (mlist.size() < 2) { switch (mlist.size()) { case 0: // no markers present. We add one at the beginning and one at the // end of the render area. temp = new Marker(m_timeline, spec->startLocation, Marker::CDTRACK); tempmarkers.append(temp); mlist.prepend(temp); temp = new Marker(m_timeline, spec->endLocation, Marker::ENDMARKER); tempmarkers.append(temp); mlist.append(temp); break; case 1: // one marker is present. We add two more, one at the beginning // and one at the end of the render area. If the present marker // happened to be at either the start or the end position, // it will now be overwritten, so we will never end up with // two markers at the same position. // deactivate the next if-condition (only the first one) if you want the // stuff before the first marker to go into the pre-gap if (mlist.at(0)->get_when() != (spec->startLocation)) { temp = new Marker(m_timeline, spec->startLocation, Marker::CDTRACK); tempmarkers.append(temp); mlist.prepend(temp); } if (mlist.at(0)->get_when() != (spec->startLocation)) { temp = new Marker(m_timeline, spec->endLocation, Marker::ENDMARKER); tempmarkers.append(temp); mlist.append(temp); } break; } } else { // would be ok, but let's check if there is an end marker present. If not, // add one to spec->end_frame if (!m_timeline->has_end_marker()) { temp = new Marker(m_timeline, spec->endLocation, Marker::ENDMARKER); tempmarkers.append(temp); mlist.append(temp); } } TimeRef start; for(int i = 0; i < mlist.size()-1; ++i) { Marker* startmarker = mlist.at(i); Marker* endmarker = mlist.at(i+1); output += "TRACK AUDIO\n"; if (startmarker->get_copyprotect()) { output += " NO COPY\n"; } else { output += " COPY\n"; } if (startmarker->get_preemphasis()) { output += " PRE_EMPHASIS\n"; } output += " CD_TEXT {\n LANGUAGE 0 {\n"; output += " TITLE \"" + startmarker->get_description() + "\"\n"; output += " PERFORMER \"" + startmarker->get_performer() + "\"\n"; output += " ISRC \"" + startmarker->get_isrc() + "\"\n"; output += " ARRANGER \"" + startmarker->get_arranger() + "\"\n"; output += " SONGWRITER \"" + startmarker->get_songwriter() + "\"\n"; output += " MESSAGE \"" + startmarker->get_message() + "\"\n }\n }\n"; // add some stuff only required for the first track (e.g. pre-gap) if ((i == 0) && pregap) { //if (start == 0) { // standard pregap, because we have a track marker at the beginning output += " PREGAP 00:02:00\n"; //} else { // // no track marker at the beginning, thus use the part from 0 to the first // // track marker for the pregap // output += " START " + frame_to_cd(start, m_project->get_rate()) + "\n"; // start = 0; //} } TimeRef length = cd_to_timeref(timeref_to_cd(endmarker->get_when())) - cd_to_timeref(timeref_to_cd(startmarker->get_when())); QString s_start = timeref_to_cd(start); QString s_length = timeref_to_cd(length); output += " FILE \"" + spec->name + "." + spec->extraFormat["filetype"] + "\" " + s_start + " " + s_length + "\n\n"; start += length; // check if the second marker is of type "Endmarker" if (endmarker->get_type() == Marker::ENDMARKER) { break; } } // delete all temporary markers foreach(Marker* marker, tempmarkers) { delete marker; } return output; } void Sheet::resize_buffer(bool updateArmStatus, nframes_t size) { if (mixdown) delete [] mixdown; if (gainbuffer) delete [] gainbuffer; mixdown = new audio_sample_t[size]; gainbuffer = new audio_sample_t[size]; m_masterOut->set_buffer_size(size); m_renderBus->set_buffer_size(size); m_clipRenderBus->set_buffer_size(size); if (updateArmStatus) { apill_foreach(Track* track, Track, m_tracks) { AudioBus* bus = audiodevice().get_capture_bus(track->get_bus_in().toAscii()); if (bus && track->armed()) { bus->set_monitor_peaks(true); } } } } void Sheet::audiodevice_params_changed() { resize_buffer(true, audiodevice().get_buffer_size()); // The samplerate possibly has been changed, this initiates // a seek in DiskIO, which clears the buffers and refills them // with the correct resampled audio data! // We need to seek to a different position then the current one, // else the seek won't happen at all :) if (m_currentSampleRate != audiodevice().get_sample_rate()) { m_currentSampleRate = audiodevice().get_sample_rate(); m_diskio->output_rate_changed(m_currentSampleRate); TimeRef location = m_transportLocation; location.add_frames(1, audiodevice().get_sample_rate()); set_transport_pos(location); } } int Sheet::get_bitdepth( ) { return m_project->get_bitdepth(); } int Sheet::get_rate( ) { return m_project->get_rate(); } nframes_t Sheet::get_first_visible_frame( ) const { return firstVisibleFrame; } DiskIO * Sheet::get_diskio( ) const { return m_diskio; } AudioClipManager * Sheet::get_audioclip_manager( ) const { return m_acmanager; } PluginChain* Sheet::get_plugin_chain() const { return m_pluginChain; } int Sheet::get_track_index(qint64 id) { int i=0; apill_foreach(Track* track, Track, m_tracks) { if (track->get_id() == id) { return i + 1; } ++i; } return 0; } void Sheet::handle_diskio_readbuffer_underrun( ) { if (is_transport_rolling()) { printf("Sheet:: DiskIO ReadBuffer UnderRun signal received!\n"); info().critical(tr("Hard Disk overload detected!")); info().critical(tr("Failed to fill ReadBuffer in time")); } } void Sheet::handle_diskio_writebuffer_overrun( ) { if (is_transport_rolling()) { printf("Sheet:: DiskIO WriteBuffer OverRun signal received!\n"); info().critical(tr("Hard Disk overload detected!")); info().critical(tr("Failed to empty WriteBuffer in time")); } } void Sheet::audiodevice_started( ) { m_playBackBus = audiodevice().get_playback_bus("Playback 1"); } TimeRef Sheet::get_last_location() const { TimeRef lastAudio = m_acmanager->get_last_location(); if (m_timeline->get_markers().size()) { TimeRef lastMarker = m_timeline->get_markers().last()->get_when(); return (lastAudio > lastMarker) ? lastAudio : lastMarker; } return lastAudio; } void Sheet::private_add_track(Track* track) { m_tracks.append(track); } void Sheet::private_remove_track(Track* track) { m_tracks.remove(track); } Track* Sheet::get_track(qint64 id) { apill_foreach(Track* track, Track, m_tracks) { if (track->get_id() == id) { return track; } } return 0; } void Sheet::move_clip(Track * from, Track * too, AudioClip * clip, TimeRef location) { PENTER2; if (from == too) { clip->set_track_start_location(location); return; } // Remove has to be done BEFORE adding, else the APILinkedList logic // gets messed up for the Tracks AudioClipList, which is an APILinkedList :( Command::process_command(from->remove_clip(clip, false, true)); Command::process_command(too->add_clip(clip, false, true)); if (clip->get_track_start_location() != location) { clip->set_track_start_location(location); } } Command* Sheet::set_editing_mode( ) { m_mode = EDIT; emit modeChanged(); return 0; } Command* Sheet::set_effects_mode( ) { m_mode = EFFECTS; emit modeChanged(); return 0; } void Sheet::set_temp_follow_state(bool state) { emit tempFollowChanged(state); } // Function is only to be called from GUI thread. Command * Sheet::set_recordable() { #if defined (THREAD_CHECK) Q_ASSERT(QThread::currentThreadId() == threadId); #endif // Do nothing if transport is rolling! if (is_transport_rolling()) { return 0; } // Transport is not rolling, it's save now to switch // recording state to on /off if (is_recording()) { set_recording(false, false); } else { if (!any_track_armed()) { info().critical(tr("No Tracks armed for recording!")); return 0; } set_recording(true, false); } return 0; } // Function is only to be called from GUI thread. Command* Sheet::set_recordable_and_start_transport() { if (!is_recording()) { set_recordable(); } start_transport(); return 0; } // Function is only to be called from GUI thread. Command* Sheet::start_transport() { #if defined (THREAD_CHECK) Q_ASSERT(QThread::currentThreadId() == threadId); #endif // Delegate the transport start (or if we are rolling stop) // request to the audiodevice. Depending on the driver in use // this call will return directly to us (by a call to transport_control), // or handled by the driver if (is_transport_rolling()) { audiodevice().transport_stop(m_audiodeviceClient); } else { audiodevice().transport_start(m_audiodeviceClient); } return ie().succes(); } // Function can be called either from the GUI or RT thread. // So ALL functions called here need to be RT thread save!! int Sheet::transport_control(transport_state_t state) { if (m_scheduledForDeletion) { return true; } switch(state.tranport) { case TransportStopped: if (is_transport_rolling()) { stop_transport_rolling(); if (is_recording()) { set_recording(false, state.realtime); } } return true; case TransportStarting: if (state.location != m_transportLocation) { if ( ! m_seeking ) { m_newTransportLocation = state.location; m_startSeek = 1; m_seeking = 1; PMESG("tranport starting: initiating seek"); return false; } } if (! m_seeking) { if (is_recording()) { if (!m_prepareRecording) { m_prepareRecording = true; // prepare_recording() is only to be called from the GUI thread // so we delegate the prepare_recording() function call via a // RT thread save signal! Q_ASSERT(state.realtime); RT_THREAD_EMIT(this, 0, prepareRecording()); PMESG("transport starting: initiating prepare for record"); return false; } if (!m_readyToRecord) { PMESG("transport starting: still preparing for record"); return false; } } PMESG("tranport starting: seek finished"); return true; } else { PMESG("tranport starting: still seeking"); return false; } case TransportRolling: if (!is_transport_rolling()) { // When the transport rolling request came from a non slave // driver, we currently can assume it's comming from the GUI // thread, and TransportStarting never was called before! // So in case we are recording we have to prepare for recording now! if ( ! state.isSlave && is_recording() ) { Q_ASSERT(!state.realtime); prepare_recording(); } start_transport_rolling(state.realtime); } return true; } return false; } // RT thread save function void Sheet::start_transport_rolling(bool realtime) { m_realtimepath = true; m_transport = 1; if (realtime) { RT_THREAD_EMIT(this, 0, transportStarted()); } else { emit transportStarted(); } PMESG("transport rolling"); } // RT thread save function void Sheet::stop_transport_rolling() { m_stopTransport = 1; PMESG("transport stopped"); } // RT thread save function void Sheet::set_recording(bool recording, bool realtime) { m_recording = recording; if (!m_recording) { m_readyToRecord = false; m_prepareRecording = false; } if (realtime) { RT_THREAD_EMIT(this, 0, recordingStateChanged()); } else { emit recordingStateChanged(); } } // NON RT thread save function, should only be called from GUI thread!! void Sheet::prepare_recording() { #if defined (THREAD_CHECK) Q_ASSERT(QThread::currentThreadId() == threadId); #endif if (m_recording && any_track_armed()) { CommandGroup* group = new CommandGroup(this, ""); int clipcount = 0; apill_foreach(Track* track, Track, m_tracks) { if (track->armed()) { AudioClip* clip = track->init_recording(); if (clip) { // For autosave purposes, we connect the recordingfinished // signal to the clip_finished_recording() slot, and add this // clip to our recording clip list. // At the time the cliplist is empty, we're sure the recording // session is finished, at which time an autosave makes sense. connect(clip, SIGNAL(recordingFinished(AudioClip*)), this, SLOT(clip_finished_recording(AudioClip*))); m_recordingClips.append(clip); group->add_command(new AddRemoveClip(clip, AddRemoveClip::ADD)); clipcount++; } } } group->setText(tr("Recording to %n Clip(s)", "", clipcount)); Command::process_command(group); } m_readyToRecord = true; } void Sheet::clip_finished_recording(AudioClip * clip) { if (!m_recordingClips.removeAll(clip)) { PERROR("clip %s was not in recording clip list, cannot remove it!", QS_C(clip->get_name())); } if (m_recordingClips.isEmpty()) { // seems we finished recording completely now // all clips have set their resulting ReadSource // length and whatsoever, let's do an autosave: m_project->save(true); } } void Sheet::set_transport_pos(TimeRef location) { #if defined (THREAD_CHECK) Q_ASSERT(QThread::currentThreadId() == threadId); #endif audiodevice().transport_seek_to(m_audiodeviceClient, location); } // // Function is ALWAYS called in RealTime AudioThread processing path // Be EXTREMELY carefull to not call functions() that have blocking behavior!! // void Sheet::start_seek() { #if defined (THREAD_CHECK) Q_ASSERT(threadId != QThread::currentThreadId ()); #endif if (is_transport_rolling()) { m_realtimepath = false; m_resumeTransport = true; } m_transport = false; m_startSeek = 0; // only sets a boolean flag, save to call. m_diskio->prepare_for_seek(); // 'Tell' the diskio it should start a seek action. RT_THREAD_EMIT(this, NULL, seekStart()); } void Sheet::seek_finished() { #if defined (THREAD_CHECK) Q_ASSERT_X(threadId == QThread::currentThreadId (), "Sheet::seek_finished", "Called from other Thread!"); #endif PMESG2("Sheet :: entering seek_finished"); m_transportLocation = m_newTransportLocation; m_seeking = 0; if (m_resumeTransport) { start_transport_rolling(false); m_resumeTransport = false; } emit transportPosSet(); PMESG2("Sheet :: leaving seek_finished"); } void Sheet::config_changed() { int quality = config().get_property("Conversion", "RTResamplingConverterType", DEFAULT_RESAMPLE_QUALITY).toInt(); if (m_diskio->get_resample_quality() != quality) { m_diskio->set_resample_quality(quality); } } QList< Track * > Sheet::get_tracks() const { QList list; apill_foreach(Track* track, Track, m_tracks) { list.append(track); } return list; } Track * Sheet::get_track_for_index(int index) { apill_foreach(Track* track, Track, m_tracks) { if (track->get_sort_index() == index) { return track; } } return 0; } // the timer is used to allow 'hopping' to the left from snap position to snap position // even during playback. Command* Sheet::prev_skip_pos() { if (snaplist->was_dirty()) { update_skip_positions(); } TimeRef p = get_transport_location(); if (p < TimeRef()) { PERROR("pos < 0"); set_transport_pos(TimeRef()); return ie().failure(); } QListIterator it(m_xposList); it.toBack(); int steps = 1; if (m_skipTimer.isActive()) { ++steps; } int i = 0; while (it.hasPrevious()) { TimeRef pos = it.previous(); if (pos < p) { p = pos; ++i; } if (i >= steps) { break; } } set_transport_pos(p); m_skipTimer.start(500); return ie().succes(); } Command* Sheet::next_skip_pos() { if (snaplist->was_dirty()) { update_skip_positions(); } TimeRef p = get_transport_location(); if (p > m_xposList.last()) { PERROR("pos > last snap position"); return ie().failure(); } QListIterator it(m_xposList); int i = 0; int steps = 1; while (it.hasNext()) { TimeRef pos = it.next(); if (pos > p) { p = pos; ++i; } if (i >= steps) { break; } } set_transport_pos(p); return ie().succes(); } void Sheet::update_skip_positions() { m_xposList.clear(); // store the beginning of the sheet and the work cursor m_xposList << TimeRef(); m_xposList << get_work_location(); // store all clip borders QList acList = get_audioclip_manager()->get_clip_list(); for (int i = 0; i < acList.size(); ++i) { m_xposList << acList.at(i)->get_track_start_location(); m_xposList << acList.at(i)->get_track_end_location(); } // store all marker positions QList markerList = get_timeline()->get_markers(); for (int i = 0; i < markerList.size(); ++i) { m_xposList << markerList.at(i)->get_when(); } // remove duplicates QMutableListIterator it(m_xposList); while (it.hasNext()) { TimeRef val = it.next(); if (m_xposList.count(val) > 1) { it.remove(); } } qSort(m_xposList); } void Sheet::skip_to_start() { set_transport_pos((TimeRef())); set_work_at((TimeRef())); } void Sheet::skip_to_end() { // stop the transport, no need to play any further than the end of the sheet if (is_transport_rolling()) { start_transport(); } set_transport_pos(get_last_location()); } //eof traverso-0.49.4/src/core/TimeLine.cpp000644 001750 001750 00000011174 11163362147 017720 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "TimeLine.h" #include "Sheet.h" #include "Marker.h" #include #include "AudioDevice.h" static bool smallerMarker(const Marker* left, const Marker* right ) { return left->get_when() < right->get_when(); } TimeLine::TimeLine(Sheet * sheet) : ContextItem(sheet) , m_sheet(sheet) { set_history_stack(m_sheet->get_history_stack()); QObject::tr("TimeLine"); } QDomNode TimeLine::get_state(QDomDocument doc) { QDomElement domNode = doc.createElement("TimeLine"); QDomNode markersNode = doc.createElement("Markers"); domNode.appendChild(markersNode); foreach (Marker *marker, m_markers) { markersNode.appendChild(marker->get_state(doc)); } return domNode; } int TimeLine::set_state(const QDomNode & node) { m_markers.clear(); QDomNode markersNode = node.firstChildElement("Markers"); QDomNode markerNode = markersNode.firstChild(); while (!markerNode.isNull()) { Marker* marker = new Marker(this, markerNode); connect(marker, SIGNAL(positionChanged()), this, SLOT(marker_position_changed())); m_markers.append(marker); markerNode = markerNode.nextSibling(); } index_markers(); return 1; } Command * TimeLine::add_marker(Marker* marker, bool historable) { connect(marker, SIGNAL(positionChanged()), this, SLOT(marker_position_changed())); AddRemove* cmd; cmd = new AddRemove(this, marker, historable, m_sheet, "private_add_marker(Marker*)", "markerAdded(Marker*)", "private_remove_marker(Marker*)", "markerRemoved(Marker*)", tr("Add Marker")); // Bypass the real time thread save logic in tsar, since a Marker doesn't have YET // anything to do with audio processing routines. // WARNING: this should change as soon as Markers modify anything related to audio // processing objects!!!!!! cmd->set_instantanious(true); return cmd; } Command* TimeLine::remove_marker(Marker* marker, bool historable) { AddRemove* cmd; cmd = new AddRemove(this, marker, historable, m_sheet, "private_remove_marker(Marker*)", "markerRemoved(Marker*)", "private_add_marker(Marker*)", "markerAdded(Marker*)", tr("Remove Marker")); // Bypass the real time thread save logic in tsar, since a Marker doesn't have YET // anything to do with audio processing routines. // WARNING: this should change as soon as Markers modify anything related to audio // processing objects!!!!!! cmd->set_instantanious(true); return cmd; } void TimeLine::private_add_marker(Marker * marker) { m_markers.append(marker); index_markers(); } void TimeLine::private_remove_marker(Marker * marker) { m_markers.removeAll(marker); index_markers(); } Marker * TimeLine::get_marker(qint64 id) { foreach(Marker* marker, m_markers) { if (marker->get_id() == id) { return marker; } } return 0; } bool TimeLine::get_end_location(TimeRef& location) { foreach(Marker* marker, m_markers) { if (marker->get_type() == Marker::ENDMARKER) { location = marker->get_when(); return true; } } return false; } bool TimeLine::get_start_location(TimeRef & location) { if (m_markers.size() > 0) { location = m_markers.first()->get_when(); return true; } return false; } bool TimeLine::has_end_marker() { foreach(Marker* marker, m_markers) { if (marker->get_type() == Marker::ENDMARKER) { return true; } } return false; } Marker* TimeLine::get_end_marker() { foreach(Marker* marker, m_markers) { if (marker->get_type() == Marker::ENDMARKER) { return marker; } } return (Marker*)0; } void TimeLine::marker_position_changed() { index_markers(); emit markerPositionChanged(); // FIXME This is not a fix to let the sheetview scrollbars // know that it's range possably has to be recalculated!!!!!!!!!!!!!! emit m_sheet->lastFramePositionChanged(); } void TimeLine::index_markers() { qSort(m_markers.begin(), m_markers.end(), smallerMarker); // let the markers know about their position (index) for (int i = 0; i < m_markers.size(); i++) { m_markers.at(i)->set_index(i+1); } } traverso-0.49.4/src/core/CMakeLists.txt000644 001750 001750 00000004471 11163362147 020250 0ustar00remonremon000000 000000 INCLUDE_DIRECTORIES( ${CMAKE_SOURCE_DIR}/src/audiofileio/decode ${CMAKE_SOURCE_DIR}/src/audiofileio/encode ${CMAKE_SOURCE_DIR}/src/commands ${CMAKE_SOURCE_DIR}/src/common ${CMAKE_SOURCE_DIR}/src/engine ${CMAKE_SOURCE_DIR}/src/plugins ${CMAKE_SOURCE_DIR}/src/plugins/native ${QT_QTGUI_INCLUDE_DIR} ${QT_QTXML_INCLUDE_DIR} ) SET(TRAVERSO_CORE_SOURCES ${CMAKE_SOURCE_DIR}/src/common/Utils.cpp ${CMAKE_SOURCE_DIR}/src/common/Tsar.cpp ${CMAKE_SOURCE_DIR}/src/common/Debugger.cpp ${CMAKE_SOURCE_DIR}/src/common/Mixer.cpp ${CMAKE_SOURCE_DIR}/src/common/RingBuffer.cpp ${CMAKE_SOURCE_DIR}/src/common/Resampler.cpp AudioClip.cpp AudioClipGroup.cpp AudioClipManager.cpp AudioFileCopyConvert.cpp AudioFileMerger.cpp AudioSource.cpp Command.cpp Config.cpp ContextPointer.cpp Curve.cpp CurveNode.cpp DiskIO.cpp Export.cpp FadeCurve.cpp FileHelpers.cpp Information.cpp InputEngine.cpp Peak.cpp Project.cpp ProjectManager.cpp ReadSource.cpp ResourcesManager.cpp Sheet.cpp Track.cpp ViewPort.cpp WriteSource.cpp gdither.cpp SnapList.cpp Snappable.cpp TimeLine.cpp Marker.cpp Themer.cpp ProjectConverter.cpp ) SET(TRAVERSO_CORE_MOC_CLASSES ${CMAKE_SOURCE_DIR}/src/common/Tsar.h AudioClip.h AudioClipManager.h AudioFileMerger.h AudioFileCopyConvert.h Config.h ContextPointer.h Curve.h DiskIO.h Export.h FadeCurve.h Information.h Marker.h Peak.h Project.h ProjectConverter.h ProjectManager.h ReadSource.h ResourcesManager.h Sheet.h Themer.h TimeLine.h Track.h ViewPort.h WriteSource.h ContextItem.h InputEngine.h CommandPlugin.h ) QT4_WRAP_CPP(TRAVERSO_CORE_MOC_SOURCES ${TRAVERSO_CORE_MOC_CLASSES}) IF(UNIX) IF(HOST_SUPPORTS_SSE) IF(IS_ARCH_X86) SET(ASM_FILE ${CMAKE_SOURCE_DIR}/src/common/sse_functions.S) ENDIF(IS_ARCH_X86) IF(IS_ARCH_X86_64) SET(ASM_FILE ${CMAKE_SOURCE_DIR}/src/common/sse_functions_64bit.S) ENDIF(IS_ARCH_X86_64) add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/sse_functions.o COMMAND as ${ASM_FILE} -o ${CMAKE_CURRENT_BINARY_DIR}/sse_functions.o DEPENDS ${ASM_FILE} ) SET(SSE_OBJECT_FILE ${CMAKE_CURRENT_BINARY_DIR}/sse_functions.o) ENDIF(HOST_SUPPORTS_SSE) ENDIF(UNIX) SET(TRAVERSO_CORE_LIBRARY "traversocore") ADD_LIBRARY(${TRAVERSO_CORE_LIBRARY} STATIC ${TRAVERSO_CORE_SOURCES} ${TRAVERSO_CORE_MOC_SOURCES} ${SSE_OBJECT_FILE}) IF(USE_PCH) ADD_DEPENDENCIES(traversocore precompiled_headers) ENDIF(USE_PCH) traverso-0.49.4/src/core/AudioClipGroup.cpp000644 001750 001750 00000007770 11163362147 021107 0ustar00remonremon000000 000000 /* Copyright (C) 2008 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "AudioClipGroup.h" #include "AudioClip.h" #include "AudioClipManager.h" #include "Command.h" #include "ProjectManager.h" #include "ResourcesManager.h" #include "Sheet.h" #include "Track.h" #include #include "Debugger.h" AudioClipGroup::AudioClipGroup(QList< AudioClip * > clips) { m_clips = clips; update_state(); } void AudioClipGroup::add_clip(AudioClip * clip) { m_clips.append(clip); update_state(); } void AudioClipGroup::set_clips(QList< AudioClip * > clips) { m_clips = clips; update_state(); } void AudioClipGroup::move_to(int trackIndex, TimeRef location) { int trackIndexDelta = trackIndex - m_topTrackIndex; foreach(AudioClip* clip, m_clips) { if (trackIndexDelta != 0) { Track* track = clip->get_sheet()->get_track_for_index(clip->get_track()->get_sort_index() + trackIndexDelta); if (track) { Command::process_command(clip->get_track()->remove_clip(clip, false, true)); Command::process_command(track->add_clip(clip, false, true)); } } TimeRef offset = clip->get_track_start_location() - m_trackStartLocation; clip->set_track_start_location(location + offset); } update_state(); } void AudioClipGroup::update_state() { if (m_clips.isEmpty()) { return; } m_trackStartLocation = LLONG_MAX; m_trackEndLocation = TimeRef(); m_topTrackIndex = INT_MAX; m_bottomTrackIndex = 0; foreach(AudioClip* clip, m_clips) { int index = clip->get_track()->get_sort_index(); if (index < m_topTrackIndex) { m_topTrackIndex = index; } if (index > m_bottomTrackIndex) { m_bottomTrackIndex = index; } if (m_trackStartLocation > clip->get_track_start_location()) { m_trackStartLocation = clip->get_track_start_location(); } if (m_trackEndLocation < clip->get_track_end_location()) { m_trackEndLocation = clip->get_track_end_location(); } } } void AudioClipGroup::set_snappable(bool snap) { foreach(AudioClip* clip, m_clips) { clip->set_snappable(snap); } } void AudioClipGroup::set_as_moving(bool move) { foreach(AudioClip* clip, m_clips) { clip->set_as_moving(move); } } QList AudioClipGroup::copy_clips() { QList newclips; foreach(AudioClip* clip, m_clips) { AudioClip* newclip = resources_manager()->get_clip(clip->get_id()); newclip->set_sheet(clip->get_sheet()); newclip->set_track(clip->get_track()); newclip->set_track_start_location(clip->get_track_start_location()); newclips.append(newclip); } return newclips; } void AudioClipGroup::add_all_clips_to_tracks() { foreach(AudioClip* clip, m_clips) { Command::process_command(clip->get_track()->add_clip(clip, false)); } } void AudioClipGroup::remove_all_clips_from_tracks() { foreach(AudioClip* clip, m_clips) { Command::process_command(clip->get_track()->remove_clip(clip, false)); } } void AudioClipGroup::check_valid_track_index_delta(int & delta) { if (m_clips.isEmpty()) { return; } int allowedDeltaPlus = (m_clips.first()->get_sheet()->get_numtracks() - 1) - m_bottomTrackIndex; int allowedDeltaMin = -m_topTrackIndex; if (delta > allowedDeltaPlus) { delta = allowedDeltaPlus; } if (delta < allowedDeltaMin) { delta = allowedDeltaMin; } } bool AudioClipGroup::is_locked() const { foreach(AudioClip* clip, m_clips) { if (clip->is_locked()) { return true; } } return false; } traverso-0.49.4/src/core/CurveNode.h000755 001750 001750 00000003403 11163362147 017550 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2006 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: CurveNode.h,v 1.9 2007/11/19 11:18:53 r_sijrier Exp $ */ #ifndef CURVENODE_H #define CURVENODE_H #include "APILinkedList.h" class Curve; class CurveNode : public APILinkedListNode { public: CurveNode(){}; CurveNode(Curve* curve, double when, double val) : m_curve(curve) { coeff[0] = coeff[1] = coeff[2] = coeff[3] = 0.0; this->when = when; this->value = val; } ~CurveNode(){}; void set_when(double when) { this->when = when; } void set_when_and_value(double when, double value); void set_relative_when_and_value(double relwhen, double value); double get_when() const {return when;} double get_value() const {return value;} bool is_smaller_then(APILinkedListNode* node) {return ((CurveNode*)node)->when > when;} Curve* m_curve; // declaring friend class Curve seems not to make any difference // when compiling on windows ? (not allowed to access compile error) double when; double value; private: double coeff[4]; /* double when; double value;*/ friend class Curve; }; #endif traverso-0.49.4/src/core/Command.cpp000644 001750 001750 00000021032 11163362147 017562 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: Command.cpp,v 1.21 2008/02/12 20:39:08 r_sijrier Exp $ */ #include "Command.h" #include "ContextPointer.h" #include #include #include #include "ContextItem.h" // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" /** \class Command \brief An Interface class for creating ('analog', or holding command type) un/redoable actions Traverso uses the Command pattern for 2 purposes: Creating historable actions and the so called 'hold actions', providing an easy way to create 'analog' user interface interactions. There are 2 types of Commands possible, the 'Single fact' type, which only needs to reimplement the do_action(), undo_action() and prepare_actions() functions, and the "Hold fact' type, which also reimplements the jog() function, together with the begin_hold() and finish_hold() functions.
Single Fact type function call order: - prepare_actions(), if it returns -1, the InputEngine will recognise it as a failed command, and delete it.
- do_action(), the actuall action to be performed will happen here
Hold Fact type function call order: - begin_hold(), if it returns -1, the InputEngine will recognise it as a failed command, and delete it.
- set_cursor_shape(), the default mouse gesture cursor is used, reimplement to set a custom one, or to use the advanced HoldCursor of the ViewPort
- jog(), as long as the hold action remains true (the key(s) remain pressed) jog() is called during mouse movement, here you can do the calculations for analog type of actions.
- finish_hold(), the return value isn't used at the moment.
- prepare_actions(),if it returns -1, the InputEngine will recognise it as a failed command, and delete it.
- do_action(), the actual action will happen here. For detailed information on how to use Command objects in Traverso, see InputEngine */ /** * Command constructor that only takes a description string. This type of Command doesn't know about a historystack So won't be un/redoable. * @param des The description of the action */ Command::Command( const QString& des ) : QUndoCommand(des) { m_historyStack = 0; m_isHistorable = true; } /** * Constructor with a ContextItem as parameter, which will be used to retrieve the historystack from. This Command tries to put itself on the ContextItem's history stack after the action is finished. * @param item The ContextItem this Command operates on * @param des The description as will show up in the HistoryView */ Command::Command(ContextItem* item, const QString& des) : QUndoCommand(des) { Q_ASSERT(item); m_historyStack = item->get_history_stack(); m_isHistorable = true; } Command::~Command() {} /** * Virtual function, only needs to be reimplemented when making a hold type of Command In case of a 'Hold fact' type of Command, you should also retrieve
the 'old' state here to be able to restore it in undo_action() * @return Return value must != -1 on success, -1 on failure */ int Command::begin_hold() { PERROR("Hold actions should re-implement this function!!"); return -1; } /** * Virtual function, only needs to be reimplemented when making a hold type of Command * @return Return value not used right now */ int Command::finish_hold() { return -1; } /** * Virtual function, only needs to be reimplemented when making a hold type of Command This function makes it possible to create 'analog' type of actions possible.
Use the convenience functions of ContextPointer to get scene x and y coordinates
to move or adjust canvas items positions/parameters. * @return Return value not used right now */ int Command::jog() { return -1; } /** * Used by the InputEngine to set a Command valid or not, which is detected by the return values of begin_hold(), prepare_actions() Only valid commands will be pushed upon the historystack. * @param valid */ void Command::set_valid(bool valid) { PENTER3; m_isValid = valid; } // Internal function, not to be used outside of InputEngine int Command::push_to_history_stack( ) { PENTER3; if (! m_isHistorable) { PMESG3("Not a Historable command, deleting the command"); return -1; } if (! m_isValid) { PMESG3("This command is invalid, deleting the command"); return -1; } if (! m_historyStack) { PMESG3("This command has no HistoryStack, deleting the command"); return -1; } m_historyStack->push(this); return 1; } /** * Virtual function, needs to be reimplemented for all type of Commands Use this function to do any kind of calculation or information gathering to be able to perform the actual action in do_action() * @return Return value must != -1 on success, -1 on failure */ int Command::prepare_actions( ) { return -1; } /** * Virtual function, needs to be reimplemented for all type of Commands This function is called after the action is finished and each time the historystack 'redoes' an action.
Normally the data created in prepare_actions() will be used here to do the actuall action, which most of the case will be one or a few functions calls. In case of a Single fact type of Command, you should also retrieve
the 'old' state here to be able to restore it in undo_action() */ int Command::do_action( ) { return -1; } /** * Virtual function, needs to be reimplemented for all type of Commands This function is called each time the historystack 'undoes' an action,
use prepare_actions(), or in case of a hold type command begin_hold() to
store the old value(s), your command will change in do_action(), and use
those here to restore the old state. */ int Command::undo_action( ) { return -1; } /** * Cancels the action (makes only sense for hold type of actions). Reimplement to undo any changes allready made, either be it data from the core that has changed, or e.g. gui items who moved in the jog() function. */ void Command::cancel_action() { // reimplement me } /** * Reimplement this function to receive the so called 'collected number' of the InputEngine The number collection is active during Hold Actions. A Hold type of command can use it to let the user type in a numerical value, which is then parsed by the (derived) Command class to set the variable it controls, like the position of an AudioClip, or the gain value of a Track * @param collected The QString of the collected number so far. Note that it can include a . (period) and a , (comma), hence the number is supplied as a string, and not a numerical value. */ void Command::set_collected_number(const QString & collected) { Q_UNUSED(collected); // reimplement me } /** * Uses the mouse hints specified in the keymap.xml file to set a cursor to hint the user which movement has to be made on hold type of commands Reimplement if you want a different type of cursor, or want to use the more advanced HoldCursor supplied by ViewPort * @param useX If 1, suggests horizontal mouse movement * @param useY If 1, suggests vertical mouse movement */ void Command::set_cursor_shape( int useX, int useY ) { ViewPort* view = cpointer().get_viewport(); if (useX && useY) { view->viewport()->setCursor(themer()->get_cursor("LRUD")); } else if (useX) { view->viewport()->setCursor(themer()->get_cursor("LR")); } else if (useY) { view->viewport()->setCursor(themer()->get_cursor("UD")); } else{ view->reset_cursor(); } } void Command::process_command(Command * cmd) { Q_ASSERT(cmd); if (cmd->prepare_actions() != -1) { cmd->set_valid(true); if (cmd->push_to_history_stack() < 0) { // QUndoStack calls redo() for us, now it's not // called, so we do it here! cmd->redo(); delete cmd; } } } void Command::set_historable(bool historible) { m_isHistorable = historible; } traverso-0.49.4/src/core/precompile.h000644 001750 001750 00000001203 11163362147 020006 0ustar00remonremon000000 000000 #include #include #include // All moc genereated code has this include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include traverso-0.49.4/src/core/gdither_types.h000644 001750 001750 00000002355 11163362147 020532 0ustar00remonremon000000 000000 /* * Copyright (C) 2002 Steve Harris * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * $Id: gdither_types.h,v 1.1 2006/04/20 14:51:39 r_sijrier Exp $ */ #ifndef GDITHER_TYPES_H #define GDITHER_TYPES_H #ifdef __cplusplus extern "C" { #endif typedef enum { GDitherNone = 0, GDitherRect, GDitherTri, GDitherShaped } GDitherType; typedef enum { GDither8bit = 8, GDither16bit = 16, GDither32bit = 32, GDitherFloat = 25, GDitherDouble = 54 } GDitherSize; typedef void *GDither; #ifdef __cplusplus } #endif #endif traverso-0.49.4/src/core/Config.cpp000644 001750 001750 00000007125 11163362147 017420 0ustar00remonremon000000 000000 /* Copyright (C) 2006-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "Config.h" #include "../config.h" #include "InputEngine.h" #include "AudioDevice.h" #include "Utils.h" #include #include #include // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" static const char* CONFIG_FILE_VERSION = "7"; Config& config() { static Config conf; return conf; } Config::~ Config( ) { } void Config::load_configuration() { QSettings settings(QSettings::IniFormat, QSettings::UserScope, "Traverso-DAW", "Traverso"); QStringList keys = settings.allKeys(); foreach(const QString &key, keys) { m_configs.insert(key, settings.value(key)); } set_audiodevice_driver_properties(); } void Config::reset_settings( ) { QSettings settings(QSettings::IniFormat, QSettings::UserScope, "Traverso-DAW", "Traverso"); settings.clear(); settings.setValue("ProgramVersion", VERSION); settings.setValue("ConfigFileVersion", CONFIG_FILE_VERSION); m_configs.clear(); load_configuration(); } void Config::check_and_load_configuration( ) { QSettings::setPath (QSettings::IniFormat, QSettings::UserScope, QDir::homePath () + "/.traverso"); load_configuration(); init_input_engine(); // Detect if the config file versions match, if not, there has been most likely // a change, overwrite with the newest version... if (m_configs.value("ConfigFileVersion").toString() != CONFIG_FILE_VERSION) { reset_settings(); } } void Config::init_input_engine( ) { ie().init_map(config().get_property("CCE", "keymap", "default").toString()); ie().set_hold_sensitiveness(config().get_property("CCE", "holdTimeout", 150).toInt()); ie().set_double_fact_interval(config().get_property("CCE", "doublefactTimeout", 180).toInt()); } void Config::save( ) { QSettings settings(QSettings::IniFormat, QSettings::UserScope, "Traverso-DAW", "Traverso"); QHash::const_iterator i = m_configs.constBegin(); while (i != m_configs.constEnd()) { settings.setValue(i.key(), i.value()); ++i; } set_audiodevice_driver_properties(); emit configChanged(); } QVariant Config::get_property( const QString & type, const QString & property, QVariant defaultValue ) { QVariant var = defaultValue; QString key = type + ("/") + property; if (m_configs.contains(key)) { var = m_configs.value(key); } else { m_configs.insert(key, defaultValue); } return var; } void Config::set_property( const QString & type, const QString & property, QVariant newValue ) { m_configs.insert(type + "/" + property, newValue); } void Config::set_audiodevice_driver_properties() { QHash hardwareconfigs; hardwareconfigs.insert("jackslave", get_property("Hardware", "jackslave", false)); hardwareconfigs.insert("numberofperiods", get_property("Hardware", "numberofperiods", 3)); audiodevice().set_driver_properties(hardwareconfigs); } traverso-0.49.4/src/core/WriteSource.cpp000644 001750 001750 00000024316 11163362147 020467 0ustar00remonremon000000 000000 /* Copyright (C) 2006-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "WriteSource.h" #include "Export.h" #include #include #include #include #include "Peak.h" #include "Utils.h" #include "DiskIO.h" // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" WriteSource::WriteSource( ExportSpecification* specification ) : AudioSource(specification->exportdir, specification->name) , m_spec(specification) { m_diskio = 0; m_writer = 0; m_peak = 0; } WriteSource::~WriteSource() { PENTERDES; if (m_peak) { delete m_peak; } for(int i=0; iisRecording) { delete m_spec; } if (m_writer) { delete m_writer; } } int WriteSource::process (nframes_t nframes) { float* float_buffer = 0; int chn; uint32_t x; uint32_t i; nframes_t written; nframes_t to_write = 0; int cnt = 0; // nframes MUST be greater then 0, this is a precondition ! Q_ASSERT(nframes); do { /* now do sample rate conversion */ if (m_sampleRate != (uint)m_spec->sample_rate) { int err; m_src_data.output_frames = m_out_samples_max / m_channelCount; int rate = audiodevice().get_sample_rate(); m_src_data.end_of_input = (m_spec->pos + TimeRef(nframes, rate)) >= m_spec->endLocation; m_src_data.data_out = m_dataF2; if (m_leftover_frames > 0) { /* input data will be in m_leftoverF rather than dataF */ m_src_data.data_in = m_leftoverF; if (cnt == 0) { /* first time, append new data from dataF into the m_leftoverF buffer */ memcpy (m_leftoverF + (m_leftover_frames * m_channelCount), m_spec->dataF, nframes * m_channelCount * sizeof(float)); m_src_data.input_frames = nframes + m_leftover_frames; } else { /* otherwise, just use whatever is still left in m_leftoverF; the contents were adjusted using memmove() right after the last SRC call (see below) */ m_src_data.input_frames = m_leftover_frames; } } else { m_src_data.data_in = m_spec->dataF; m_src_data.input_frames = nframes; } ++cnt; if ((err = src_process (m_src_state, &m_src_data)) != 0) { PWARN(("an error occured during sample rate conversion: %s"), src_strerror (err)); return -1; } to_write = m_src_data.output_frames_gen; m_leftover_frames = m_src_data.input_frames - m_src_data.input_frames_used; if (m_leftover_frames > 0) { if (m_leftover_frames > m_max_leftover_frames) { PWARN("warning, leftover frames overflowed, glitches might occur in output"); m_leftover_frames = m_max_leftover_frames; } memmove (m_leftoverF, (char *) (m_src_data.data_in + (m_src_data.input_frames_used * m_channelCount)), m_leftover_frames * m_channelCount * sizeof(float)); } float_buffer = m_dataF2; } else { /* no SRC, keep it simple */ to_write = nframes; m_leftover_frames = 0; float_buffer = m_spec->dataF; } if (m_output_data) { memset (m_output_data, 0, m_sample_bytes * to_write * m_channelCount); } switch (m_spec->data_width) { case 8: case 16: case 24: for (chn = 0; chn < m_channelCount; ++chn) { gdither_runf (m_dither, chn, to_write, float_buffer, m_output_data); } /* and export to disk */ written = m_writer->write(m_output_data, to_write); break; case 32: for (chn = 0; chn < m_channelCount; ++chn) { int *ob = (int *) m_output_data; const double int_max = (float) INT_MAX; const double int_min = (float) INT_MIN; for (x = 0; x < to_write; ++x) { i = chn + (x * m_channelCount); if (float_buffer[i] > 1.0f) { ob[i] = INT_MAX; } else if (float_buffer[i] < -1.0f) { ob[i] = INT_MIN; } else { if (float_buffer[i] >= 0.0f) { ob[i] = lrintf (int_max * float_buffer[i]); } else { ob[i] = - lrintf (int_min * float_buffer[i]); } } } } /* and export to disk */ written = m_writer->write(m_output_data, to_write); break; default: for (x = 0; x < to_write * m_channelCount; ++x) { if (float_buffer[x] > 1.0f) { float_buffer[x] = 1.0f; } else if (float_buffer[x] < -1.0f) { float_buffer[x] = -1.0f; } } /* and export to disk */ written = m_writer->write(float_buffer, to_write); break; } } while (m_leftover_frames >= nframes); return 0; } int WriteSource::prepare_export() { PENTER; Q_ASSERT(m_spec->is_valid() == 1); GDitherSize dither_size; m_sampleRate = audiodevice().get_sample_rate(); m_channelCount = m_spec->channels; m_processPeaks = false; m_diskio = 0; m_dataF2 = m_leftoverF = 0; m_dither = 0; m_output_data = 0; m_src_state = 0; switch (m_spec->data_width) { case 8: dither_size = GDither8bit; break; case 16: dither_size = GDither16bit; break; case 24: dither_size = GDither32bit; break; default: dither_size = GDitherFloat; break; } if (m_writer) { delete m_writer; } m_writer = AbstractAudioWriter::create_audio_writer(m_spec->writerType); m_writer->set_rate(m_spec->sample_rate); m_writer->set_bits_per_sample(m_spec->data_width); m_writer->set_num_channels(m_channelCount); QString key; foreach (key, m_spec->extraFormat.keys()) { if (m_writer->set_format_attribute(key, m_spec->extraFormat[key]) == false) { printf("Invalid Extra Format Info: %s=%s\n", QS_C(key), QS_C(m_spec->extraFormat[key])); } } set_name(get_name() + m_writer->get_extension()); if (m_writer->open(m_fileName) == false) { return -1; } if ((uint)m_spec->sample_rate != m_sampleRate) { qDebug("Doing samplerate conversion"); int err; if ((m_src_state = src_new (m_spec->src_quality, m_channelCount, &err)) == 0) { PWARN("cannot initialize sample rate conversion: %s", src_strerror (err)); return -1; } m_src_data.src_ratio = m_spec->sample_rate / (double) m_sampleRate; m_out_samples_max = (nframes_t) ceil (m_spec->blocksize * m_src_data.src_ratio * m_channelCount); m_dataF2 = new audio_sample_t[m_out_samples_max]; m_max_leftover_frames = 4 * m_spec->blocksize; m_leftoverF = new audio_sample_t[m_max_leftover_frames * m_channelCount]; m_leftover_frames = 0; } else { m_out_samples_max = m_spec->blocksize * m_channelCount; } m_dither = gdither_new (m_spec->dither_type, m_channelCount, dither_size, m_spec->data_width); /* allocate buffers where dithering and output will occur */ switch (m_spec->data_width) { case 8: m_sample_bytes = 1; break; case 16: m_sample_bytes = 2; break; case 24: case 32: m_sample_bytes = 4; break; default: m_sample_bytes = 0; // float format break; } if (m_sample_bytes) { m_output_data = (void*) malloc (m_sample_bytes * m_out_samples_max); } return 0; } int WriteSource::finish_export( ) { PENTER; if (m_writer) { m_writer->close(); delete m_writer; m_writer = 0; } if (m_dataF2) delete m_dataF2; if (m_leftoverF) delete m_leftoverF; if (m_dither) { gdither_free (m_dither); m_dither = 0; } if (m_output_data) { free (m_output_data); m_output_data = 0; } if (m_src_state) { src_delete (m_src_state); m_src_state = 0; } if (m_peak && m_peak->finish_processing() < 0) { PERROR("WriteSource::finish_export : peak->finish_processing() failed!"); } if (m_diskio) { m_diskio->unregister_write_source(this); } emit exportFinished(); return 1; } int WriteSource::rb_write(audio_sample_t** src, nframes_t cnt) { int written = 0; for (int chan=m_channelCount-1; chan>=0; --chan) { written = m_buffers.at(chan)->write(src[chan], cnt); } return written; } void WriteSource::set_process_peaks( bool process ) { m_processPeaks = process; if (!m_processPeaks) { return; } Q_ASSERT(!m_peak); m_peak = new Peak(this); if (m_peak->prepare_processing(audiodevice().get_sample_rate()) < 0) { PERROR("Cannot process peaks realtime"); m_processPeaks = false; delete m_peak; m_peak = 0; return; } } int WriteSource::rb_file_write(nframes_t cnt) { uint read = 0; int chan; audio_sample_t* readbuffer[m_channelCount]; for (chan=0; chanread(readbuffer[chan], cnt); if (read != cnt) { printf("WriteSource::rb_file_write() : could only process %d frames, %d were requested!\n", read, cnt); } m_peak->process(chan, readbuffer[chan], read); } if (read > 0) { if (m_channelCount == 1) { m_spec->dataF = readbuffer[0]; } else { // Interlace data into dataF buffer! for (uint f=0; fdataF[f * m_channelCount + chan] = readbuffer[chan][f]; } } } process(read); } for (chan=0; chandataF = buffer; int readSpace = m_buffers.at(0)->read_space(); if (! m_isRecording ) { PMESG("Writing remaining (%d) samples to ringbuffer", readSpace); rb_file_write(readSpace); finish_export(); return; } rb_file_write(readSpace); } void WriteSource::prepare_rt_buffers( ) { m_bufferSize = m_sampleRate * DiskIO::writebuffertime; m_chunkSize = m_bufferSize / DiskIO::bufferdividefactor; for (int i=0; i(m_bufferSize)); } } void WriteSource::set_diskio( DiskIO * io ) { m_diskio = io; prepare_rt_buffers(); } traverso-0.49.4/src/core/noise.h000644 001750 001750 00000000672 11163362147 016775 0ustar00remonremon000000 000000 #ifndef NOISE_H #define NOISE_H /* Can be overrriden with any code that produces whitenoise between 0.0f and * 1.0f, eg (random() / (float)RAND_MAX) should be a good source of noise, but * its expensive */ #ifndef GDITHER_NOISE #define GDITHER_NOISE gdither_noise() #endif inline static float gdither_noise() { static uint32_t rnd = 23232323; rnd = (rnd * 196314165) + 907633515; return rnd * 2.3283064365387e-10f; } #endif traverso-0.49.4/src/core/TimeLine.h000644 001750 001750 00000003457 11163362147 017372 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef TIME_LINE_H #define TIME_LINE_H #include "ContextItem.h" #include #include #include "defines.h" class Sheet; class Marker; class Snappable; class Command; class TimeLine : public ContextItem { Q_OBJECT public: TimeLine(Sheet* sheet); ~TimeLine() {}; QDomNode get_state(QDomDocument doc); int set_state(const QDomNode& node); QList get_markers() const {return m_markers;} Sheet *get_sheet() const {return m_sheet;} Marker* get_marker(qint64 id); Marker* get_end_marker(); bool get_end_location(TimeRef& location); bool get_start_location(TimeRef& location); bool has_end_marker(); Command* add_marker(Marker* marker, bool historable=true); Command* remove_marker(Marker* marker, bool historable=true); private: Sheet* m_sheet; QList m_markers; void index_markers(); private slots: void private_add_marker(Marker* marker); void private_remove_marker(Marker* marker); void marker_position_changed(); signals: void markerAdded(Marker*); void markerRemoved(Marker*); void markerPositionChanged(); }; #endif //eof traverso-0.49.4/src/core/FileHelpers.h000644 001750 001750 00000002114 11163362147 020053 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2006 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: FileHelpers.h,v 1.4 2007/10/06 14:17:58 r_sijrier Exp $ */ #ifndef FILE_HELPER_H #define FILE_HELPER_H #include class FileHelper { public: static int remove_recursively(const QString& pName); static int copy_recursively(const QString& pNameFrom, const QString& pNameTo); static QString fileerror_to_string(int error); }; #endif traverso-0.49.4/src/core/ViewPort.h000644 001750 001750 00000005711 11427550350 017434 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2006 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef VIEWPORT_H #define VIEWPORT_H #include #include #include "ContextItem.h" class ViewItem; class ContextItem; class Import; class Track; class HoldCursor; class QGraphicsTextItem; class ViewPort : public QGraphicsView { Q_OBJECT public : ViewPort(QWidget* parent); ViewPort(QGraphicsScene* scene, QWidget* parent); ~ViewPort(); // Get functions virtual void get_pointed_context_items(QList &list) = 0; // Set functions void set_holdcursor(const QString& cursorName); void set_holdcursor_text(const QString& text); void set_holdcursor_pos(QPoint pos); void set_current_mode(int mode); void reset_cursor(); void set_jogging(bool jog); int get_current_mode() const {return m_mode;} protected: virtual bool event(QEvent *event); virtual void leaveEvent ( QEvent * event ); virtual void enterEvent ( QEvent * ); virtual void paintEvent( QPaintEvent* e); virtual void mouseMoveEvent(QMouseEvent* e); virtual void mousePressEvent ( QMouseEvent * e ); virtual void mouseReleaseEvent ( QMouseEvent * e ); virtual void mouseDoubleClickEvent ( QMouseEvent * e ); virtual void wheelEvent ( QWheelEvent* e ); virtual void keyPressEvent ( QKeyEvent* e); virtual void keyReleaseEvent ( QKeyEvent* e); void tabletEvent ( QTabletEvent * event ); private: int m_mode; bool m_holdCursorActive; HoldCursor* m_holdcursor; QPoint m_oldMousePos; QPointF lastMouseMoveScenePoint; // Interface wants to call mouseMoveEvent() friend class Interface; }; class HoldCursor : public ContextItem, public QGraphicsItem { Q_OBJECT #if QT_VERSION >= 0x040600 Q_INTERFACES(QGraphicsItem) #endif public: HoldCursor(ViewPort* vp); ~HoldCursor(); void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); void set_text(const QString& text); void set_type(const QString& type); void set_pos(QPoint pos); void reset(); QRectF boundingRect() const; private: ViewPort* m_vp; QGraphicsTextItem* m_textItem; QPoint m_pos; QPixmap m_pixmap; QString m_text; }; #endif //eof traverso-0.49.4/src/core/Themer.cpp000755 001750 001750 00000041176 11163362147 017446 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2006 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: Themer.cpp,v 1.11 2009/02/06 14:39:21 r_sijrier Exp $ */ #include "Themer.h" #include #include #include #include #include #include #include #include // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" Themer* Themer::m_instance = 0; Themer* themer() { return Themer::instance(); } Themer* Themer::instance() { if (m_instance == 0) { m_instance = new Themer(); } return m_instance; } Themer::Themer() { m_watcher = new QFileSystemWatcher(this); QString themepath = config().get_property("Themer", "themepath", "").toString(); // No theme path specified, fall back on built in themes only if (themepath.isEmpty()) { themepath = ":/themes"; } // Detect and set theme based on current style // but only when no theme was specified by the user! m_currentTheme = config().get_property("Themer", "currenttheme", "").toString(); m_systempallete = QApplication::palette(); QString style = config().get_property("Themer", "style", "").toString(); QString currentStyle = QString(QApplication::style()->metaObject()->className()).remove("Q").remove("Style"); if (style.isEmpty()) { style = currentStyle; config().set_property("Themer", "style", currentStyle); } if (style != currentStyle) { QApplication::setStyle(style); currentStyle = style; config().set_property("Themer", "style", currentStyle); } if (m_currentTheme.isEmpty()) { if (currentStyle == "Cleanlooks") { m_currentTheme = "ubuntu"; } else if (currentStyle == "Plastique") { m_currentTheme = "TraversoLight"; } else { m_currentTheme = "TraversoLight"; } config().set_property("Themer", "currenttheme", m_currentTheme); } if (get_builtin_themes().contains(m_currentTheme)) { themepath = ":/themes"; } m_themefile = themepath + "/" + m_currentTheme + "/traversotheme.xml"; m_coloradjust = -1; bool usestylepallete = config().get_property("Themer", "usestylepallet", "false").toBool(); if (usestylepallete) { QApplication::setPalette(QApplication::style()->standardPalette()); } connect(m_watcher, SIGNAL(fileChanged(const QString&)), this, SLOT(reload_on_themefile_change(const QString&))); } void Themer::save( ) { QDomDocument doc("TraversoTheming"); QString fileName = QDir::homePath(); fileName += "/.traverso/themes/default.xml"; QFile data( fileName ); if (data.open( QIODevice::WriteOnly ) ) { QDomElement colorManagerNode = doc.createElement("Themer"); doc.appendChild(colorManagerNode); QHash::ConstIterator it = m_colors.begin(); while (it != m_colors.end()) { QColor color = it.value(); QDomElement colorProperty = doc.createElement("color"); colorProperty.setAttribute("red", color.red()); colorProperty.setAttribute("green", color.green()); colorProperty.setAttribute("blue", color.blue()); colorProperty.setAttribute("alpha", color.alpha() ); colorProperty.setAttribute("name", it.key() ); QVariant v; v = color; colorProperty.setAttribute("color", color.name()); ++it; colorManagerNode.appendChild(colorProperty); } QTextStream stream(&data); doc.save(stream, 4); data.close(); } else { PWARN("Could not open Themer properties file for writing! (%s)", QS_C(fileName)); } } void Themer::load( ) { QDomDocument doc("TraversoTheming"); QFile file(m_themefile); if ( ! file.exists() ) { printf("File %s doesn't exit, falling back to default (TraversoLight) theme\n", QS_C(m_themefile)); file.setFileName(":/themes/TraversoLight/traversotheme.xml"); } else { if (!m_themefile.contains(":/")) { m_watcher->addPath(m_themefile); } printf("Themer:: Using themefile: %s\n", QS_C(m_themefile)); } if (!file.open(QIODevice::ReadOnly)) { PWARN("Cannot open Themer properties file"); } QString errorMsg; if (!doc.setContent(&file, &errorMsg)) { file.close(); PWARN("Cannot set Content of XML file (%s)", QS_C(errorMsg)); } file.close(); QDomElement docElem = doc.documentElement(); QDomNode colorsNode = docElem.firstChildElement("colors"); QDomNode colorNode = colorsNode.firstChild(); int coloradjust = config().get_property("Themer", "coloradjust", 100).toInt(); // If the m_coloradjust value is set, use that one instead! if (m_coloradjust != -1) { coloradjust = m_coloradjust; } while(!colorNode.isNull()) { QDomElement e = colorNode.toElement(); QColor color( e.attribute("red").toUInt(), e.attribute("green").toUInt(), e.attribute("blue").toUInt(), e.attribute("alpha").toInt() ); QString name = e.attribute("name", ""); if (coloradjust != 100) { int adjust = coloradjust - 100; if (adjust < 0) { color = color.dark(-1 * adjust + 100); } else { color = color.light(adjust + 100); } } m_colors.insert(name, color); colorNode = colorNode.nextSibling(); } QDomNode fontsNode = docElem.firstChildElement("fonts"); QDomNode fontNode = fontsNode.firstChild(); QFont basefont = QApplication::font(); while (!fontNode.isNull()) { QDomElement e = fontNode.toElement(); QString name = e.attribute("name", ""); QFont font(basefont); font.setPointSizeF(e.attribute("value", "1.0").toFloat() * (float)basefont.pointSizeF()); m_fonts.insert(name, font); fontNode = fontNode.nextSibling(); } QDomNode propertiesNode = docElem.firstChildElement("properties"); QDomNode propertyNode = propertiesNode.firstChild(); while (!propertyNode.isNull()) { QDomElement e = propertyNode.toElement(); QString name = e.attribute("name", ""); QVariant value = e.attribute("value", ""); m_properties.insert(name, value); propertyNode = propertyNode.nextSibling(); } m_cursors.clear(); m_cursors.insert("AudioClip", QCursor(find_pixmap(":/cursorFloatOverClip"))); m_cursors.insert("Track", QCursor(find_pixmap(":/cursorFloatOverTrack"))); m_cursors.insert("Plugin", QCursor(find_pixmap(":/cursorFloatOverPlugin"))); m_cursors.insert("Fade", QCursor(find_pixmap(":/cursorFloatOverFade"))); m_cursors.insert("Default", QCursor(find_pixmap(":/cursorFloat"))); m_cursors.insert("Zoom", QCursor(find_pixmap(":/cursorZoom"))); m_cursors.insert("ZoomVertical", QCursor(find_pixmap(":/cursorZoomVertical"))); m_cursors.insert("ZoomHorizontal", QCursor(find_pixmap(":/cursorZoomHorizontal"))); m_cursors.insert("CurveNode", QCursor(find_pixmap(":/cursorDragNode"))); m_cursors.insert("LRUD", QCursor(find_pixmap(":/cursorHoldLrud"))); m_cursors.insert("LR", QCursor(find_pixmap(":/cursorHoldLr"))); m_cursors.insert("UD", QCursor(find_pixmap(":/cursorHoldUd"))); emit themeLoaded(); } QColor Themer::get_color(const QString& name) const { if (m_colors.contains(name)) { return m_colors.value(name); } else { return themer()->get_default_color(name); } } QFont Themer::get_font(const QString& fontname) const { return m_fonts.value(fontname); } QVariant Themer::get_property(const QString& propertyname, const QVariant& defaultValue) const { return m_properties.value(propertyname, defaultValue); } QCursor Themer::get_cursor(const QString & name) const { return m_cursors.value(name); } void Themer::reload_on_themefile_change(const QString&) { m_colors.clear(); m_fonts.clear(); m_properties.clear(); load(); } void Themer::set_path_and_theme(const QString& path, const QString& theme) { if (m_currentTheme == theme) { return; } m_currentTheme = theme; m_themefile = path + "/" + theme + "/traversotheme.xml"; reload_on_themefile_change(""); } void Themer::set_color_adjust_value(int value) { m_coloradjust = value; reload_on_themefile_change(""); } QStringList Themer::get_builtin_themes() { QStringList list; list << "system-palette" << "medium-contrast" << "ubuntu" << "TraversoLight"; return list; } void Themer::use_builtin_theme(const QString & theme) { if (m_currentTheme == theme) { return; } m_currentTheme = theme; m_themefile = QString(":/themes/") + theme + "/traversotheme.xml";; reload_on_themefile_change(""); } QColor Themer::get_default_color(const QString & name) { QPalette p = QApplication::style()->standardPalette(); QColor c = Qt::black; if (name == "Text:light") c = p.color(QPalette::BrightText); if (name == "Text:dark") c = p.color(QPalette::Text); if (name == "AudioClip:wavemacroview:outline") c = p.color(QPalette::WindowText); if (name == "AudioClip:wavemacroview:outline:curvemode") c = p.color(QPalette::WindowText); if (name == "AudioClip:wavemacroview:outline:muted") c = p.color(QPalette::WindowText); if (name == "AudioClip:wavemacroview:brush:top") c = p.color(QPalette::Highlight); if (name == "AudioClip:wavemacroview:brush:bottom") c = p.color(QPalette::Highlight); if (name == "AudioClip:wavemacroview:brush:hover:top") c = p.color(QPalette::Highlight); if (name == "AudioClip:wavemacroview:brush:hover:bottom") c = p.color(QPalette::Highlight); if (name == "AudioClip:wavemacroview:brush:muted:top") c = p.color(QPalette::Base); if (name == "AudioClip:wavemacroview:brush:muted:bottom") c = p.color(QPalette::Base); if (name == "AudioClip:wavemacroview:brush:curvemode:top") c = p.color(QPalette::Highlight); if (name == "AudioClip:wavemacroview:brush:curvemode:bottom") c = p.color(QPalette::Highlight); if (name == "AudioClip:wavemacroview:brush:curvemode:hover:top") c = p.color(QPalette::Highlight); if (name == "AudioClip:wavemacroview:brush:curvemode:hover:bottom") c = p.color(QPalette::Highlight); if (name == "AudioClip:wavemicroview") c = p.color(QPalette::Highlight); if (name == "AudioClip:wavemicroview:curvemode") c = p.color(QPalette::Highlight); if (name == "AudioClip:background:muted:top") c = p.color(QPalette::Base); if (name == "AudioClip:background:muted:bottom") c = p.color(QPalette::Base); if (name == "AudioClip:background:recording:top") c = p.color(QPalette::Base); if (name == "AudioClip:background:recording:bottom") c = p.color(QPalette::Base); if (name == "AudioClip:background:muted:mousehover:top") c = p.color(QPalette::Base); if (name == "AudioClip:background:muted:mousehover:bottom") c = p.color(QPalette::Base); if (name == "AudioClip:background:selected:top") c = p.color(QPalette::Highlight); if (name == "AudioClip:background:selected:bottom") c = p.color(QPalette::Highlight); if (name == "AudioClip:background:selected:mousehover:top") c = p.color(QPalette::Highlight); if (name == "AudioClip:background:selected:mousehover:bottom") c = p.color(QPalette::Highlight); if (name == "AudioClip:background:top") c = p.color(QPalette::Base); if (name == "AudioClip:background:bottom") c = p.color(QPalette::Base); if (name == "AudioClip:background:mousehover:top") c = p.color(QPalette::Base); if (name == "AudioClip:background:mousehover:bottom") c = p.color(QPalette::Base); if (name == "AudioClip:channelseperator") c = p.color(QPalette::WindowText); if (name == "AudioClip:channelseperator:selected") c = p.color(QPalette::WindowText); if (name == "AudioClip:contour") c = p.color(QPalette::WindowText); if (name == "AudioClip:clipinfobackground") c = p.color(QPalette::AlternateBase); if (name == "AudioClip:clipinfobackground:inactive") c = p.color(QPalette::AlternateBase); if (name == "AudioClip:sampleoverload") c = Qt::red; if (name == "AudioClip:invalidreadsource") c = Qt::red; if (name == "Curve:active") c = p.color(QPalette::BrightText); if (name == "Curve:inactive") c = p.color(QPalette::BrightText); if (name == "CurveNode:default") c = p.color(QPalette::BrightText); if (name == "CurveNode:blink") c = p.color(QPalette::BrightText); if (name == "Fade:default") { c = p.color(QPalette::Highlight); c.setAlpha(150); } if (name == "Fade:bypassed") { c = p.color(QPalette::Highlight); c.setAlpha(50); } if (name == "CorrelationMeter:margin") c = p.color(QPalette::Window); if (name == "CorrelationMeter:background") c = p.color(QPalette::Base); if (name == "CorrelationMeter:grid") c = p.color(QPalette::Dark); if (name == "CorrelationMeter:foreground:center") c = p.color(QPalette::Link); if (name == "CorrelationMeter:foreground:side") c = p.color(QPalette::LinkVisited); if (name == "CorrelationMeter:centerline") c = p.color(QPalette::Highlight); if (name == "CorrelationMeter:text") c = p.color(QPalette::WindowText); if (name == "FFTMeter:margin") c = p.color(QPalette::Window); if (name == "FFTMeter:background") c = p.color(QPalette::Base); if (name == "FFTMeter:grid") c = p.color(QPalette::Dark); if (name == "FFTMeter:foreground") c = p.color(QPalette::Link); if (name == "FFTMeter:curve:average") c = p.color(QPalette::LinkVisited); if (name == "FFTMeter:tickmarks:main") c = p.color(QPalette::Dark); if (name == "FFTMeter:tickmarks:sub") c = p.color(QPalette::Mid); if (name == "FFTMeter:text") c = p.color(QPalette::WindowText); if (name == "VUMeter:background:widget") c = p.color(QPalette::Window); if (name == "VUMeter:background:bar") c = p.color(QPalette::Base); if (name == "VUMeter:foreground:6db") c = Qt::red; if (name == "VUMeter:foreground:0db") c = Qt::yellow; if (name == "VUMeter:foreground:-6db") c = Qt::green; if (name == "VUMeter:foreground:-60db") c = Qt::blue; if (name == "VUMeter:font:active") c = p.color(QPalette::WindowText); if (name == "VUMeter:font:inactive") c = p.color(QPalette::WindowText); if (name == "VUMeter:overled:active") c = Qt::red; if (name == "VUMeter:overled:inactive") c = p.color(QPalette::Base); if (name == "InfoWidget:background") c = p.color(QPalette::Window); if (name == "Playhead:active") c = QColor(255, 0, 0, 180); if (name == "Playhead:inactive") c = QColor(255, 0, 0, 120); if (name == "Plugin:background") c = p.color(QPalette::Button); if (name == "Plugin:background:bypassed") c = p.color(QPalette::Light); if (name == "Plugin:text") c = p.color(QPalette::WindowText); if (name == "PluginSlider:background") c = p.color(QPalette::Mid); if (name == "PluginSlider:value") c = p.color(QPalette::Highlight); if (name == "ResourcesBin:alternaterowcolor") c = p.color(QPalette::AlternateBase); if (name == "Sheet:background") c = p.color(QPalette::Base); if (name == "SheetPanel:background") c = p.color(QPalette::Window); if (name == "Timeline:background") c = p.color(QPalette::Window); if (name == "Timeline:text") c = p.color(QPalette::WindowText); if (name == "Track:cliptopoffset") c = p.color(QPalette::Dark); if (name == "Track:clipbottomoffset") c = p.color(QPalette::Dark); if (name == "Track:background") c = p.color(QPalette::Base); if (name == "TrackPanel:background") c = p.color(QPalette::Window); if (name == "TrackPanel:text") c = p.color(QPalette::WindowText); if (name == "TrackPanel:slider:background") c = p.color(QPalette::Button); if (name == "TrackPanel:head:active") c = p.color(QPalette::Highlight); if (name == "TrackPanel:head:inactive") c = p.color(QPalette::Highlight); if (name == "TrackPanel:muteled") c = Qt::yellow; if (name == "TrackPanel:sololed") c = Qt::green; if (name == "TrackPanel:recled") c = Qt::red; if (name == "TrackPanel:led:inactive") c = p.color(QPalette::Button); if (name == "TrackPanel:trackseparation") c = p.color(QPalette::WindowText); if (name == "TrackPanel:led:margin:active") c = p.color(QPalette::Dark); if (name == "TrackPanel:led:margin:inactive") c = p.color(QPalette::Dark); if (name == "TrackPanel:led:font:active") c = p.color(QPalette::WindowText); if (name == "TrackPanel:led:font:inactive") c = p.color(QPalette::WindowText); if (name == "TrackPanel:bus:font") c = p.color(QPalette::WindowText); if (name == "TrackPanel:bus:background") c = p.color(QPalette::Button); if (name == "TrackPanel:bus:margin") c = p.color(QPalette::Dark); if (name == "Workcursor:default") c = QColor(100, 50, 100, 180); if (name == "Marker:default") c = Qt::red; if (name == "Marker:blink") c = p.color(QPalette::Highlight); if (name == "Marker:end") c = Qt::blue; if (name == "Marker:blinkend") c = p.color(QPalette::Highlight); return c; } traverso-0.49.4/src/core/Themer.h000755 001750 001750 00000004437 11163362147 017112 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2006 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: Themer.h,v 1.3 2007/08/15 16:08:07 n_doebelin Exp $ */ #ifndef COLORMANAGER_H #define COLORMANAGER_H #include #include #include #include #include #include #include #include class QFileSystemWatcher; class Themer : public QObject { Q_OBJECT public: void save(); void load(); void set_path_and_theme(const QString& path, const QString& theme); void use_builtin_theme(const QString& theme); void set_color_adjust_value(int value); QColor get_color(const QString& name) const; QFont get_font(const QString& fontname) const; QVariant get_property(const QString& propertyname, const QVariant& defaultValue=0) const; QPalette system_palette() const {return m_systempallete;} QStringList get_builtin_themes(); QCursor get_cursor(const QString& name) const; static Themer* instance(); private: Themer(); QHash m_colors; QHash m_properties; QHash m_fonts; QHash m_cursors; QFileSystemWatcher* m_watcher; QString m_themefile; int m_coloradjust; QPalette m_systempallete; QString m_currentTheme; QColor get_default_color(const QString& name); static Themer* m_instance; private slots: void reload_on_themefile_change(const QString&); signals: void themeLoaded(); }; // use this function to get the Colormanager object Themer* themer(); #endif traverso-0.49.4/src/core/FileHelpers.cpp000644 001750 001750 00000014371 12357214143 020414 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2006 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: FileHelpers.cpp,v 1.10 2007/11/05 15:49:30 r_sijrier Exp $ */ #include "FileHelpers.h" #include #include "Config.h" #include #include #include #include #include #include "Debugger.h" // delete file/dir pName after prepending $HOME/traversoprojects/ to it // // if it is a directory, calls itself recursively on any file/dir in the directory // before removing the directory int FileHelper::remove_recursively(const QString& pName) { QString name = config().get_property("Project", "directory", "/directory/unknown").toString(); name += "/" + pName; QFileInfo fileInfo(name); if (!fileInfo.exists()) { PERROR("File does not exist! %s", QS_C(name)); return -1; } if (!fileInfo.isWritable()) { PERROR("failed to remove %s: you don't have write access to it\n", name.toAscii().data()); return -1; } if(fileInfo.isFile()) { QFile file(name); if (!file.remove()) { PERROR("failed to remove file %s\n", name.toAscii().data()); return -1; } return 1; } else if(fileInfo.isDir()) { QDir dir(name); QFileInfoList list = dir.entryInfoList(); QFileInfo fi; for (int i = 0; i < list.size(); ++i) { fi = list.at(i); if ((fi.fileName() != ".") && (fi.fileName() != "..")) { QString nextFileName = pName + "/" + fi.fileName(); if (remove_recursively(nextFileName) < 0) { PERROR("failed to remove directory %s\n", nextFileName.toAscii().data()); return -1; } } } if (!dir.rmdir(name)) { PERROR("failed to remove directory %s\n", name.toAscii().data()); return -1; } return 1; } return 1; } int FileHelper::copy_recursively(const QString& pNameFrom, const QString& pNameTo) { #if defined (Q_WS_X11) || defined (Q_WS_MAC) QString nameFrom = config().get_property("Project", "directory", "/directory/unknown").toString(); QString nameTo(nameFrom); nameFrom += pNameFrom; nameTo += pNameTo; QFileInfo fileFromInfo(nameFrom); QFileInfo fileToInfo(nameTo); if (!fileFromInfo.exists()) { PERROR("File or directory %s doesn't exist\n", pNameFrom.toAscii().data()); return -1; } if (fileToInfo.exists()) { PERROR("File or directory %s already exists", pNameTo.toAscii().data()); return -1; } if(fileFromInfo.isFile()) { QFile fileFrom(nameFrom); if (!fileFrom.open(QIODevice::ReadOnly)) { PERROR("failed to open file %s for reading\n", nameFrom.toAscii().data()); return -1; } QFile fileTo(nameTo); if (!fileTo.open(QIODevice::WriteOnly)) { fileFrom.close(); PERROR("failed to open file for writting%s\n", nameFrom.toAscii().data()); return -1; } // the real copy part should perhaps be implemented using QDataStream // but .handle() will still be needed to get the optimal block-size // //! \todo does not keep file mode yet int bufferSize = 4096; int fileDescFrom = fileFrom.handle(); int fileDescTo = fileTo.handle(); #if defined(DHAVE_SYS_STAT_H) struct stat fileStat; if (fstat(fileDescFrom, &fileStat) == 0) { bufferSize = (int)fileStat.st_blksize; } #endif void *buffer = malloc(sizeof(char) * bufferSize); // QMemArray buffer(bufferSize); for (;;) { int nRead = read(fileDescFrom, buffer, bufferSize); if (nRead < 0) { fileFrom.close(); fileTo.close(); PERROR("Error while reading file %s\n", nameFrom.toAscii().data()); return -1; } if (nRead == 0) break; if (write(fileDescTo, buffer, nRead) < 0) { fileFrom.close(); fileTo.close(); PERROR("Error while writing file %s\n", nameTo.toAscii().data()); return -1; } } free(buffer); fileFrom.close(); fileTo.close(); return 0; } else if(fileFromInfo.isDir()) { QDir dirFrom(nameFrom); QDir dirTo(nameTo); if (!dirTo.mkdir(nameTo)) { PERROR("failed to create directory %s\n", nameTo.toAscii().data()); return -1; } QFileInfoList list = dirFrom.entryInfoList(); QFileInfo fi; QString fileName; for (int i = 0; i < list.size(); ++i) { fileName = fi.fileName(); if ((fileName != ".") && (fileName != "..")) { copy_recursively(pNameFrom + "/" + fileName, pNameTo + "/" + fileName); } } return 0; } #endif return -1; } QString FileHelper::fileerror_to_string(int error) { switch(error) { case QFile::NoError: return QObject::tr("No error occurred"); break; case QFile::ReadError: return QObject::tr("An error occurred when reading from the file."); break; case QFile::WriteError: return QObject::tr("An error occurred when writing to the file."); break; case QFile::FatalError: return QObject::tr("A fatal error occurred."); break; case QFile::OpenError: return QObject::tr("The file could not be opened."); break; case QFile::ResourceError: return QObject::tr("Resourc error"); break; case QFile::AbortError: return QObject::tr("The operation was aborted."); break; case QFile::TimeOutError: return QObject::tr("A timeout occurred."); break; case QFile::UnspecifiedError: return QObject::tr("An unspecified error occurred."); break; case QFile::RemoveError: return QObject::tr("The file could not be removed."); break; case QFile::RenameError: return QObject::tr("The file could not be renamed."); break; case QFile::PositionError: return QObject::tr("The position in the file could not be changed."); break; case QFile::ResizeError: return QObject::tr("The file could not be resized."); break; case QFile::PermissionsError: return QObject::tr("The file could not be accessed."); break; case QFile::CopyError: return QObject::tr("The file could not be copied."); break; default: return QObject::tr("Unknown error"); } } traverso-0.49.4/src/core/AudioFileMerger.cpp000644 001750 001750 00000011237 11163362147 021215 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "AudioFileMerger.h" #include #include #include "Export.h" #include "AbstractAudioReader.h" #include "ReadSource.h" #include "WriteSource.h" #include "Peak.h" #include "defines.h" AudioFileMerger::AudioFileMerger() { m_stopMerging = false; moveToThread(this); start(); connect(this, SIGNAL(dequeueTask()), this, SLOT(dequeue_tasks()), Qt::QueuedConnection); } void AudioFileMerger::enqueue_task(ReadSource * source0, ReadSource * source1, const QString& dir, const QString & outfilename) { MergeTask task; task.readsource0 = source0; task.readsource1 = source1; task.outFileName = outfilename; task.dir = dir; m_mutex.lock(); m_tasks.enqueue(task); m_mutex.unlock(); emit dequeueTask(); } void AudioFileMerger::dequeue_tasks() { m_mutex.lock(); if (m_tasks.size()) { MergeTask task = m_tasks.dequeue(); m_mutex.unlock(); process_task(task); return; } m_mutex.unlock(); } void AudioFileMerger::process_task(MergeTask task) { QString name = task.readsource0->get_name(); int length = name.length(); emit taskStarted(name.left(length-28)); uint buffersize = 16384; DecodeBuffer decodebuffer0; DecodeBuffer decodebuffer1; ExportSpecification* spec = new ExportSpecification(); spec->startLocation = TimeRef(); spec->endLocation = task.readsource0->get_length(); spec->totalTime = spec->endLocation; spec->pos = TimeRef(); spec->isRecording = false; spec->exportdir = task.dir; spec->writerType = "sndfile"; spec->extraFormat["filetype"] = "wav"; spec->data_width = 1; // 1 means float spec->channels = 2; spec->sample_rate = task.readsource0->get_rate(); spec->blocksize = buffersize; spec->name = task.outFileName; spec->dataF = new audio_sample_t[buffersize * 2]; WriteSource* writesource = new WriteSource(spec); if (writesource->prepare_export() == -1) { delete writesource; delete [] spec->dataF; delete spec; return; } // Enable on the fly generation of peak data to speedup conversion // (no need to re-read all the audio files to generate peaks) writesource->set_process_peaks(true); int oldprogress = 0; do { // if the user asked to stop processing, jump out of this // loop, and cleanup any resources in use. if (m_stopMerging) { goto out; } nframes_t diff = (spec->endLocation - spec->pos).to_frame(task.readsource0->get_rate()); nframes_t this_nframes = std::min(diff, buffersize); nframes_t nframes = this_nframes; memset (spec->dataF, 0, sizeof (spec->dataF[0]) * nframes * spec->channels); task.readsource0->file_read(&decodebuffer0, spec->pos, nframes); task.readsource1->file_read(&decodebuffer1, spec->pos, nframes); for (uint x = 0; x < nframes; ++x) { spec->dataF[x*spec->channels] = decodebuffer0.destination[0][x]; spec->dataF[1+(x*spec->channels)] = decodebuffer1.destination[0][x]; } // due the fact peak generating does _not_ happen in writesource->process // but in a function used by DiskIO, we have to hack the peak processing // in here. writesource->get_peak()->process(0, decodebuffer0.destination[0], nframes); writesource->get_peak()->process(1, decodebuffer1.destination[0], nframes); // Process the data, and write to disk writesource->process(buffersize); spec->pos.add_frames(nframes, task.readsource0->get_rate()); int currentprogress = int(double(spec->pos.universal_frame()) / double(spec->totalTime.universal_frame()) * 100); if (currentprogress > oldprogress) { oldprogress = currentprogress; emit progress(currentprogress); } } while (spec->pos != spec->totalTime); out: writesource->finish_export(); delete writesource; delete [] spec->dataF; delete spec; // The user asked to stop processing, exit the event loop // and signal we're done. if (m_stopMerging) { exit(0); wait(1000); m_tasks.clear(); emit processingStopped(); return; } emit taskFinished(name.left(length-28)); } void AudioFileMerger::stop_merging() { m_stopMerging = true; } traverso-0.49.4/src/core/Marker.cpp000644 001750 001750 00000007733 11163362147 017441 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "Marker.h" #include "Sheet.h" #include "TimeLine.h" #include "Utils.h" Marker::Marker(TimeLine* tl, const TimeRef when, Type type) : ContextItem(tl) , Snappable() , m_timeline(tl) , m_when(when) , m_type(type) { QObject::tr("Marker"); set_history_stack(m_timeline->get_history_stack()); m_id = create_id(); set_snap_list(m_timeline->get_sheet()->get_snap_list()); m_description = ""; m_performer = ""; m_composer = ""; m_arranger = ""; m_message = ""; m_isrc = ""; m_preemph = 0; m_copyprotect = 0; m_index = -1; } Marker::Marker(TimeLine * tl, const QDomNode node) : ContextItem(tl) , Snappable() , m_timeline(tl) { set_snap_list(m_timeline->get_sheet()->get_snap_list()); set_history_stack(m_timeline->get_history_stack()); set_state(node); } QDomNode Marker::get_state(QDomDocument doc) { QDomElement domNode = doc.createElement("Marker"); domNode.setAttribute("position", m_when.universal_frame()); domNode.setAttribute("description", m_description); domNode.setAttribute("id", m_id); domNode.setAttribute("performer", m_performer); domNode.setAttribute("composer", m_composer); domNode.setAttribute("songwriter", m_songwriter); domNode.setAttribute("arranger", m_arranger); domNode.setAttribute("message", m_message); domNode.setAttribute("isrc", m_isrc); domNode.setAttribute("preemphasis", m_preemph); domNode.setAttribute("copyprotection", m_copyprotect); switch (m_type) { case CDTRACK: domNode.setAttribute("type", "CDTRACK"); break; case ENDMARKER: domNode.setAttribute("type", "ENDMARKER"); break; } return domNode; } int Marker::set_state(const QDomNode & node) { QDomElement e = node.toElement(); m_description = e.attribute("description", ""); QString tp = e.attribute("type", "CDTRACK"); m_when = TimeRef(e.attribute("position", "0").toLongLong()); m_id = e.attribute("id", "0").toLongLong(); m_performer = e.attribute("performer", ""); m_composer = e.attribute("composer", ""); m_songwriter = e.attribute("songwriter", ""); m_arranger = e.attribute("arranger", ""); m_message = e.attribute("message", ""); m_isrc = e.attribute("isrc", ""); m_preemph = e.attribute("preemphasis", "0").toInt(); m_copyprotect = e.attribute("copyprotection", "0").toInt(); if (tp == "CDTRACK") m_type = CDTRACK; if (tp == "ENDMARKER") m_type = ENDMARKER; return 1; } void Marker::set_when(const TimeRef& when) { if (m_when == when) return; m_when = when; emit positionChanged(); } void Marker::set_description(const QString &s) { if (m_description == s) return; m_description = s; emit descriptionChanged(); } void Marker::set_performer(const QString &s) { m_performer = s; } void Marker::set_composer(const QString &s) { m_composer = s; } void Marker::set_songwriter(const QString &s) { m_songwriter = s; } void Marker::set_arranger(const QString &s) { m_arranger = s; } void Marker::set_message(const QString &s) { m_message = s; } void Marker::set_isrc(const QString &s) { m_isrc = s; } void Marker::set_preemphasis(bool b) { m_preemph = b; } void Marker::set_copyprotect(bool b) { m_copyprotect = b; } bool Marker::get_preemphasis() { return m_preemph; } bool Marker::get_copyprotect() { return m_copyprotect; } void Marker::set_index(int i) { m_index = i; emit indexChanged(); } traverso-0.49.4/src/core/gdither.h000644 001750 001750 00000006577 11163362147 017320 0ustar00remonremon000000 000000 /* * Copyright (C) 2002 Steve Harris * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * $Id: gdither.h,v 1.2 2007/09/24 16:16:28 benjie Exp $ */ #ifndef GDITHER_H #define GDITHER_H #ifdef __cplusplus extern "C" { #endif #include "gdither_types.h" /* Create and initialise a state structure, takes a dither type, a number of * channels and a bit depth as input * * The Dither type is one of * * GDitherNone - straight nearest neighbour rounding. Theres no pressing * reason to do this at 8 or 16 bit, but you might want to at 24, for some * reason. At the least it will save you writing int->float conversion code, * which is harder than it sounds. * * GDitherRect - mathematically most accurate, lowest noise floor, but not * that good for audio. It is the fastest though. * * GDitherTri - a happy medium between Rectangular and Shaped, reasonable * noise floor, not too obvious, quite fast. * * GDitherShaped - should have the least audible impact, but has the highest * noise floor, fairly CPU intensive. Not advisible if your going to apply * any frequency manipulation afterwards. * * channels, sets the number of channels in the output data, output data will * be written interleaved into the area given to gdither_run(). Set to 1 * if you are not working with interleaved buffers. * * bit depth, sets the bit width of the output sample data, it can be one of: * * GDither8bit - 8 bit unsiged * GDither16bit - 16 bit signed * GDither32bit - 24+bits in upper bits of a 32 bit word * GDitherFloat - IEEE floating point (32bits) * GDitherDouble - Double precision IEEE floating point (64bits) * * dither_depth, set the number of bits before the signal will be truncated to, * eg. 16 will produce an output stream with 16bits-worth of signal. Setting to * zero or greater than the width of the output format will dither to the * maximum precision allowed by the output format. */ GDither gdither_new(GDitherType type, uint32_t channels, GDitherSize bit_depth, int dither_depth); /* Frees memory used by gdither_new. */ void gdither_free(GDither s); /* Applies dithering to the supplied signal. * * channel is the channel number you are processing (0 - channles-1), length is * the length of the input, in samples, x is the input samples (float), y is * where the output samples will be written, it should have the approaprate * type for the chosen bit depth */ void gdither_runf(GDither s, uint32_t channel, uint32_t length, float *x, void *y); /* see gdither_runf, but input argument is double format */ void gdither_run(GDither s, uint32_t channel, uint32_t length, double *x, void *y); #ifdef __cplusplus } #endif #endif traverso-0.49.4/src/core/ViewPort.cpp000644 001750 001750 00000025254 12357214027 017774 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2006 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include #include #include #include #include #include #include #include #include #include #include #include #include "InputEngine.h" #include "Themer.h" #include "ViewPort.h" #include "ContextPointer.h" #include "Import.h" #include // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" /** * \class ViewPort * \brief An Interface class to create Contextual, or so called 'Soft Selection' enabled Widgets. The ViewPort class inherits QGraphicsView, and thus is a true Canvas type of Widget.
Reimplement ViewPort to create a 'Soft Selection' enabled widget. You have to create
a QGraphicsScene object yourself, and set it as the scene the ViewPort visualizes. ViewPort should be used to visualize 'core' data objects. This is done by creating a
ViewItem object for each core class that has to be visualized. The naming convention
for classes that inherit ViewItem is: core class name + View.
E.g. the ViewItem class that represents an AudioClip should be named AudioClipView. All keyboard and mouse events by default are propagated to the InputEngine, which in
turn will parse the events. In case the event sequence was recognized by the InputEngine
it will ask a list of (pointed) ContextItem's from ContextPointer, which in turns
call's the pure virtual function get_pointed_context_items(), which you have to reimplement.
In the reimplemented function, you have to fill the supplied list with ViewItems that are
under the mouse cursor, and if needed, ViewItem's that _always_ have to be taken into account.
One can use the convenience functions of QGraphicsView for getting ViewItem's under the mouse cursor! Since there can be a certain delay before a key sequence has been verified, the ContextPointer
stores the position of the first event of a new key fact. This improves the pointed ViewItem
detection a lot in case the mouse is moved during a key sequence.
You should use these x/y coordinates in the get_pointed_context_items() function, see:
ContextPointer::on_first_input_event_x(), ContextPointer::on_first_input_event_y() * \sa ContextPointer, InputEngine */ ViewPort::ViewPort(QWidget* parent) : QGraphicsView(parent) , m_mode(0) { PENTERCONS; setFrameStyle(QFrame::NoFrame); setAlignment(Qt::AlignLeft | Qt::AlignTop); } ViewPort::ViewPort(QGraphicsScene* scene, QWidget* parent) : QGraphicsView(scene, parent) , m_mode(0) { PENTERCONS; setFrameStyle(QFrame::NoFrame); setAlignment(Qt::AlignLeft | Qt::AlignTop); setOptimizationFlag(DontAdjustForAntialiasing); setOptimizationFlag(DontSavePainterState); setOptimizationFlag(DontClipPainter); m_holdcursor = new HoldCursor(this); scene->addItem(m_holdcursor); m_holdcursor->hide(); // m_holdCursorActive is a replacement for m_holdcursor->isVisible() // in mouseMoveEvents, which crashes when a hold action in one viewport // ends with the mouse upon a different viewport. // Should get a proper fix ? m_holdCursorActive = false; } ViewPort::~ViewPort() { PENTERDES; cpointer().set_current_viewport((ViewPort*) 0); } bool ViewPort::event(QEvent * event) { // We want Tab events also send to the InputEngine // so treat them as 'normal' key events. if (event->type() == QEvent::KeyPress) { QKeyEvent *ke = static_cast(event); if (ke->key() == Qt::Key_Tab) { keyPressEvent(ke); return true; } } if (event->type() == QEvent::KeyRelease) { QKeyEvent *ke = static_cast(event); if (ke->key() == Qt::Key_Tab) { keyReleaseEvent(ke); return true; } } return QGraphicsView::event(event); } void ViewPort::mouseMoveEvent(QMouseEvent* event) { PENTER4; // Qt generates mouse move events when the scrollbars move // since a mouse move event generates a jog() call for the // active holding command, this has a number of nasty side effects :-( // For now, we ignore such events.... if (event->pos() == m_oldMousePos) { return; } QGraphicsSceneMouseEvent mouseEvent(QEvent::GraphicsSceneMouseMove); mouseEvent.setWidget(viewport()); // mouseEvent.setButtonDownScenePos(d->mousePressButton, d->mousePressScenePoint); // mouseEvent.setButtonDownScreenPos(d->mousePressButton, d->mousePressScreenPoint); mouseEvent.setScenePos(mapToScene(event->pos())); mouseEvent.setScreenPos(event->globalPos()); mouseEvent.setLastScenePos(lastMouseMoveScenePoint); mouseEvent.setLastScreenPos(mapFromScene(lastMouseMoveScenePoint)); mouseEvent.setButtons(event->buttons()); mouseEvent.setButton(event->button()); mouseEvent.setModifiers(event->modifiers()); lastMouseMoveScenePoint = mouseEvent.scenePos(); mouseEvent.setAccepted(false); m_oldMousePos = event->pos(); if (!ie().is_holding()) { QList itemsUnderCursor = scene()->items(mapToScene(event->pos())); if (itemsUnderCursor.size()) { itemsUnderCursor.first()->setCursor(itemsUnderCursor.first()->cursor()); } else { // If no item is below the mouse, default to default cursor viewport()->setCursor(themer()->get_cursor("Default")); } QApplication::sendEvent(scene(), &mouseEvent); } else { // It can happen that a cursor is set for a newly created viewitem // but we don't want that when the holdcursor is set! // So force it back to be a blankcursor. if (m_holdCursorActive /* was m_holdcursor->isVisible() */ && viewport()->cursor().shape() != Qt::BlankCursor) { viewport()->setCursor(Qt::BlankCursor); } } // QGraphicsView::mouseMoveEvent(event); cpointer().set_point(event->x(), event->y()); event->accept(); } void ViewPort::tabletEvent(QTabletEvent * event) { PMESG("ViewPort tablet event:: x, y: %d, %d", (int)event->x(), (int)event->y()); PMESG("ViewPort tablet event:: high resolution x, y: %d, %d", (int)event->hiResGlobalX(), (int)event->hiResGlobalY()); cpointer().set_point((int)event->x(), (int)event->y()); QGraphicsView::tabletEvent(event); } void ViewPort::enterEvent(QEvent* e) { QGraphicsView::enterEvent(e); cpointer().set_current_viewport(this); setFocus(); } void ViewPort::leaveEvent ( QEvent * event ) { QGraphicsView::leaveEvent(event); // There can be many reasons for a leave event, sometimes // this leaves the engine in a non-cleared state, e.g. modifier // keys still can be active!! So we reset those manually here. ie().clear_modifier_keys(); } void ViewPort::keyPressEvent( QKeyEvent * e) { ie().catch_key_press(e); e->accept(); } void ViewPort::keyReleaseEvent( QKeyEvent * e) { ie().catch_key_release(e); e->accept(); } void ViewPort::mousePressEvent( QMouseEvent * e ) { ie().catch_mousebutton_press(e); e->accept(); } void ViewPort::mouseReleaseEvent( QMouseEvent * e ) { ie().catch_mousebutton_release(e); e->accept(); } void ViewPort::mouseDoubleClickEvent( QMouseEvent * e ) { ie().catch_mousebutton_doubleclick(e); e->accept(); } void ViewPort::wheelEvent( QWheelEvent * e ) { ie().catch_scroll(e); e->accept(); } void ViewPort::paintEvent( QPaintEvent* e ) { // PWARN("ViewPort::paintEvent()"); QGraphicsView::paintEvent(e); } void ViewPort::reset_cursor( ) { viewport()->unsetCursor(); m_holdcursor->hide(); m_holdcursor->reset(); m_holdCursorActive = false; } void ViewPort::set_holdcursor( const QString & cursorName ) { viewport()->setCursor(Qt::BlankCursor); if (!m_holdCursorActive) { m_holdcursor->setPos(cpointer().scene_pos()); m_holdcursor->show(); } m_holdcursor->set_type(cursorName); m_holdCursorActive = true; } void ViewPort::set_holdcursor_text( const QString & text ) { m_holdcursor->set_text(text); // TODO Find out why we have to call set_holdcursor_pos() here // AGAIN when it allready has been called in for example MoveClip::jog() // to AVOID jitter of the hold cursor text item when the cursor is // out of the viewports range set_holdcursor_pos(mapToScene(cpointer().pos()).toPoint()); } void ViewPort::set_holdcursor_pos(QPoint pos) { m_holdcursor->set_pos(pos); } void ViewPort::set_current_mode(int mode) { m_mode = mode; } /**********************************************************************/ /* HoldCursor */ /**********************************************************************/ HoldCursor::HoldCursor(ViewPort* vp) : m_vp(vp) { m_textItem = new QGraphicsTextItem(this); m_textItem->setFont(themer()->get_font("ViewPort:fontscale:infocursor")); setZValue(200); } HoldCursor::~ HoldCursor( ) { } void HoldCursor::paint( QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget ) { Q_UNUSED(widget); Q_UNUSED(option); painter->drawPixmap(0, 0, m_pixmap); } void HoldCursor::set_text( const QString & text ) { m_text = text; if (!m_text.isEmpty()) { QString html = "" + m_text + ""; m_textItem->setHtml(html); m_textItem->show(); } else { m_textItem->hide(); } } void HoldCursor::set_type( const QString & type ) { m_pixmap = find_pixmap(type); int x = (int) pos().x(); int y = (int) pos().y(); setPos(x - m_pixmap.width() / 2, y - m_pixmap.height() / 2); } QRectF HoldCursor::boundingRect( ) const { return QRectF(0, 0, 130, 40); } void HoldCursor::reset() { m_text = ""; m_textItem->hide(); } void HoldCursor::set_pos(QPoint p) { int x = m_vp->mapFromScene(pos()).x(); int y = m_vp->mapFromScene(pos()).y(); int yoffset = 0; if (y < 0) { yoffset = - y; } else if (y > m_vp->height() - m_pixmap.height()) { yoffset = m_vp->height() - y - m_pixmap.height(); } int diff = m_vp->width() - (x + m_pixmap.width() + 8); if (diff < m_textItem->boundingRect().width()) { m_textItem->setPos(diff - m_pixmap.width(), yoffset); } else if (x < -m_pixmap.width()) { m_textItem->setPos(8 - x, yoffset); } else { m_textItem->setPos(m_pixmap.width() + 8, yoffset); } setPos(p); } traverso-0.49.4/src/core/Peak.cpp000644 001750 001750 00000062601 11163362147 017073 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "libtraversocore.h" #include "Peak.h" #include "AbstractAudioReader.h" // Needed for DecodeBuffer declaration #include "ReadSource.h" #include "ResourcesManager.h" #include "defines.h" #include "Mixer.h" #include "FileHelpers.h" #include #include #include #include "Debugger.h" #define NORMALIZE_CHUNK_SIZE 10000 #define PEAKFILE_MAJOR_VERSION 1 #define PEAKFILE_MINOR_VERSION 4 int Peak::zoomStep[] = { // non-cached zoomlevels. 1, 2, 4, 8, 12, 16, 24, 32, // Cached zoomlevels 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144, 524288, 1048576 }; QHash Peak::chacheIndexLut; Peak::Peak(AudioSource* source) { PENTERCONS; m_peaksAvailable = m_permanentFailure = m_interuptPeakBuild = false; QString sourcename = source->get_name(); QString path; Project* project = pm().get_project(); if (project) { path = project->get_root_dir() + "/peakfiles/"; } else { path = source->get_dir(); path = path.replace("audiosources", "peakfiles"); } for (uint chan = 0; chan < source->get_channel_count(); ++ chan) { ChannelData* data = new Peak::ChannelData; data->fileName = sourcename + "-ch" + QByteArray::number(chan) + ".peak"; data->fileName.prepend(path); data->pd = 0; m_channelData.append(data); } ReadSource* rs = qobject_cast(source); if (rs) { // This Peak object was created by AudioClip, meant for reading peak data m_source = resources_manager()->get_readsource(rs->get_id()); } else { // No ReadSource object? Then it's created by WriteSource for on the fly // peak data creation, no m_source needed! m_source = 0; } } Peak::~Peak() { PENTERDES; if (m_source) { delete m_source; } foreach(ChannelData* data, m_channelData) { if (data->normFile.isOpen()) { QFile::remove(data->normFileName); } #if QT_VERSION < 0x040400 #if defined Q_WS_X11 || defined Q_WS_MAC if (data->memory) { uchar *start = data->memory - data->maps[data->memory].first; int len = data->maps[data->memory].second; if (-1 == munmap(start, len)) { } data->maps.remove(data->memory); } #endif #endif delete data; } } void Peak::close() { pp().free_peak(this); } int Peak::read_header() { PENTER; Q_ASSERT(m_source); foreach(ChannelData* data, m_channelData) { data->file.setFileName(data->fileName); if (! data->file.open(QIODevice::ReadOnly)) { if (QFile::exists(data->fileName)) { m_permanentFailure = true; } QString errorstring = FileHelper::fileerror_to_string(data->file.error()); qWarning("Couldn't open peak file for reading! (%s, Error: %s)", QS_C(data->fileName), QS_C(errorstring)); return -1; } #if QT_VERSION >= 0x040400 data->memory = data->file.map(0, data->file.size()); if (data->memory) { PMESG3("Peak:: sucessfully mapped data into memory (%s)\n", QS_C(data->fileName)); } #elif defined(Q_WS_X11) || defined(Q_WS_MAC) int offset = 0; int size = data->file.size(); int pagesSize = getpagesize(); int realOffset = offset / pagesSize; int extra = offset % pagesSize; void *mapAddress = mmap((void*)0, (size_t)size + extra, PROT_READ, MAP_SHARED, data->file.handle(), realOffset * pagesSize); if (MAP_FAILED != mapAddress) { uchar *address = extra + static_cast(mapAddress); data->memory = address; data->maps[address] = QPair(extra, size); } #endif QFileInfo file(m_source->get_filename()); QFileInfo peakFile(data->fileName); QDateTime fileModTime = file.lastModified(); QDateTime peakModTime = peakFile.lastModified(); if (fileModTime > peakModTime) { PERROR("Source and Peak file modification time do not match"); printf("SourceFile modification time is %s\n", fileModTime.toString().toAscii().data()); printf("PeakFile modification time is %s\n", peakModTime.toString().toAscii().data()); return -1; } data->file.seek(0); data->file.read(data->headerdata.label, sizeof(data->headerdata.label)); data->file.read((char*)data->headerdata.version, sizeof(data->headerdata.version)); if ( (data->headerdata.label[0]!='T') || (data->headerdata.label[1]!='R') || (data->headerdata.label[2]!='A') || (data->headerdata.label[3]!='V') || (data->headerdata.label[4]!='P') || (data->headerdata.label[5]!='F') || (data->headerdata.version[0] != PEAKFILE_MAJOR_VERSION) || (data->headerdata.version[1] != PEAKFILE_MINOR_VERSION)) { printf("This file either isn't a Traverso Peak file, or the version doesn't match!\n"); data->file.close(); return -1; } data->file.read((char*)data->headerdata.peakDataOffsets, sizeof(data->headerdata.peakDataOffsets)); data->file.read((char*)data->headerdata.peakDataSizeForLevel, sizeof(data->headerdata.peakDataSizeForLevel)); data->file.read((char*)&data->headerdata.normValuesDataOffset, sizeof(data->headerdata.normValuesDataOffset)); data->file.read((char*)&data->headerdata.headerSize, sizeof(data->headerdata.headerSize)); data->peakreader = new PeakDataReader(data); data->peakdataDecodeBuffer = new DecodeBuffer; } m_peaksAvailable = true; return 1; } int Peak::write_header(ChannelData* data) { PENTER; data->file.seek(0); data->headerdata.label[0] = 'T'; data->headerdata.label[1] = 'R'; data->headerdata.label[2] = 'A'; data->headerdata.label[3] = 'V'; data->headerdata.label[4] = 'P'; data->headerdata.label[5] = 'F'; data->headerdata.version[0] = PEAKFILE_MAJOR_VERSION; data->headerdata.version[1] = PEAKFILE_MINOR_VERSION; data->file.write((char*)data->headerdata.label, sizeof(data->headerdata.label)); data->file.write((char*)data->headerdata.version, sizeof(data->headerdata.version)); data->file.write((char*)data->headerdata.peakDataOffsets, sizeof(data->headerdata.peakDataOffsets)); data->file.write((char*)data->headerdata.peakDataSizeForLevel, sizeof(data->headerdata.peakDataSizeForLevel)); data->file.write((char*) &data->headerdata.normValuesDataOffset, sizeof(data->headerdata.normValuesDataOffset)); data->file.write((char*) &data->headerdata.headerSize, sizeof(data->headerdata.headerSize)); return 1; } void Peak::start_peak_loading() { pp().queue_task(this); } int Peak::calculate_peaks( int chan, float ** buffer, TimeRef startlocation, int peakDataCount, qreal framesPerPeak) { PENTER3; if (m_permanentFailure) { return PERMANENT_FAILURE; } if(!m_peaksAvailable) { if (read_header() < 0) { return NO_PEAK_FILE; } } if (peakDataCount <= 0) { return NO_PEAKDATA_FOUND; } ChannelData* data = m_channelData.at(chan); int produced = 0; // PROFILE_START; // Macro view mode if (framesPerPeak >= 64) { int highbit; unsigned long nearestpow2 = nearest_power_of_two(qRound(framesPerPeak), highbit); if (nearestpow2 == 0) { return NO_PEAKDATA_FOUND; } nframes_t startPos = startlocation.to_frame(44100); int index = cache_index_lut()->value(nearestpow2, -1); if(index >= 0) { // printf("index %d\n", index); } int offset = qRound(startPos / nearestpow2) * 2; int truncate = 0; // Check if this zoom level has as many data as requested. if ( (peakDataCount + offset) > data->headerdata.peakDataSizeForLevel[index]) { truncate = peakDataCount - (data->headerdata.peakDataSizeForLevel[index] - offset); // pixelcount = data->headerdata.peakDataSizeForLevel[index] - offset; } nframes_t readposition = data->headerdata.headerSize + (data->headerdata.peakDataOffsets[index] + offset) * sizeof(peak_data_t); produced = data->peakreader->read_from(data->peakdataDecodeBuffer, readposition, peakDataCount); if (produced != peakDataCount) { PERROR("Could not read in all peak data, peakDataCount is %d, read count is %d", peakDataCount, produced); } // PROFILE_END("Peak calculate_peaks"); if (produced == 0) { return NO_PEAKDATA_FOUND; } // for (int i=(pixelcount-truncate); i<(pixelcount); ++i) { // data->peakdataDecodeBuffer->destination[0][i] = 0; // } // *buffer = data->peakdataDecodeBuffer->destination[0]; return produced; // Micro view mode } else { // Calculate the amount of frames to be read nframes_t toRead = qRound(peakDataCount * framesPerPeak); nframes_t readFrames = m_source->file_read(data->peakdataDecodeBuffer, startlocation, toRead); if (readFrames == 0) { return NO_PEAKDATA_FOUND; } if ( readFrames != toRead) { PWARN("Unable to read nframes %d (only %d available)", toRead, readFrames); } int count = 0; audio_sample_t sample; // MicroView needs a buffer to store the calculated peakdata // our decodebuffer's readbuffer is large enough for this purpose // and it's no problem to use it at this point in the process chain. float* peakdata = data->peakdataDecodeBuffer->readBuffer; ProcessData pd; // the stepSize depends on the real file sample rate, Peak assumes 44100 Hz // so if the file sample rate differs, the stepSize becomes the ratio of // the file sample rate and 44100 pd.stepSize = TimeRef(qreal(44100) / m_source->get_file_rate(), m_source->get_file_rate()); pd.processRange = TimeRef(framesPerPeak, m_source->get_file_rate()); for (uint i=0; i < readFrames; i++) { pd.processLocation += pd.stepSize; sample = data->peakdataDecodeBuffer->destination[chan][i]; pd.normValue = f_max(pd.normValue, fabsf(sample)); if (sample > pd.peakUpperValue) { pd.peakUpperValue = sample; } if (sample < pd.peakLowerValue) { pd.peakLowerValue = sample; } if (pd.processLocation >= pd.nextDataPointLocation) { if (pd.peakUpperValue > fabs(pd.peakLowerValue)) { peakdata[count] = pd.peakUpperValue; } else { peakdata[count] = pd.peakLowerValue; } pd.peakUpperValue = -10.0; pd.peakLowerValue = 10.0; pd.nextDataPointLocation += pd.processRange; count++; } } // printf("framesPerPeak, peakDataCount, generated, readFrames %f, %d, %d, %d\n", framesPerPeak, peakDataCount, count, readFrames); // PROFILE_END("Peak calculate_peaks"); // Assign the supplied buffer to the 'real' peakdata buffer. *buffer = peakdata; return count; } return 0; } int Peak::prepare_processing(int rate) { PENTER; foreach(ChannelData* data, m_channelData) { data->normFileName = data->fileName; data->normFileName.append(".norm"); // Create read/write enabled file data->file.setFileName(data->fileName); if (! data->file.open(QIODevice::ReadWrite)) { PWARN("Couldn't open peak file for writing! (%s)", data->fileName.toAscii().data()); m_permanentFailure = true; return -1; } // Create the temporary normalization data file data->normFile.setFileName(data->normFileName); if (! data->normFile.open(QIODevice::ReadWrite)) { PWARN("Couldn't open normalization data file for writing! (%s)", data->normFileName.toAscii().data()); m_permanentFailure = true; return -1; } // We need to know the headerSize. data->headerdata.headerSize = sizeof(data->headerdata.label) + sizeof(data->headerdata.version) + sizeof(data->headerdata.peakDataOffsets) + sizeof(data->headerdata.peakDataSizeForLevel) + sizeof(data->headerdata.normValuesDataOffset) + sizeof(data->headerdata.headerSize); // Now seek to the start position, so we can write the peakdata to it in the process function data->file.seek(data->headerdata.headerSize); data->pd = new Peak::ProcessData; data->pd->stepSize = TimeRef(nframes_t(1), rate); data->pd->processRange = TimeRef(nframes_t(64), 44100); } return 1; } int Peak::finish_processing() { PENTER; foreach(ChannelData* data, m_channelData) { if (data->pd->processLocation < data->pd->nextDataPointLocation) { peak_data_t peakvalue = (peak_data_t)(data->pd->peakUpperValue * MAX_DB_VALUE); data->file.write((char*)&peakvalue, sizeof(peak_data_t)); peakvalue = (peak_data_t)(-1 * data->pd->peakLowerValue * MAX_DB_VALUE); data->file.write((char*)&peakvalue, sizeof(peak_data_t)); data->pd->processBufferSize += 2; } int totalBufferSize = 0; data->headerdata.peakDataSizeForLevel[0] = data->pd->processBufferSize; totalBufferSize += data->pd->processBufferSize; for( int i = SAVING_ZOOM_FACTOR + 1; i < ZOOM_LEVELS+1; ++i) { data->headerdata.peakDataSizeForLevel[i - SAVING_ZOOM_FACTOR] = data->headerdata.peakDataSizeForLevel[i - SAVING_ZOOM_FACTOR - 1] / 2; totalBufferSize += data->headerdata.peakDataSizeForLevel[i - SAVING_ZOOM_FACTOR]; } data->file.seek(data->headerdata.headerSize); // The routine below uses a different total buffer size calculation // which might end up with a size >= totalbufferSize !!! // Need to look into that, for now + 2 seems to work... peak_data_t* saveBuffer = new peak_data_t[totalBufferSize + 1*sizeof(peak_data_t)]; int read = data->file.read((char*)saveBuffer, sizeof(peak_data_t) * data->pd->processBufferSize) / sizeof(peak_data_t); if (read != data->pd->processBufferSize) { PERROR("couldn't read in all saved data?? (%d read)", read); } int prevLevelBufferPos = 0; int nextLevelBufferPos; data->headerdata.peakDataSizeForLevel[0] = data->pd->processBufferSize; data->headerdata.peakDataOffsets[0] = 0; for (int i = SAVING_ZOOM_FACTOR+1; i < ZOOM_LEVELS+1; ++i) { int prevLevelSize = data->headerdata.peakDataSizeForLevel[i - SAVING_ZOOM_FACTOR - 1]; data->headerdata.peakDataOffsets[i - SAVING_ZOOM_FACTOR] = data->headerdata.peakDataOffsets[i - SAVING_ZOOM_FACTOR - 1] + prevLevelSize; prevLevelBufferPos = data->headerdata.peakDataOffsets[i - SAVING_ZOOM_FACTOR - 1]; nextLevelBufferPos = data->headerdata.peakDataOffsets[i - SAVING_ZOOM_FACTOR]; int count = 0; do { Q_ASSERT(nextLevelBufferPos <= totalBufferSize); saveBuffer[nextLevelBufferPos] = (peak_data_t) f_max(saveBuffer[prevLevelBufferPos], saveBuffer[prevLevelBufferPos + 2]); saveBuffer[nextLevelBufferPos + 1] = (peak_data_t) f_max(saveBuffer[prevLevelBufferPos + 1], saveBuffer[prevLevelBufferPos + 3]); nextLevelBufferPos += 2; prevLevelBufferPos += 4; count+=4; } while (count < prevLevelSize); } data->file.seek(data->headerdata.headerSize); int written = data->file.write((char*)saveBuffer, sizeof(peak_data_t) * totalBufferSize) / sizeof(peak_data_t); if (written != totalBufferSize) { PERROR("could not write complete buffer! (only %d)", written); // return -1; } data->normFile.seek(0); read = data->normFile.read((char*)saveBuffer, sizeof(audio_sample_t) * data->pd->normDataCount) / sizeof(audio_sample_t); if (read != data->pd->normDataCount) { PERROR("Could not read in all (%d) norm. data, only %d", data->pd->normDataCount, read); } data->headerdata.normValuesDataOffset = data->headerdata.headerSize + totalBufferSize * sizeof(peak_data_t); data->normFile.close(); if (!QFile::remove(data->normFileName)) { PERROR("Failed to remove temp. norm. data file! (%s)", data->normFileName.toAscii().data()); } written = data->file.write((char*)saveBuffer, sizeof(audio_sample_t) * read) / sizeof(audio_sample_t); write_header(data); data->file.close(); delete [] saveBuffer; delete data->pd; data->pd = 0; } emit finished(); return 1; } void Peak::process(uint channel, audio_sample_t* buffer, nframes_t nframes) { ChannelData* data = m_channelData.at(channel); ProcessData* pd = data->pd; for (uint i=0; i < nframes; i++) { pd->processLocation += pd->stepSize; audio_sample_t sample = buffer[i]; pd->normValue = f_max(pd->normValue, fabsf(sample)); if (sample > pd->peakUpperValue) { pd->peakUpperValue = sample; } if (sample < pd->peakLowerValue) { pd->peakLowerValue = sample; } if (pd->processLocation >= pd->nextDataPointLocation) { peak_data_t peakbuffer[2]; peakbuffer[0] = (peak_data_t) (pd->peakUpperValue * MAX_DB_VALUE ); peakbuffer[1] = (peak_data_t) (-1 * (pd->peakLowerValue * MAX_DB_VALUE )); int written = data->file.write((char*)peakbuffer, sizeof(peak_data_t) * 2) / sizeof(peak_data_t); if (written != 2) { PWARN("couldnt write peak data, only (%d)", written); } pd->peakUpperValue = -10.0; pd->peakLowerValue = 10.0; pd->processBufferSize+=2; pd->nextDataPointLocation += pd->processRange; } if (pd->normProcessedFrames == NORMALIZE_CHUNK_SIZE) { int written = data->normFile.write((char*)&pd->normValue, sizeof(audio_sample_t)) / sizeof(audio_sample_t); if (written != 1) { PWARN("couldnt write norm data, only (%d)", written); } pd->normValue = 0.0; pd->normProcessedFrames = 0; pd->normDataCount++; } pd->normProcessedFrames++; } } int Peak::create_from_scratch() { PENTER; // PROFILE_START; int ret = -1; if (prepare_processing(m_source->get_file_rate()) < 0) { return ret; } nframes_t readFrames = 0; nframes_t totalReadFrames = 0; nframes_t bufferSize = 65536; int progression = 0; if (m_source->get_length() == TimeRef()) { qWarning("Peak::create_from_scratch() : m_source (%s) has length 0", m_source->get_name().toAscii().data()); return ret; } if (m_source->get_nframes() < bufferSize) { bufferSize = 64; if (m_source->get_nframes() < bufferSize) { qDebug("source length is too short to display one pixel of the audio wave form in macro view"); return ret; } } DecodeBuffer decodebuffer; do { if (m_interuptPeakBuild) { ret = -1; goto out; } readFrames = m_source->file_read(&decodebuffer, totalReadFrames, bufferSize); if (readFrames <= 0) { PERROR("readFrames < 0 during peak building"); break; } for (uint chan = 0; chan < m_source->get_channel_count(); ++ chan) { process(chan, decodebuffer.destination[chan], readFrames); } totalReadFrames += readFrames; progression = (int) ((float)totalReadFrames / ((float)m_source->get_nframes() / 100.0)); ChannelData* data = m_channelData.at(0); if ( progression > data->pd->progress) { emit progress(progression); data->pd->progress = progression; } } while (totalReadFrames < m_source->get_nframes()); if (finish_processing() < 0) { ret = -1; goto out; } ret = 1; out: // PROFILE_END("Peak create from scratch"); return ret; } audio_sample_t Peak::get_max_amplitude(TimeRef startlocation, TimeRef endlocation) { foreach(ChannelData* data, m_channelData) { if (!data->file.isOpen() || !m_peaksAvailable) { printf("either the file is not open, or no peak data available\n"); return 0.0f; } } int rate = m_source->get_file_rate(); nframes_t startframe = startlocation.to_frame(rate); nframes_t endframe = endlocation.to_frame(rate); int startpos = startframe / NORMALIZE_CHUNK_SIZE; uint count = (endframe / NORMALIZE_CHUNK_SIZE) - startpos; uint buffersize = count < NORMALIZE_CHUNK_SIZE*2 ? NORMALIZE_CHUNK_SIZE*2 : count; audio_sample_t* readbuffer = new audio_sample_t[buffersize]; audio_sample_t maxamp = 0; DecodeBuffer decodebuffer; // Read in the part not fully occupied by a cached normalize value // at the left hand part and run compute_peak on it. if (startframe != 0) { startpos += 1; int toRead = (int) ((startpos * NORMALIZE_CHUNK_SIZE) - startframe); int read = m_source->file_read(&decodebuffer, startframe, toRead); for (uint chan = 0; chan < m_source->get_channel_count(); ++ chan) { maxamp = Mixer::compute_peak(decodebuffer.destination[chan], read, maxamp); } } // Read in the part not fully occupied by a cached normalize value // at the right hand part and run compute_peak on it. float f = (float) endframe / NORMALIZE_CHUNK_SIZE; int endpos = (int) f; int toRead = (int) ((f - (endframe / NORMALIZE_CHUNK_SIZE)) * NORMALIZE_CHUNK_SIZE); int read = m_source->file_read(&decodebuffer, endframe - toRead, toRead); if (read > 0) { for (uint chan = 0; chan < m_source->get_channel_count(); ++ chan) { maxamp = Mixer::compute_peak(decodebuffer.destination[chan], read, maxamp); } } // Now that we have covered both boundary situations, // read in the cached normvalues, and calculate the highest value! count = endpos - startpos; foreach(ChannelData* data, m_channelData) { data->file.seek(data->headerdata.normValuesDataOffset + (startpos * sizeof(audio_sample_t))); int read = data->file.read((char*)readbuffer, sizeof(audio_sample_t) * count) / sizeof(audio_sample_t); if (read != (int)count) { printf("Peak::get_max_amplitude: could only read %d, %d requested\n", read, count); } maxamp = Mixer::compute_peak(readbuffer, read, maxamp); } delete [] readbuffer; return maxamp; } /******** PEAK BUILD THREAD CLASS **********/ /******************************************/ PeakProcessor& pp() { static PeakProcessor processor; return processor; } PeakProcessor::PeakProcessor() { m_ppthread = new PPThread(this); m_taskRunning = false; m_runningPeak = 0; moveToThread(m_ppthread); m_ppthread->start(); connect(this, SIGNAL(newTask()), this, SLOT(start_task()), Qt::QueuedConnection); } PeakProcessor::~ PeakProcessor() { m_ppthread->exit(0); if (!m_ppthread->wait(1000)) { m_ppthread->terminate(); } delete m_ppthread; } void PeakProcessor::start_task() { m_runningPeak->create_from_scratch(); QMutexLocker locker(&m_mutex); m_taskRunning = false; if (m_runningPeak->m_interuptPeakBuild) { PMESG("PeakProcessor:: Deleting interrupted Peak!"); delete m_runningPeak; m_runningPeak = 0; m_wait.wakeAll(); return; } foreach(Peak* peak, m_queue) { if (m_runningPeak->m_source->get_filename() == peak->m_source->get_filename()) { m_queue.removeAll(peak); emit peak->finished(); } } m_runningPeak = 0; dequeue_queue(); } void PeakProcessor::queue_task(Peak * peak) { QMutexLocker locker(&m_mutex); m_queue.enqueue(peak); if (!m_taskRunning) { dequeue_queue(); } } void PeakProcessor::dequeue_queue() { if (!m_queue.isEmpty()) { m_taskRunning = true; m_runningPeak = m_queue.dequeue(); emit newTask(); } } void PeakProcessor::free_peak(Peak * peak) { m_mutex.lock(); m_queue.removeAll(peak); if (peak == m_runningPeak) { PMESG("PeakProcessor:: Interrupting running build process!"); peak->m_interuptPeakBuild = true; PMESG("PeakProcessor:: Waiting GUI thread until interrupt finished"); m_wait.wait(&m_mutex); PMESG("PeakProcessor:: Resuming GUI thread"); dequeue_queue(); m_mutex.unlock(); return; } m_mutex.unlock(); delete peak; } PPThread::PPThread(PeakProcessor * pp) { m_pp = pp; } void PPThread::run() { exec(); } PeakDataReader::PeakDataReader(Peak::ChannelData* data) { m_d = data; m_nframes = m_d->file.size(); m_readPos = 0; } nframes_t PeakDataReader::read_from(DecodeBuffer* buffer, nframes_t start, nframes_t count) { // printf("read_from:: before_seek from %d, framepos is %d\n", start, m_readPos); if (!seek(start)) { return 0; } return read(buffer, count); } bool PeakDataReader::seek(nframes_t start) { if (m_readPos != start) { Q_ASSERT(m_d->file.isOpen()); if (start >= m_nframes) { return false; } // only seek if we didn't mmap if (!m_d->memory) { if (!m_d->file.seek(start)) { qWarning("PeakDataReader: could not seek to data point %d within %s", start, QS_C(m_d->fileName)); return false; } } m_readPos = start; } return true; } nframes_t PeakDataReader::read(DecodeBuffer* buffer, nframes_t count) { if ( ! (count && (m_readPos < m_nframes)) ) { return 0; } // Make sure the read buffer is big enough for this read buffer->check_buffers_capacity(count*3, 1); Q_ASSERT(m_d->file.isOpen()); int framesRead = 0; peak_data_t* readbuffer; // PROFILE_START; if (m_d->memory) { readbuffer = (peak_data_t*)(m_d->memory + m_readPos); framesRead = count; } else { framesRead = m_d->file.read((char*)buffer->readBuffer, sizeof(peak_data_t) * count) / sizeof(peak_data_t); readbuffer = (peak_data_t*)(buffer->readBuffer); } for (int f = 0; f < framesRead; f++) { buffer->destination[0][f] = float(readbuffer[f]); } // PROFILE_END("peakdata reader read"); m_readPos += framesRead; return framesRead; } void Peak::calculate_lut_data() { chacheIndexLut.insert(64 , 0); chacheIndexLut.insert(128 , 1); chacheIndexLut.insert(256 , 2); chacheIndexLut.insert(512 , 3); chacheIndexLut.insert(1024 , 4); chacheIndexLut.insert(2048 , 5); chacheIndexLut.insert(4096 , 6); chacheIndexLut.insert(8192 , 7); chacheIndexLut.insert(16384 , 8); chacheIndexLut.insert(32768 , 9); chacheIndexLut.insert(65536 , 10); chacheIndexLut.insert(131072 , 11); chacheIndexLut.insert(262144 , 12); chacheIndexLut.insert(524288 , 13); chacheIndexLut.insert(1048576, 14); } int Peak::max_zoom_value() { return 1048576; } Peak::ChannelData::~ ChannelData() { if (peakdataDecodeBuffer) { delete peakdataDecodeBuffer; } } traverso-0.49.4/src/core/ProjectConverter.cpp000644 001750 001750 00000026712 11163362147 021514 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "ProjectConverter.h" #include #include #include "FileHelpers.h" #include "AudioFileMerger.h" #include "ReadSource.h" #include "Utils.h" #include "defines.h" ProjectConverter::ProjectConverter() { m_projectfileversion = -1; m_merger = 0; connect(this, SIGNAL(conversionFinished()), this, SLOT(conversion_finished())); } int ProjectConverter::start() { switch(m_projectfileversion) { case 2: { start_conversion_from_version_2_to_3(); break; } default: { emit message(tr("Project file with version %1 cannot be converted, only files with version 2 can!").arg(m_projectfileversion)); return -1; } } return 1; } void ProjectConverter::set_project(const QString & rootdir, const QString & name) { m_readsources.clear(); m_filesToMerge = 0; m_filesMerged = 0; if (m_merger) { delete m_merger; } m_document.clear(); m_projectfileversion = -1; m_rootdir = rootdir; m_projectname = name; QDomDocument doc("Project"); QString filename(m_rootdir + "/project.tpf"); QFile file(filename); if (!file.open(QIODevice::ReadOnly)) { printf("filename '%s' could not be opened!\n", QS_C(filename)); return; } // Start setting and parsing the content of the xml file QString errorMsg; if (!doc.setContent(&file, &errorMsg)) { QString error = tr("Project %1: Failed to parse project.tpf file! (Reason: %2)").arg(m_projectname).arg(errorMsg); printf("%s\n", QS_C(error)); return; } QDomElement docElem = doc.documentElement(); QDomNode propertiesNode = docElem.firstChildElement("Properties"); QDomElement projectelement = propertiesNode.toElement(); m_projectfileversion = projectelement.attribute("projectfileversion", "-1").toInt(); m_document = doc.cloneNode(true).toDocument(); } int ProjectConverter::start_conversion_from_version_2_to_3() { emit message(tr("Starting to convert Project from version 2 to version 3")); m_merger = new AudioFileMerger; m_filesToMerge = m_filesMerged = 0; connect(m_merger, SIGNAL(progress(int)), this, SIGNAL(progress(int))); connect(m_merger, SIGNAL(taskStarted(QString)), this, SLOT(file_merge_started(QString))); connect(m_merger, SIGNAL(taskFinished(QString)), this, SLOT(file_merge_finished(QString))); connect(m_merger, SIGNAL(processingStopped()), this, SLOT(processing_stopped())); QDomElement docElem = m_document.documentElement(); QDomNode propertiesNode = docElem.firstChildElement("Properties"); QDomElement projectelement = propertiesNode.toElement(); QString version = projectelement.attribute("projectfileversion", "-1"); int projectrate = projectelement.attribute("rate", "44100").toInt(); version = QString::number(3); projectelement.setAttribute("projectfileversion", version); // Load all the AudioSources for this project QDomNode asmNode = docElem.firstChildElement("ResourcesManager"); QDomNode sourcesNode = asmNode.firstChildElement("AudioSources").firstChild(); while(!sourcesNode.isNull()) { QDomElement readsourceelement = sourcesNode.toElement(); int channelcount = readsourceelement.attribute("channelcount", "0").toInt(); int filecount = readsourceelement.attribute("filecount", "0").toInt(); qint64 id = readsourceelement.attribute("id", "").toLongLong(); QString dir = readsourceelement.attribute("dir", "" ); QString name = readsourceelement.attribute("name", "No name supplied?" ); bool wasrecording = readsourceelement.attribute("wasrecording", 0).toInt(); if (filecount == 2 && channelcount == 2 && dir == (m_rootdir + "/audiosources/")) { ReadSource* readsource0 = new ReadSource(dir, name + "-ch0.wav"); ReadSource* readsource1 = new ReadSource(dir, name + "-ch1.wav"); readsource0->ref(); readsource0->init(); readsource1->ref(); readsource1->init(); m_readsources.insertMulti(id, readsource0); m_readsources.insertMulti(id, readsource1); m_filesToMerge++; m_merger->enqueue_task(readsource0, readsource1, dir, name); readsourceelement.setAttribute("name", name + ".wav"); readsourceelement.setAttribute("length", readsource0->get_length().universal_frame()); readsourceelement.setAttribute("rate", readsource0->get_rate()); } else { // The version 2 of the project file didn't have the full name // including the channel number, it was added by ReadSource so // we have to do it now since newer version of ReadSource no longer add // the channel number + extension to the readsource name. if (!name.contains(".wav") && wasrecording && channelcount == 1) { readsourceelement.setAttribute("name", name + "-ch0.wav"); } } sourcesNode = sourcesNode.nextSibling(); } QDomNode clipsNode = asmNode.firstChildElement("AudioClips").firstChild(); while(!clipsNode.isNull()) { QDomElement clipelement = clipsNode.toElement(); qint64 readsourceid = clipelement.attribute("source", "").toLongLong(); nframes_t length = clipelement.attribute( "length", "0" ).toUInt(); nframes_t sourceStartFrame = clipelement.attribute( "sourcestart", "" ).toUInt(); nframes_t trackStart = clipelement.attribute( "trackstart", "" ).toUInt(); ReadSource* source = m_readsources.value(readsourceid); int rate = projectrate; if (source) { rate = source->get_rate(); } clipelement.setAttribute("trackstart", TimeRef(trackStart, rate).universal_frame()); clipelement.setAttribute("sourcestart", TimeRef(sourceStartFrame, rate).universal_frame()); clipelement.setAttribute("length", TimeRef(length, rate).universal_frame()); QDomElement fadeInNode = clipsNode.firstChildElement("FadeIn"); if (!fadeInNode.isNull()) { QDomElement e = fadeInNode.toElement(); QString rangestring = e.attribute("range", "1"); double range; if (rangestring == "nan" || rangestring == "inf") { printf("FadeCurve::set_state: stored range was not a number!\n"); range = 1; } else { range = rangestring.toDouble(); } if (range > 1.0) { e.setAttribute("range", TimeRef(nframes_t(range), rate).universal_frame()); } } QDomElement fadeOutNode = clipsNode.firstChildElement("FadeOut"); if (!fadeOutNode.isNull()) { QDomElement e = fadeOutNode.toElement(); QString rangestring = e.attribute("range", "1"); double range; if (rangestring == "nan" || rangestring == "inf") { printf("FadeCurve::set_state: stored range was not a number!\n"); range = 1; } else { range = rangestring.toDouble(); } if (range > 1.0) e.setAttribute("range", TimeRef(nframes_t(range), rate).universal_frame()); } QDomNode pluginChainNode = clipsNode.firstChildElement("PluginChain"); if (!pluginChainNode.isNull()) { QDomNode pluginsNode = pluginChainNode.firstChild(); QDomNode pluginNode = pluginsNode.firstChild(); while(!pluginNode.isNull()) { if (pluginNode.toElement().attribute( "type", "") == "GainEnvelope") { QDomElement controlPortsNode = pluginNode.firstChildElement("ControlPorts"); if (!controlPortsNode.isNull()) { QDomNode portNode = controlPortsNode.firstChild(); if(!portNode.isNull()) { QDomElement curveNode = portNode.firstChildElement("PortAutomation"); if (!curveNode.isNull()) { QDomElement e = curveNode.toElement(); QStringList nodesList = e.attribute( "nodes", "" ).split(";"); QStringList newNodesList; for (int i=0; iNeed to convert %1 files").arg(m_filesToMerge)); } return 1; } int ProjectConverter::save_converted_document() { QString filename(m_rootdir + "/project.tpf"); QFile backup(filename); backup.copy(m_rootdir + "/projectv" + QString::number(m_projectfileversion) + "backup.tpf"); QFile savefile( filename ); if (!savefile.open( QIODevice::WriteOnly ) ) { QString errorstring = FileHelper::fileerror_to_string(savefile.error()); printf("%s\n", QS_C(tr("Couldn't open Project properties file for writing! (File %1. Reason: %2)").arg(filename).arg(errorstring))); return -1; } QTextStream stream(&savefile); m_document.save(stream, 4); printf("%s\n", QS_C(tr("Project %1 converted").arg(m_projectname))); emit message(tr("Saving converted project.tpf file.... Done!")); return 1; } void ProjectConverter::conversion_finished() { emit message(tr("Conversion finished succesfully")); } QString ProjectConverter::get_conversion_description() { switch(m_projectfileversion) { case 2 : { QFile file(":/project_conversion_description_2_3"); file.open(QIODevice::ReadOnly); return file.readAll(); } } return tr("No conversion description available!"); } void ProjectConverter::file_merge_started(QString file) { emit fileMergeStarted(file + " (" + QString::number(m_filesMerged + 1) + "/" + QString::number(m_filesToMerge) + ")"); } void ProjectConverter::file_merge_finished(QString file) { emit fileMergeFinished(file); m_filesMerged++; if ((m_filesToMerge - m_filesMerged) == 0) { finish_2_3_conversion(); } } void ProjectConverter::finish_2_3_conversion() { foreach(ReadSource* source, m_readsources) { delete source; } // Exit the FileMerger event loop m_merger->exit(0); if ( ! m_merger->wait(1000) ) { qWarning("FileMerger:: Still running after 1 second wait, terminating!"); m_merger->terminate(); } delete m_merger; save_converted_document(); emit conversionFinished(); } void ProjectConverter::stop_conversion() { if (m_merger && m_merger->isRunning()) { m_merger->stop_merging(); } } void ProjectConverter::processing_stopped() { emit message(tr("Conversion stopped on user request, you can continue to use this Project with Traverso <= 0.41.0, or reopen it with this version of Traverso and start the conversion again")); } traverso-0.49.4/src/core/DiskIO.h000644 001750 001750 00000005740 11163362147 017003 0ustar00remonremon000000 000000 /* Copyright (C) 2006-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef DISKIO_H #define DISKIO_H #include #include #include #include #include "defines.h" class ReadSource; class WriteSource; class AudioSource; class RingBuffer; class DiskIOThread; class Sheet; class DecodeBuffer; struct BufferStatus { int fillStatus; int priority; bool bufferUnderRun; bool needSync; }; class DiskIO : public QObject { Q_OBJECT public: DiskIO(Sheet* sheet); ~DiskIO(); static const int writebuffertime = 5; static const int bufferdividefactor = 5; void prepare_for_seek(); void output_rate_changed(int rate); void register_read_source(ReadSource* source); void register_write_source(WriteSource* source); void set_resample_quality(int quality); void unregister_read_source(ReadSource* source); void unregister_write_source(WriteSource* source); trav_time_t get_cpu_time(); int get_write_buffers_fill_status(); int get_read_buffers_fill_status(); int get_output_rate() {return m_outputRate;} int get_resample_quality() {return m_resampleQuality;} DecodeBuffer* get_resample_decode_buffer() {return m_resampleDecodeBuffer;} private: Sheet* m_sheet; volatile size_t m_stopWork; QList m_readSources; QList m_writeSources; QList m_processableReadSources; QList m_processableWriteSources; QList > m_readersStatus; QList > m_writersStatus; DiskIOThread* m_diskThread; QTimer m_workTimer; QMutex mutex; volatile int m_readBufferFillStatus; volatile int m_writeBufferFillStatus; RingBuffer* cpuTimeBuffer; trav_time_t cycleStartTime; trav_time_t lastCpuReadTime; bool m_seeking; int m_resampleQuality; bool m_sampleRateChanged; int m_hardDiskOverLoadCounter; audio_sample_t* framebuffer[2]; audio_sample_t* m_readbuffer; DecodeBuffer* m_decodebuffer; DecodeBuffer* m_resampleDecodeBuffer; int m_outputRate; void update_time_usage(); int stop(); int there_are_processable_sources(); friend class DiskIOThread; public slots: void seek(); void start_io(); void stop_io(); private slots: void do_work(); signals: void seekFinished(); void readSourceBufferUnderRun(); void writeSourceBufferOverRun(); }; #endif //eof traverso-0.49.4/src/core/CurveNode.cpp000755 001750 001750 00000002504 11163362147 020104 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2006 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: CurveNode.cpp,v 1.8 2007/11/23 14:56:36 r_sijrier Exp $ */ #include "CurveNode.h" #include "Curve.h" // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" void CurveNode::set_relative_when_and_value( double relwhen, double value ) { this->when = relwhen * m_curve->get_range(); this->value = value; } void CurveNode::set_when_and_value(double when, double value) { if (this->when == when && this->value == value) return; this->when = when; this->value = value; emit m_curve->nodePositionChanged(); } //eof traverso-0.49.4/src/core/AudioClipManager.cpp000644 001750 001750 00000011450 11163362147 021353 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2008 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "AudioClipManager.h" #include "Sheet.h" #include "AudioClip.h" #include "ResourcesManager.h" #include "ProjectManager.h" #include "Track.h" #include "commands.h" #include "SnapList.h" #include "Utils.h" #include "Debugger.h" AudioClipManager::AudioClipManager( Sheet* sheet ) : ContextItem(sheet) { PENTERCONS; m_sheet = sheet; set_history_stack( m_sheet->get_history_stack() ); m_lastLocation = TimeRef(); } AudioClipManager::~ AudioClipManager( ) { PENTERDES; } QDomNode AudioClipManager::get_state(QDomDocument doc, bool istemplate) { QDomElement managerNode = doc.createElement("ClipManager"); QDomElement globalSelection = doc.createElement("GlobalSelection"); QStringList selectedClips; foreach(AudioClip* clip, m_clipselection) { selectedClips << QString::number(clip->get_id()); } globalSelection.setAttribute("clips", selectedClips.join(";")); managerNode.appendChild(globalSelection); return managerNode; } int AudioClipManager::set_state(const QDomNode & node) { QDomElement e = node.firstChildElement("GlobalSelection"); QStringList selectionList = e.attribute("clips", "").split(";"); for (int i=0; iget_id() == id) { add_to_selection(clip); } } } return 1; } void AudioClipManager::add_clip( AudioClip * clip ) { PENTER; if (m_clips.contains(clip)) { PERROR("Trying to add clip %s, but it's already in my list!!", QS_C(clip->get_name())); return; } m_clips.append( clip ); connect(clip, SIGNAL(positionChanged()), this, SLOT(update_last_frame())); m_sheet->get_snap_list()->mark_dirty(); update_last_frame(); resources_manager()->mark_clip_added(clip); } void AudioClipManager::remove_clip( AudioClip * clip ) { PENTER; if (m_clips.removeAll(clip) == 0) { PERROR("Clip %s was not in my list, couldn't remove it!!", QS_C(clip->get_name())); return; } remove_from_selection(clip); m_sheet->get_snap_list()->mark_dirty(); update_last_frame(); resources_manager()->mark_clip_removed(clip); } void AudioClipManager::update_last_frame( ) { PENTER; m_lastLocation = TimeRef(); foreach(AudioClip* clip, m_clips) { if (clip->get_track_end_location() >= m_lastLocation) m_lastLocation = clip->get_track_end_location(); } emit m_sheet->lastFramePositionChanged(); } TimeRef AudioClipManager::get_last_location() const { return m_lastLocation; } void AudioClipManager::get_selected_clips( QList< AudioClip * > & list ) { foreach(AudioClip* clip, m_clipselection) { list.append(clip); } } void AudioClipManager::remove_from_selection( AudioClip * clip ) { if (m_clipselection.contains(clip)) { m_clipselection.removeAll(clip); clip->set_selected( false ); } } void AudioClipManager::add_to_selection( AudioClip * clip ) { if ( ! m_clipselection.contains( clip ) ) { m_clipselection.append( clip ); clip->set_selected( true ); } } void AudioClipManager::toggle_selected( AudioClip * clip ) { PENTER; if (clip->is_selected()) { remove_from_selection(clip); } else { add_to_selection(clip); } } void AudioClipManager::select_clip(AudioClip* clip) { PENTER; foreach(AudioClip* c, m_clips) { remove_from_selection(c); } add_to_selection(clip); } QList AudioClipManager::get_clip_list() const { return m_clips; } bool AudioClipManager::is_clip_in_selection(AudioClip* clip) { return m_clipselection.contains(clip); } /****************************** SLOTS ***************************/ /****************************************************************/ Command* AudioClipManager::select_all_clips() { PENTER; if (m_clipselection.size()) { return new ClipSelection(m_clips, this, "remove_from_selection", tr("Selection: Remove Clip")); } return new ClipSelection(m_clips, this, "add_to_selection", tr("Selection: Add Clip")); } Command* AudioClipManager::invert_clip_selection() { PENTER; return new ClipSelection(m_clips, this, "toggle_selected", tr("Selection: Invert")); } traverso-0.49.4/src/core/Curve.h000644 001750 001750 00000005642 11163362147 016746 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2006 Remon Sijrier Original version from Ardour curve.cc, modified in order to fit Traverso's lockless design Copyright (C) 2001-2003 Paul Davis Contains ideas derived from "Constrained Cubic Spline Interpolation" by CJC Kruger (www.korf.co.uk/spline.pdf). This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef CURVE_H #define CURVE_H #include "ContextItem.h" #include #include #include #include "CurveNode.h" #include "defines.h" class Sheet; class Curve : public ContextItem { Q_OBJECT public: Curve(ContextItem* parent); Curve(ContextItem* parent, const QDomNode node); ~Curve(); QDomNode get_state(QDomDocument doc, const QString& name); virtual int set_state( const QDomNode& node ); int process(audio_sample_t** buffer, const TimeRef& startlocation, const TimeRef& endlocation, nframes_t nframes, uint channels, float makeupgain=1.0f); Command* add_node(CurveNode* node, bool historable=true); Command* remove_node(CurveNode* node, bool historable=true); // Get functions double get_range() const; void get_vector (double x0, double x1, float *arg, int32_t veclen); APILinkedList& get_nodes() {return m_nodes;} Sheet* get_sheet() const {return m_sheet;} // Set functions virtual void set_range(double when); void set_sheet(Sheet* sheet); static bool smallerNode(const CurveNode* left, const CurveNode* right ) { return left->get_when() < right->get_when(); } void clear_curve() {m_nodes.clear();} protected: Sheet* m_sheet; private : APILinkedList m_nodes; struct LookupCache { double left; /* leftmost x coordinate used when finding "range" */ std::pair range; }; LookupCache m_lookup_cache; bool m_changed; double m_defaultValue; double multipoint_eval (double x); void x_scale(double factor); void solve (); void init(); friend class CurveNode; protected slots: void set_changed(); private slots: void private_add_node(CurveNode* node); void private_remove_node(CurveNode* node); signals : void stateChanged(); void nodeAdded(CurveNode*); void nodeRemoved(CurveNode*); void nodePositionChanged(); }; inline double Curve::get_range( ) const { if (m_nodes.size()) { return ((CurveNode*)m_nodes.last())->when; } return 0; } #endif traverso-0.49.4/src/core/AudioClipManager.h000644 001750 001750 00000003602 11163362147 021020 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2008 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef AUDIOCLIPMANAGER_H #define AUDIOCLIPMANAGER_H #include "ContextItem.h" #include "defines.h" #include #include class AudioClip; class Sheet; class AudioClipManager : public ContextItem { Q_OBJECT Q_CLASSINFO("select_all_clips", tr("Select all")) Q_CLASSINFO("invert_clip_selection", tr("Invert")) public: AudioClipManager(Sheet* sheet); ~AudioClipManager(); QDomNode get_state(QDomDocument doc, bool istemplate=false); int set_state( const QDomNode & node ); bool is_clip_in_selection(AudioClip* clip); void get_selected_clips(QList & list); QList get_clip_list() const; TimeRef get_last_location() const; private: QList m_clips; QList m_clipselection; Sheet* m_sheet; TimeRef m_lastLocation; public slots: void add_clip(AudioClip* clip); void remove_clip(AudioClip* clip); void select_clip(AudioClip* clip); void toggle_selected(AudioClip* clip); void remove_from_selection(AudioClip* clip); void add_to_selection(AudioClip* clip); void update_last_frame(); Command* select_all_clips(); Command* invert_clip_selection(); }; #endif //eof traverso-0.49.4/src/core/Track.cpp000644 001750 001750 00000027451 11163362147 017263 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "Track.h" #include "Sheet.h" #include "AudioClip.h" #include "AudioClipManager.h" #include #include #include "PluginChain.h" #include "Plugin.h" #include "InputEngine.h" #include "Information.h" #include "ProjectManager.h" #include "ResourcesManager.h" #include "Project.h" #include "Utils.h" #include #include // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" Track::Track(Sheet* sheet, const QString& name, int height ) : ContextItem(sheet), m_sheet(sheet), m_name(name), m_height(height) { PENTERCONS; m_pan = numtakes = 0; m_sortIndex = -1; m_id = create_id(); busIn = "Capture 1"; busOut = "MasterOut"; init(); } Track::Track( Sheet * sheet, const QDomNode node) : ContextItem(sheet), m_sheet(sheet) { PENTERCONS; Q_UNUSED(node); init(); } Track::~Track() { PENTERDES; } void Track::init() { QObject::tr("Track"); isSolo = mutedBySolo = m_isMuted = isArmed = false; set_history_stack(m_sheet->get_history_stack()); m_pluginChain = new PluginChain(this, m_sheet); m_fader = m_pluginChain->get_fader(); m_fader->set_gain(1.0); m_captureRightChannel = m_captureLeftChannel = true; } QDomNode Track::get_state( QDomDocument doc, bool istemplate) { QDomElement node = doc.createElement("Track"); if (! istemplate ) { node.setAttribute("id", m_id); } node.setAttribute("name", m_name); node.setAttribute("pan", m_pan); node.setAttribute("mute", m_isMuted); node.setAttribute("solo", isSolo); node.setAttribute("mutedbysolo", mutedBySolo); node.setAttribute("height", m_height); node.setAttribute("sortindex", m_sortIndex); node.setAttribute("numtakes", numtakes); node.setAttribute("InBus", busIn.data()); node.setAttribute("OutBus", busOut.data()); node.setAttribute("CaptureLeftChannel", m_captureLeftChannel); node.setAttribute("CaptureRightChannel", m_captureRightChannel); if (! istemplate ) { QDomNode clips = doc.createElement("Clips"); apill_foreach(AudioClip* clip, AudioClip, m_clips) { if (clip->get_length() == qint64(0)) { PERROR("Clip length is 0! This shouldn't happen!!!!"); continue; } QDomElement clipNode = doc.createElement("Clip"); clipNode.setAttribute("id", clip->get_id() ); clips.appendChild(clipNode); } node.appendChild(clips); } QDomNode pluginChainNode = doc.createElement("PluginChain"); pluginChainNode.appendChild(m_pluginChain->get_state(doc)); node.appendChild(pluginChainNode); return node; } int Track::set_state( const QDomNode & node ) { QDomElement e = node.toElement(); set_height(e.attribute( "height", "160" ).toInt() ); m_sortIndex = e.attribute( "sortindex", "-1" ).toInt(); m_name = e.attribute( "name", "" ); set_muted(e.attribute( "mute", "" ).toInt()); if (e.attribute( "solo", "" ).toInt()) { solo(); } set_muted_by_solo(e.attribute( "mutedbysolo", "0").toInt()); set_pan( e.attribute( "pan", "" ).toFloat() ); set_bus_in( e.attribute( "InBus", "" ).toAscii() ); set_bus_out( e.attribute( "OutBus", "" ).toAscii() ); m_id = e.attribute("id", "0").toLongLong(); if (m_id == 0) { m_id = create_id(); } numtakes = e.attribute( "numtakes", "").toInt(); m_captureRightChannel = e.attribute("CaptureRightChannel", "1").toInt(); m_captureLeftChannel = e.attribute("CaptureLeftChannel", "1").toInt(); // never ever allow both to be 0 at the same time! if ( ! (m_captureRightChannel || m_captureLeftChannel) ) { m_captureRightChannel = m_captureLeftChannel = 1; } QDomElement ClipsNode = node.firstChildElement("Clips"); if (!ClipsNode.isNull()) { QDomNode clipNode = ClipsNode.firstChild(); while (!clipNode.isNull()) { QDomElement clipElement = clipNode.toElement(); qint64 id = clipElement.attribute("id", "").toLongLong(); AudioClip* clip = resources_manager()->get_clip(id); if (!clip) { info().critical(tr("Track: AudioClip with id %1 not \ found in Resources database!").arg(id)); break; } clip->set_sheet(m_sheet); clip->set_track(this); clip->set_state(clip->get_dom_node()); m_sheet->get_audioclip_manager()->add_clip(clip); private_add_clip(clip); clipNode = clipNode.nextSibling(); } } QDomNode m_pluginChainNode = node.firstChildElement("PluginChain"); if (!m_pluginChainNode.isNull()) { m_pluginChain->set_state(m_pluginChainNode); } return 1; } AudioClip* Track::get_clip_after(const TimeRef& pos) { apill_foreach(AudioClip* clip, AudioClip, m_clips) { if (clip->get_track_start_location() > pos) { return clip; } } return (AudioClip*) 0; } AudioClip* Track::get_clip_before(const TimeRef& pos) { apill_foreach(AudioClip* clip, AudioClip, m_clips) { if (clip->get_track_start_location() < pos) { return clip; } } return (AudioClip*) 0; } Command* Track::remove_clip(AudioClip* clip, bool historable, bool ismove) { PENTER; if (! ismove) { m_sheet->get_audioclip_manager()->remove_clip(clip); } return new AddRemove(this, clip, historable, m_sheet, "private_remove_clip(AudioClip*)", "audioClipRemoved(AudioClip*)", "private_add_clip(AudioClip*)", "audioClipAdded(AudioClip*)", tr("Remove Clip")); } Command* Track::add_clip(AudioClip* clip, bool historable, bool ismove) { PENTER; clip->set_track(this); if (! ismove) { m_sheet->get_audioclip_manager()->add_clip(clip); } return new AddRemove(this, clip, historable, m_sheet, "private_add_clip(AudioClip*)", "audioClipAdded(AudioClip*)", "private_remove_clip(AudioClip*)", "audioClipRemoved(AudioClip*)", tr("Add Clip")); } void Track::private_add_clip(AudioClip* clip) { m_clips.add_and_sort(clip); } void Track::private_remove_clip(AudioClip* clip) { m_clips.remove(clip); } int Track::arm() { PENTER; set_armed(true); AudioBus* bus = audiodevice().get_capture_bus(busIn); if (bus) { bus->set_monitor_peaks(true); } return 1; } int Track::disarm() { PENTER; set_armed(false); AudioBus* bus = audiodevice().get_capture_bus(busIn); if (bus) { bus->set_monitor_peaks(false); } return 1; } void Track::set_bus_in(QByteArray bus) { bool wasArmed=isArmed; if (isArmed) disarm(); busIn=bus; if (wasArmed) { arm(); } emit inBusChanged(); } void Track::set_bus_out(QByteArray bus) { busOut=bus; emit outBusChanged(); } bool Track::is_solo() { return isSolo; } bool Track::is_muted_by_solo() { return mutedBySolo; } bool Track::armed() { return isArmed; } AudioClip* Track::init_recording() { PENTER2; if ( ! isArmed) { return 0; } int number = m_sheet->get_track_index(m_id); QString snumber = QString::number(number); if (number < 10) { snumber.prepend("0"); } QString name = "track-" + snumber + "_take-" + QString::number(++numtakes); AudioClip* clip = resources_manager()->new_audio_clip(name); clip->set_sheet(m_sheet); clip->set_track(this); clip->set_track_start_location(m_sheet->get_transport_location()); if (clip->init_recording(busIn) < 0) { PERROR("Could not create AudioClip to record to!"); resources_manager()->destroy_clip(clip); return 0; } else { return clip; } return 0; } void Track::set_gain(float gain) { if (gain < 0.0) gain = 0.0; if (gain > 2.0) gain = 2.0; m_fader->set_gain(gain); emit gainChanged(); } void Track::set_pan(float pan) { if ( pan < -1.0 ) m_pan=-1.0; else if ( pan > 1.0 ) m_pan=1.0; else m_pan=pan; emit panChanged(); } void Track::set_height(int h) { m_height = h; emit heightChanged(); } int Track::get_total_clips() { return m_clips.size(); } void Track::set_muted_by_solo(bool muted) { PENTER; mutedBySolo = muted; emit audibleStateChanged(); } void Track::set_solo(bool solo) { isSolo = solo; if (solo) mutedBySolo = false; emit soloChanged(isSolo); emit audibleStateChanged(); } void Track::set_muted( bool muted ) { m_isMuted = muted; emit muteChanged(m_isMuted); emit audibleStateChanged(); } void Track::set_armed( bool armed ) { isArmed = armed; emit armedChanged(isArmed); } // // Function called in RealTime AudioThread processing path // int Track::process( nframes_t nframes ) { int processResult = 0; if ( (m_isMuted || mutedBySolo) && ( ! isArmed) ) { return 0; } // Get the 'render bus' from sheet, a bit hackish solution, but // it avoids to have a dedicated render bus for each Track, // or buffers located on the heap... AudioBus* bus = m_sheet->get_render_bus(); bus->silence_buffers(nframes); int result; float gainFactor, panFactor; m_pluginChain->process_pre_fader(bus, nframes); apill_foreach(AudioClip* clip, AudioClip, m_clips) { if (isArmed && clip->recording_state() == AudioClip::NO_RECORDING) { if (m_isMuted || mutedBySolo) { continue; } } result = clip->process(nframes); if (result <= 0) { continue; } processResult |= result; } for (int chan=0; changet_channel_count(); ++chan) { gainFactor = get_gain(); if ( (chan == 0) && (m_pan > 0)) { panFactor = 1 - m_pan; gainFactor *= panFactor; } if ( (chan == 1) && (m_pan < 0)) { panFactor = 1 + m_pan; gainFactor *= panFactor; } Mixer::apply_gain_to_buffer(bus->get_buffer(chan, nframes), nframes, gainFactor); } processResult |= m_pluginChain->process_post_fader(bus, nframes); for (int i=0; iget_channel_count(); ++i) { Mixer::mix_buffers_no_gain(m_sheet->get_master_out()->get_buffer(i, nframes), bus->get_buffer(i, nframes), nframes); } return processResult; } Command* Track::mute() { PENTER; set_muted(!m_isMuted); return (Command*) 0; } Command* Track::toggle_arm() { if (isArmed) disarm(); else arm(); return (Command*) 0; } Command* Track::solo( ) { m_sheet->solo_track(this); return (Command*) 0; } Command* Track::silence_others( ) { return new PCommand(this, "solo", tr("Silence Others")); } void Track::set_name( const QString & name ) { m_name = name; emit stateChanged(); } void Track::get_render_range(TimeRef& startlocation, TimeRef& endlocation ) { if (m_clips.size() == 0) return; endlocation = TimeRef(); startlocation = LLONG_MAX; apill_foreach(AudioClip* clip, AudioClip, m_clips) { if (! clip->is_muted() ) { if (clip->get_track_end_location() > endlocation) { endlocation = clip->get_track_end_location(); } if (clip->get_track_start_location() < startlocation) { startlocation = clip->get_track_start_location(); } } } } Command* Track::add_plugin( Plugin * plugin ) { return m_pluginChain->add_plugin(plugin); } Command* Track::remove_plugin( Plugin * plugin ) { return m_pluginChain->remove_plugin(plugin); } void Track::set_sort_index( int index ) { m_sortIndex = index; } int Track::get_sort_index( ) const { return m_sortIndex; } void Track::set_capture_left_channel(bool capture) { m_captureLeftChannel = capture; emit inBusChanged(); } void Track::set_capture_right_channel(bool capture) { m_captureRightChannel = capture; emit inBusChanged(); } void Track::clip_position_changed(AudioClip * clip) { m_clips.sort(clip); } QList< AudioClip * > Track::get_cliplist() const { QList list; apill_foreach(AudioClip* clip, AudioClip, m_clips) { list.append(clip); } return list; } traverso-0.49.4/src/core/Snappable.cpp000644 001750 001750 00000002262 11163362147 020115 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Ben Levitt This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: Snappable.cpp,v 1.2 2008/02/21 20:00:48 r_sijrier Exp $ */ #include "Snappable.h" #include "SnapList.h" #include Snappable::Snappable() { m_isSnappable = true; snapList = 0; } void Snappable::set_snappable(bool snap) { if (snapList) { snapList->mark_dirty(); } m_isSnappable = snap; } void Snappable::set_snap_list(SnapList *sList) { snapList = sList; } bool Snappable::is_snappable() const { return m_isSnappable; } /* EOF */ traverso-0.49.4/src/core/DiskIO.cpp000644 001750 001750 00000031601 11163362147 017331 0ustar00remonremon000000 000000 /* Copyright (C) 2006-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "DiskIO.h" #include "Sheet.h" #include #if defined (Q_WS_X11) #include #include #include #if defined(__i386__) # define __NR_ioprio_set 289 # define __NR_ioprio_get 290 # define IOPRIO_SUPPORT 1 #elif defined(__ppc__) || defined(__powerpc__) || defined(__PPC__) # define __NR_ioprio_set 273 # define __NR_ioprio_get 274 # define IOPRIO_SUPPORT 1 #elif defined(__x86_64__) # define __NR_ioprio_set 251 # define __NR_ioprio_get 252 # define IOPRIO_SUPPORT 1 #elif defined(__ia64__) # define __NR_ioprio_set 1274 # define __NR_ioprio_get 1275 # define IOPRIO_SUPPORT 1 #else # define IOPRIO_SUPPORT 0 #endif enum { IOPRIO_CLASS_NONE, IOPRIO_CLASS_RT, IOPRIO_CLASS_BE, IOPRIO_CLASS_IDLE, }; enum { IOPRIO_WHO_PROCESS = 1, IOPRIO_WHO_PGRP, IOPRIO_WHO_USER, }; const char *to_prio[] = { "none", "realtime", "best-effort", "idle", }; #define IOPRIO_CLASS_SHIFT 13 #define IOPRIO_PRIO_MASK 0xff #endif // endif Q_WS_X11 #include "AbstractAudioReader.h" #include "AudioSource.h" #include "ReadSource.h" #include "WriteSource.h" #include "AudioDevice.h" #include "RingBuffer.h" #include "Config.h" // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" #define UPDATE_INTERVAL 20 // DiskIOThread is a private class to be used by // DiskIO only for processing read/write buffers // in a seperate thread. class DiskIOThread : public QThread { public: DiskIOThread(DiskIO* diskio) : QThread(diskio), m_diskio(diskio) { #ifndef Q_WS_MAC // setStackSize(20000); #endif } DiskIO* m_diskio; protected: void run() { #if defined (Q_WS_X11) if (IOPRIO_SUPPORT) { // When using the cfq scheduler we are able to set the priority of the io for what it's worth though :-) int ioprio = 0, ioprio_class = IOPRIO_CLASS_RT; int value = syscall(__NR_ioprio_set, IOPRIO_WHO_PROCESS, getpid(), ioprio | ioprio_class << IOPRIO_CLASS_SHIFT); if (value == -1) { ioprio_class = IOPRIO_CLASS_BE; value = syscall(__NR_ioprio_set, IOPRIO_WHO_PROCESS, getpid(), ioprio | ioprio_class << IOPRIO_CLASS_SHIFT); } if (value == 0) { ioprio = syscall (__NR_ioprio_get, IOPRIO_WHO_PROCESS, getpid()); ioprio_class = ioprio >> IOPRIO_CLASS_SHIFT; ioprio = ioprio & IOPRIO_PRIO_MASK; PMESG("Using prioritized disk I/O (Only effective with the cfq scheduler)"); PMESG("%s: prio %d", to_prio[ioprio_class], ioprio); } } #endif exec(); } }; /************** END DISKIO THREAD ************/ /** \class DiskIO * \brief handles all the read's and write's of AudioSources in it's private thread. * * Each Sheet class has it's own DiskIO instance. * The DiskIO manages all the AudioSources related to a Sheet, and makes sure the RingBuffers * from the AudioSources are processed in time. (It at least tries very hard) */ DiskIO::DiskIO(Sheet* sheet) : m_sheet(sheet) { m_diskThread = new DiskIOThread(this); cpuTimeBuffer = new RingBuffer(128); lastCpuReadTime = get_microseconds(); m_stopWork = m_seeking = m_sampleRateChanged = 0; m_resampleQuality = config().get_property("Conversion", "RTResamplingConverterType", DEFAULT_RESAMPLE_QUALITY).toInt(); m_readBufferFillStatus = m_writeBufferFillStatus = 0; m_hardDiskOverLoadCounter = 0; // TODO This is a LARGE buffer, any ideas how to make it smaller ?? framebuffer[0] = new audio_sample_t[audiodevice().get_sample_rate() * writebuffertime]; m_decodebuffer = new DecodeBuffer; m_resampleDecodeBuffer = new DecodeBuffer; // Move this instance to the workthread moveToThread(m_diskThread); m_workTimer.moveToThread(m_diskThread); connect(&m_workTimer, SIGNAL(timeout()), this, SLOT(do_work())); m_diskThread->start(); } DiskIO::~DiskIO() { PENTERDES; stop(); delete cpuTimeBuffer; delete [] framebuffer[0]; delete m_decodebuffer; delete m_resampleDecodeBuffer; } /** * Seek's all the ReadSources readbuffers to the new position. * Call prepare_seek() first, to interupt do_work() if it was running. * * @param position The position to seek too */ void DiskIO::seek() { PENTER; #if defined (THREAD_CHECK) Q_ASSERT_X(m_sheet->threadId != QThread::currentThreadId (), "DiskIO::seek", "Error, running in gui thread!!!!!"); #endif mutex.lock(); m_stopWork = 0; m_seeking = true; TimeRef location = m_sheet->get_new_transport_location(); foreach(ReadSource* source, m_readSources) { if (m_sampleRateChanged) { source->set_diskio(this); } source->rb_seek_to_file_position(location); } m_sampleRateChanged = false; mutex.unlock(); // Now, fill the buffers like normal do_work(); m_seeking = false; emit seekFinished(); } void DiskIO::output_rate_changed(int rate) { m_sampleRateChanged = true; m_outputRate = rate; } // Internal function void DiskIO::do_work( ) { #if defined (THREAD_CHECK) Q_ASSERT_X(m_sheet->threadId != QThread::currentThreadId (), "DiskIO::do_work", "Error, running in gui thread!!!!!"); #endif QMutexLocker locker(&mutex); int whilecount = 0; m_hardDiskOverLoadCounter = 0; cycleStartTime = get_microseconds(); while (there_are_processable_sources()) { for (int i=0; iprocess_ringbuffer(m_decodebuffer, m_seeking); } for (int i=0; iprocess_ringbuffer(framebuffer[0]); } if (whilecount++ > 2000) { printf("DiskIO::do_work -> probably detected a loop here, or do_work() is REALLY buzy!!\n"); break; } } update_time_usage(); } // Internal function int DiskIO::there_are_processable_sources( ) { m_processableReadSources.clear(); m_processableWriteSources.clear(); m_readersStatus.clear(); m_writersStatus.clear(); QList syncSources; for (int j=0; jget_processable_buffer_space(); QPair data(space, source); m_writersStatus.append(data); } for (int j=0; jget_buffer_status(); m_readersStatus.append(QPair(status, source)); } for (int i=(bufferdividefactor-2); i >= 0; --i) { for(int pair=0; pairget_chunck_size()); // If the source stopped recording, it will write it's remaining samples in the next // process_buffers call, and unregister itself from this DiskIO instance! if ( (prio > i) || ( ! source->is_recording()) ) { if ((source->get_buffer_size() - space) < 8192) { if (! m_hardDiskOverLoadCounter++) { emit writeSourceBufferOverRun(); } } if (space > t_atomic_int_get(&m_writeBufferFillStatus)) { t_atomic_int_set(&m_writeBufferFillStatus, space); } m_processableWriteSources.append(source); } } for(int pair=0; pairpriority > i && !status->needSync ) { if ( (! m_seeking) && status->bufferUnderRun ) { if (! m_hardDiskOverLoadCounter++) { printf("DiskIO:: BuferUnderRun detected\n"); emit readSourceBufferUnderRun(); } } if (status->fillStatus > t_atomic_int_get(&m_readBufferFillStatus)) { t_atomic_int_set(&m_readBufferFillStatus, status->fillStatus); } m_processableReadSources.append(source); } else if (status->needSync) { // printf("status == bufferUnderRun\n"); if (syncSources.size() == 0) { syncSources.append(source); } } } if (m_processableReadSources.size() > 0 || m_processableWriteSources.size() > 0) { return 1; } } if (syncSources.size() > 0) { syncSources.at(0)->sync(m_decodebuffer); return 1; } return 0; } // Internal function int DiskIO::stop( ) { PENTER; int res = 0; // Stop any processing in do_work() m_stopWork = 1; // Exit the diskthreads event loop m_diskThread->exit(0); // Wait for the Thread to return from it's event loop. 1000 ms should be (more then) enough, // if not, terminate this thread and print a warning! if ( ! m_diskThread->wait(2000) ) { qWarning("DiskIO :: Still running after 2 second wait, terminating!"); m_diskThread->terminate(); res = -1; } return res; } /** * Registers the ReadSource source. The source's RingBuffer will be initialized at this point. * * Note: This function is thread save. * @param source The ReadSource to register */ void DiskIO::register_read_source (ReadSource* source ) { PENTER2; if (source->get_channel_count() == 0) { return; } source->set_diskio(this); QMutexLocker locker(&mutex); m_readSources.append(source); } /** * Registers the WriteSource source. The source's RingBuffer will be initialized at this point. * * Note: This function is thread save. * @param source The WriteSource to register */ void DiskIO::register_write_source( WriteSource * source ) { PENTER2; source->set_diskio(this); QMutexLocker locker(&mutex); m_writeSources.append(source); } /** * Unregisters the ReadSource from this DiskIO instance * * Note: This function is Thread save. * @param source The ReadSource to be removed from the DiskIO instance. */ void DiskIO::unregister_read_source( ReadSource * source ) { QMutexLocker locker(&mutex); m_readSources.removeAll(source); } // internal function void DiskIO::unregister_write_source( WriteSource * source ) { m_writeSources.removeAll(source); } /** * Interupts any pending AudioSource's buffer processing, and returns from do_work(). * Use this before calling seek() to shorten the seek process. */ void DiskIO::prepare_for_seek( ) { PENTER; // Stop any processing in do_work() m_stopWork = 1; } // Internal function void DiskIO::update_time_usage( ) { audio_sample_t runcycleTime = get_microseconds() - cycleStartTime; cpuTimeBuffer->write((char*)&runcycleTime, 1 * sizeof(audio_sample_t)); } /** * * @return Returns the CPU time consumed by the DiskIO work thread */ trav_time_t DiskIO::get_cpu_time( ) { trav_time_t currentTime = get_microseconds(); float totaltime = 0; float value = 0; int read = cpuTimeBuffer->read_space() / sizeof(audio_sample_t); while (read != 0) { read = cpuTimeBuffer->read((char*)&value, 1 * sizeof(audio_sample_t)); totaltime += value; } audio_sample_t result = ( (totaltime / (currentTime - lastCpuReadTime) ) * 100 ); lastCpuReadTime = currentTime; // if (result > 95) { // qWarning("DiskIO :: consuming more then 95 Percent CPU !!"); // } return result; } /** * Get the status of the writebuffers. * * @return The status in procentual amount of the smallest remaining space in the writebuffers * that could be used to write 'recording' data too. */ int DiskIO::get_write_buffers_fill_status( ) { int space = t_atomic_int_get(&m_writeBufferFillStatus); int size = audiodevice().get_sample_rate() * writebuffertime; int status = (int) (((float)(size - space) / size) * 100); t_atomic_int_set(&m_writeBufferFillStatus, 0); return status; } /** * Get the status of the readbuffers. * * @return The status is the procentual amount of the buffer which was most empty since the last call to this function */ int DiskIO::get_read_buffers_fill_status( ) { int status = 100 - t_atomic_int_get(&m_readBufferFillStatus); t_atomic_int_set(&m_readBufferFillStatus, 0); return status; } void DiskIO::start_io( ) { // Q_ASSERT_X(m_sheet->threadId != QThread::currentThreadId (), "DiskIO::start_io", "Error, running in gui thread!!!!!"); m_workTimer.start(UPDATE_INTERVAL); } void DiskIO::stop_io( ) { // Q_ASSERT_X(m_sheet->threadId != QThread::currentThreadId (), "DiskIO::stop_io", "Error, running in gui thread!!!!!"); // m_workTimer.stop(); } void DiskIO::set_resample_quality(int quality) { m_resampleQuality = quality; } traverso-0.49.4/src/core/Peak.h000644 001750 001750 00000011456 11163362147 016542 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef PEAK_H #define PEAK_H #include #include #include #include #include #include #include #include #include "defines.h" class ReadSource; class AudioSource; class Peak; class PPThread; class DecodeBuffer; class PeakDataReader; class PeakProcessor : public QObject { Q_OBJECT public: void queue_task(Peak* peak); void free_peak(Peak* peak); private: PPThread* m_ppthread; QMutex m_mutex; QWaitCondition m_wait; bool m_taskRunning; Peak* m_runningPeak; QQueue m_queue; void dequeue_queue(); PeakProcessor(); ~PeakProcessor(); PeakProcessor(const PeakProcessor&); // allow this function to create one instance friend PeakProcessor& pp(); private slots: void start_task(); signals: void newTask(); }; class PPThread : public QThread { public: PPThread(PeakProcessor* pp); protected: void run(); private: PeakProcessor* m_pp; }; // use this function to access the PeakBuildThread PeakProcessor& pp(); class Peak : public QObject { Q_OBJECT public: static const int ZOOM_LEVELS = 22; static const int SAVING_ZOOM_FACTOR = 8; static const int MAX_ZOOM_USING_SOURCEFILE = SAVING_ZOOM_FACTOR - 1; // Use ~ 1/4 the range of peak_data_t (== short) so we have headroom // for samples in the range [-4, +4] or + 12 dB static const int MAX_DB_VALUE = 8000; static int zoomStep[ZOOM_LEVELS + 1]; Peak(AudioSource* source); ~Peak(); enum { NO_PEAKDATA_FOUND = -1, NO_PEAK_FILE = -2, PERMANENT_FAILURE = -3 }; void process(uint channel, audio_sample_t* buffer, nframes_t frames); int prepare_processing(int rate); int finish_processing(); int calculate_peaks(int chan, float** buffer, TimeRef startlocation, int peakDataCount, qreal framesPerPeak); void close(); void start_peak_loading(); audio_sample_t get_max_amplitude(TimeRef startlocation, TimeRef endlocation); static QHash* cache_index_lut(); static int max_zoom_value(); private: ReadSource* m_source; bool m_peaksAvailable; bool m_permanentFailure; bool m_interuptPeakBuild; static QHash chacheIndexLut; struct ProcessData { ProcessData() { normValue = peakUpperValue = peakLowerValue = 0; processBufferSize = progress = normProcessedFrames = normDataCount = 0; nextDataPointLocation = processRange; } audio_sample_t peakUpperValue; audio_sample_t peakLowerValue; audio_sample_t normValue; TimeRef stepSize; TimeRef processRange; TimeRef processLocation; TimeRef nextDataPointLocation; nframes_t normProcessedFrames; int progress; int processBufferSize; int normDataCount; }; struct PeakHeaderData { int headerSize; int normValuesDataOffset; int peakDataOffsets[ZOOM_LEVELS - SAVING_ZOOM_FACTOR]; int peakDataSizeForLevel[ZOOM_LEVELS - SAVING_ZOOM_FACTOR]; char label[6]; //TPFxxx -> Traverso Peak File version x.x.x int version[2]; }; struct ChannelData { ChannelData() { memory = 0; peakdataDecodeBuffer = 0; } ~ChannelData(); QString fileName; QString normFileName; QFile file; QFile normFile; PeakHeaderData headerdata; PeakDataReader* peakreader; ProcessData* pd; DecodeBuffer* peakdataDecodeBuffer; uchar* memory; QHash > maps; }; QList m_channelData; int create_from_scratch(); int read_header(); int write_header(ChannelData* data); static void calculate_lut_data(); friend class PeakProcessor; friend class PeakDataReader; signals: void finished(); void progress(int m_progress); }; class PeakDataReader { public: PeakDataReader(Peak::ChannelData* data); ~PeakDataReader(){}; nframes_t read_from(DecodeBuffer* buffer, nframes_t start, nframes_t count); private: Peak::ChannelData* m_d; nframes_t m_readPos; nframes_t m_nframes; bool seek(nframes_t start); nframes_t read(DecodeBuffer* buffer, nframes_t frameCount); }; inline QHash< int, int > * Peak::cache_index_lut() { if(chacheIndexLut.isEmpty()) { calculate_lut_data(); } return &chacheIndexLut; } #endif //eof traverso-0.49.4/src/core/ReadSource.cpp000644 001750 001750 00000045475 11163362147 020261 0ustar00remonremon000000 000000 /* Copyright (C) 2006-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "ReadSource.h" #include "ResampleAudioReader.h" #include "ProjectManager.h" #include "Project.h" #include "AudioClip.h" #include "DiskIO.h" #include "Utils.h" #include "Sheet.h" #include "AudioDevice.h" #include #include "Config.h" #include // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" /** * \class ReadSource \brief A class for (buffered) reading of audio files. */ // This constructor is called for existing (recorded/imported) audio sources ReadSource::ReadSource(const QDomNode node) : AudioSource() { set_state(node); private_init(); Project* project = pm().get_project(); // FIXME The check below no longer makes sense!!!!! // Check if the audiofile exists in our project audiosources dir // and give it priority over the dir as given by the project.tpf file // This makes it possible to move project directories without Traverso being // unable to find it's audiosources! if ( QFile::exists(project->get_root_dir() + "/audiosources/" + m_name) || QFile::exists(project->get_root_dir() + "/audiosources/" + m_name + "-ch0.wav") ) { set_dir(project->get_root_dir() + "/audiosources/"); } m_silent = (m_channelCount == 0); } // constructor for file import ReadSource::ReadSource(const QString& dir, const QString& name) : AudioSource(dir, name) { private_init(); AbstractAudioReader* reader = AbstractAudioReader::create_audio_reader(m_fileName); if (reader) { m_channelCount = reader->get_num_channels(); delete reader; } else { m_channelCount = 0; } m_silent = false; } // Constructor for recorded audio. ReadSource::ReadSource(const QString& dir, const QString& name, int channelCount) : AudioSource(dir, name) { private_init(); m_channelCount = channelCount; m_silent = false; m_name = name + "-" + QString::number(m_id); m_fileName = m_dir + m_name; m_rate = pm().get_project()->get_rate(); m_wasRecording = true; m_shortName = m_name.left(m_name.length() - 20); } // Constructor for silent clips ReadSource::ReadSource() : AudioSource("", tr("Silence")) { private_init(); m_channelCount = 0; m_silent = true; } void ReadSource::private_init() { m_refcount = 0; m_error = 0; m_clip = 0; m_audioReader = 0; m_bufferstatus = 0; } ReadSource::~ReadSource() { PENTERDES; for(int i=0; iget_rate(); } else { m_rate = 44100; } if (m_silent) { m_length = TimeRef(LLONG_MAX); m_channelCount = 0; m_origBitDepth = 16; m_bufferstatus->fillStatus = 100; m_bufferstatus->needSync = false; return 1; } if (m_channelCount == 0) { PERROR("ReadSource channel count is 0"); return (m_error = INVALID_CHANNEL_COUNT); } if ( ! QFile::exists(m_fileName)) { return (m_error = FILE_DOES_NOT_EXIST); } m_rbReady = 0; m_needSync = 1; m_syncInProgress = 0; m_bufferUnderRunDetected = m_wasActivated = 0; m_active = 0; // There should be another config option for ConverterType to use for export (higher quality) //converter_type = config().get_property("Conversion", "ExportResamplingConverterType", 0).toInt(); m_audioReader = new ResampleAudioReader(m_fileName, m_decodertype); if (!m_audioReader->is_valid()) { PERROR("ReadSource:: audio reader is not valid! (reader channel count: %d, nframes: %d", m_audioReader->get_num_channels(), m_audioReader->get_nframes()); delete m_audioReader; m_audioReader = 0; return (m_error = COULD_NOT_OPEN_FILE); } int converter_type = config().get_property("Conversion", "RTResamplingConverterType", DEFAULT_RESAMPLE_QUALITY).toInt(); m_audioReader->set_converter_type(converter_type); set_output_rate(m_audioReader->get_file_rate()); // (re)set the decoder type m_decodertype = m_audioReader->decoder_type(); m_channelCount = m_audioReader->get_num_channels(); // @Ben: I thought we support any channel count now ?? if (m_channelCount > 2) { PERROR("ReadAudioSource: file contains %d channels; only 2 channels are supported", m_channelCount); delete m_audioReader; m_audioReader = 0; return (m_error = INVALID_CHANNEL_COUNT); } // Never reached, it's allready checked in AbstractAudioReader::is_valid() which was allready called! if (m_channelCount == 0) { PERROR("ReadAudioSource: not a valid channel count: %d", m_channelCount); delete m_audioReader; m_audioReader = 0; return (m_error = ZERO_CHANNELS); } m_rate = m_audioReader->get_file_rate(); m_length = m_audioReader->get_length(); return 1; } void ReadSource::set_output_rate(int rate) { Q_ASSERT(rate > 0); if (! m_audioReader) { printf("ReadSource::set_output_rate: No audioreader!\n"); return; } bool useResampling = config().get_property("Conversion", "DynamicResampling", true).toBool(); if (useResampling) { m_audioReader->set_output_rate(rate); } else { m_audioReader->set_output_rate(m_audioReader->get_file_rate()); } m_outputRate = rate; // The length could have become slightly smaller/larger due // rounding issues involved with converting to one samplerate to another. // Should be at the order of one - two samples at most, but for reading purposes we // need sample accurate information! m_length = m_audioReader->get_length(); } int ReadSource::file_read(DecodeBuffer* buffer, const TimeRef& start, nframes_t cnt) const { // PROFILE_START; Q_ASSERT(m_audioReader); nframes_t result = m_audioReader->read_from(buffer, start, cnt); // PROFILE_END("ReadSource::fileread"); return result; } int ReadSource::file_read(DecodeBuffer * buffer, nframes_t start, nframes_t cnt) { Q_ASSERT(m_audioReader); return m_audioReader->read_from(buffer, start, cnt); } ReadSource * ReadSource::deep_copy( ) { PENTER; QDomDocument doc("ReadSource"); QDomNode rsnode = get_state(doc); ReadSource* source = new ReadSource(rsnode); return source; } void ReadSource::set_audio_clip(AudioClip* clip) { PENTER; Q_ASSERT(clip); m_clip = clip; } nframes_t ReadSource::get_nframes( ) const { if (!m_audioReader) { return 0; } return m_audioReader->get_nframes(); } int ReadSource::set_file(const QString & filename) { PENTER; Q_ASSERT(m_clip); m_error = 0; int splitpoint = filename.lastIndexOf("/") + 1; int length = filename.length(); QString dir = filename.left(splitpoint - 1) + "/"; QString name = filename.right(length - splitpoint); set_dir(dir); set_name(name); if (init() < 0) { return -1; } set_audio_clip(m_clip); emit stateChanged(); return 1; } int ReadSource::rb_read(audio_sample_t** dst, TimeRef& start, nframes_t count) { if (m_channelCount == 0) { return count; } if ( ! m_rbReady ) { // printf("ringbuffer not ready\n"); return 0; } TimeRef diff = m_rbRelativeFileReadPos - start; // In universal frame positioning, it is possible (somehow) that the start // location and m_rbRelativeFileReadPos differ very very slighly, and when // converted to frames, the difference is much smaller then 1 frame. // To catch these kind of I think 'rounding issues' we convert to frames here // and see if the diff in frames == 0, in which case it should be fine to make // our m_rbRelativeFileReadPos equal to start, and thus avoiding unwanted resync actions! if ( (diff.universal_frame() > 0) && (diff.to_frame(m_outputRate) == 0) ) { m_rbRelativeFileReadPos = start; } if (start != m_rbRelativeFileReadPos) { TimeRef availabletime(nframes_t(m_buffers.at(0)->read_space()), m_outputRate); /* printf("rb_read:: m_rbRelativeFileReadPos, start: %lld, %lld\n", m_rbRelativeFileReadPos.universal_frame(), start.universal_frame()); printf("rb_read:: availabletime %d\n", availabletime.to_frame(m_outputRate));*/ if ( (start > m_rbRelativeFileReadPos) && ((m_rbRelativeFileReadPos + availabletime) > (start + TimeRef(count, m_outputRate))) ) { TimeRef advance = start - m_rbRelativeFileReadPos; if (availabletime < advance) { printf("available < advance !!!!!!!\n"); } for (int i=m_buffers.size()-1; i>=0; --i) { m_buffers.at(i)->increment_read_ptr(advance.to_frame(m_outputRate)); } m_rbRelativeFileReadPos += advance; /* printf("rb_read:: advance %d\n", advance.to_frame(m_outputRate)); printf("rb_read:: m_rbRelativeFileReadPos after advance %d\n", m_rbRelativeFileReadPos.to_frame(m_outputRate));*/ } else { TimeRef synclocation = start + m_clip->get_track_start_location() + m_clip->get_source_start_location(); start_resync(synclocation); return 0; } } nframes_t readcount = 0; for (int chan=0; chanread(dst[chan], count); if (readcount != count) { PMESG("readcount, count: %d, %d", readcount, count); // Hmm, not sure what to do in this case.... } } m_rbRelativeFileReadPos.add_frames(readcount, m_outputRate); return readcount; } int ReadSource::rb_file_read(DecodeBuffer* buffer, nframes_t cnt) { nframes_t readFrames = file_read(buffer, m_rbFileReadPos, cnt); if (readFrames == cnt) { m_rbFileReadPos.add_frames(readFrames, m_outputRate); } else { // We either passed the end of the file, or our audio reader // is doing weird things, is broken, invalid or something else // Set the rinbuffer file readpos to m_length so processing stops here! m_rbFileReadPos = m_length; } return readFrames; } void ReadSource::rb_seek_to_file_position(TimeRef& position) { Q_ASSERT(m_clip); // printf("rb_seek_to_file_position:: seeking to %d\n", position); // calculate position relative to the file! TimeRef fileposition = position - m_clip->get_track_start_location() - m_clip->get_source_start_location(); // Do nothing if we are allready at the seek position if (m_rbFileReadPos == fileposition) { // printf("ringbuffer allready at position %d\n", position); return; } // check if the clip's start position is within the range // if not, fill the buffer from the earliest point this clip // will come into play. if (fileposition < TimeRef()) { // printf("not seeking to %ld, but too %d\n\n", fileposition,m_clip->get_source_start_location()); fileposition = m_clip->get_source_start_location(); } // printf("rb_seek_to_file_position:: seeking to relative pos: %d\n", fileposition); // The content of our buffers is no longer valid, so we empty them for (int i=0; ireset(); } m_rbFileReadPos = fileposition; m_rbRelativeFileReadPos = fileposition; // printf("rb_seek_to_file_position:: m_rbRelativeFileReadPos, synclocation: %d, %d\n", m_rbRelativeFileReadPos.to_frame(m_outputRate), fileposition.to_frame(m_outputRate)); } void ReadSource::process_ringbuffer(DecodeBuffer* buffer, bool seeking) { if (m_channelCount == 0) { return; } // Do nothing if we passed the lenght of the AudioFile. if (m_rbFileReadPos >= m_length) { // printf("returning, m_rbFileReadPos > m_length! (%d > %d)\n", m_rbFileReadPos.to_frame(get_rate()), m_audioReader->get_nframes()); if (m_syncInProgress) { finish_resync(); } return; } // Calculate the number of samples we can write into the buffer int writeSpace = m_buffers.at(0)->write_space(); // The amount of chunks which can be 'read' int chunkCount = (int)(writeSpace / m_chunkSize); int toRead = m_chunkSize; if (seeking) { toRead = writeSpace; // printf("doing a full seek buffer fill\n"); } else if (m_syncInProgress) { // Currently, we fill the buffer completely. // For some reason, filling it with 1/4 at a time // doesn't fill it consitently, and thus giving audible artifacts. /* toRead = m_chunkSize * 2;*/ toRead = writeSpace; } else if (chunkCount == 0) { // If we are nearing the end of the source file it could be possible // we only need to read the last samples which is smaller in size then // chunksize. If so, set toRead to m_source->m_length - rbFileReasPos nframes_t available = (m_length - m_rbFileReadPos).to_frame(m_outputRate); if (available <= m_chunkSize) { toRead = available; } else { printf("ReadSource:: chunkCount == 0, but not at end of file, this shouldn't happen!!\n"); return; } } // Check if the resample quality has changed, it's a safe place here // to reconfigure the audioreaders resample quality. // This allows on the fly changing of the resample quality :) if (m_diskio->get_resample_quality() != m_audioReader->get_convertor_type()) { m_audioReader->set_converter_type(m_diskio->get_resample_quality()); } // Read in the samples from source nframes_t toWrite = rb_file_read(buffer, toRead); // and write it to the ringbuffer if (toWrite) { for (int i=m_buffers.size()-1; i>=0; --i) { m_buffers.at(i)->write(buffer->destination[i], toWrite); } } } void ReadSource::start_resync(TimeRef& position) { // printf("starting resync!\n"); if (m_needSync || m_syncInProgress) { // printf("start_resync still in progress!\n"); return; } m_syncPos = position; m_rbReady = 0; m_needSync = 1; } void ReadSource::finish_resync() { // printf("sync finished\n"); m_needSync = 0; m_bufferUnderRunDetected = 0; m_rbReady = 1; m_syncInProgress = 0; } void ReadSource::sync(DecodeBuffer* buffer) { PENTER2; // printf("source::sync: %s\n", QS_C(m_fileName)); if (!m_audioReader) { return; } if (!m_needSync) { return; } if (!m_syncInProgress) { rb_seek_to_file_position(m_syncPos); m_syncInProgress = 1; } // Currently, we fill the buffer completely. // For some reason, filling it with 1/4 at a time // doesn't fill it consitently, and thus giving audible artifacts. process_ringbuffer(buffer); if (m_buffers.at(0)->write_space() == 0) { finish_resync(); } // PWARN("Resyncing ringbuffer finished"); } void ReadSource::prepare_rt_buffers( ) { PENTER; Q_ASSERT(m_clip); for (int i=0; i(m_bufferSize)); } TimeRef synclocation = m_clip->get_sheet()->get_work_location(); start_resync(synclocation); } BufferStatus* ReadSource::get_buffer_status() { if (m_channelCount == 0) { return m_bufferstatus; } int freespace = m_buffers.at(0)->write_space(); // printf("m_rbFileReadPos, m_length %lld, %lld\n", m_rbFileReadPos.universal_frame(), m_length.universal_frame()); TimeRef transport = m_clip->get_sheet()->get_transport_location(); TimeRef syncstartlocation = m_clip->get_track_start_location(); bool transportBeforeSyncStartLocation = transport < (syncstartlocation - (3 * UNIVERSAL_SAMPLE_RATE)); bool transportAfterClipEndLocation = transport > (m_clip->get_track_end_location() + (3 * UNIVERSAL_SAMPLE_RATE)); if (m_rbFileReadPos >= m_length || !m_active || transportBeforeSyncStartLocation || transportAfterClipEndLocation) { m_bufferstatus->fillStatus = 100; freespace = 0; m_bufferstatus->needSync = false; } else { m_bufferstatus->fillStatus = (int) (((float)freespace / m_bufferSize) * 100); m_bufferstatus->needSync = m_needSync; } m_bufferstatus->bufferUnderRun = m_bufferUnderRunDetected; m_bufferstatus->priority = (int) (freespace / m_chunkSize); return m_bufferstatus; } void ReadSource::set_active(bool active) { if (m_active == active) return; if (active) { m_active = 1; } else { m_active = 0; } } int ReadSource::get_file_rate() const { if (m_audioReader) { return m_audioReader->get_file_rate(); } else { PERROR("ReadSource::get_file_rate(), but no audioreader available!!"); } return pm().get_project()->get_rate(); } void ReadSource::set_diskio(DiskIO * diskio) { m_diskio = diskio; set_output_rate(m_diskio->get_output_rate()); if (m_audioReader) { m_audioReader->set_resample_decode_buffer(m_diskio->get_resample_decode_buffer()); m_audioReader->set_converter_type(m_diskio->get_resample_quality()); } prepare_rt_buffers(); } QString ReadSource::get_error_string() const { switch(m_error) { case COULD_NOT_OPEN_FILE: return tr("Could not open file"); case INVALID_CHANNEL_COUNT: return tr("Invalid channel count"); case ZERO_CHANNELS: return tr("File has zero channels"); case FILE_DOES_NOT_EXIST: return tr("The file does not exist!"); default: return tr("No ReadSource error set"); } return tr("No ReadSource error set"); } traverso-0.49.4/src/core/FadeCurve.h000644 001750 001750 00000005154 11427545631 017530 0ustar00remonremon000000 000000 /* Copyright (C) 2006 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: FadeCurve.h,v 1.19 2008/01/21 16:22:14 r_sijrier Exp $ */ #ifndef FADE_CURVE_H #define FADE_CURVE_H #include "Curve.h" #include #include #include #include class Sheet; class AudioClip; class AudioBus; class FadeCurve : public Curve, public APILinkedListNode { Q_OBJECT Q_CLASSINFO("toggle_bypass", tr("Toggle Bypass")) Q_CLASSINFO("set_mode", tr("Cycle Shape")) Q_CLASSINFO("reset", tr("Remove Fade")) Q_CLASSINFO("toggle_raster", tr("Toggle Raster")) public: static QStringList defaultShapes; FadeCurve(AudioClip* clip, Sheet* sheet, QString type); ~FadeCurve(); enum FadeType { FadeIn, FadeOut }; QDomNode get_state(QDomDocument doc); int set_state( const QDomNode & node ); void process(AudioBus* bus, nframes_t nframes); float get_bend_factor() {return m_bendFactor;} float get_strength_factor() {return m_strenghtFactor;} int get_mode() const {return m_mode;} int get_raster() const {return m_raster;} void set_shape(QString shapeName); void set_bend_factor(float factor); void set_strength_factor(float factor); FadeType get_fade_type() const {return m_type;} QList get_control_points(); bool is_bypassed() const {return m_bypass;} bool is_smaller_then(APILinkedListNode* node) {Q_UNUSED(node); return false;} void set_range(double pos); void set_mode(int m); private: AudioClip* m_clip; float m_bendFactor; float m_strenghtFactor; bool m_bypass; int m_mode; int m_raster; FadeType m_type; QString m_sType; QList m_controlPoints; QPointF get_curve_point(float f); void init(); public slots: void solve_node_positions(); Command* toggle_bypass(); Command* set_mode(); Command* reset(); Command* toggle_raster(); signals: void modeChanged(); void bendValueChanged(); void strengthValueChanged(); void rasterChanged(); void rangeChanged(); }; #endif //eof traverso-0.49.4/src/core/AudioClipGroup.h000644 001750 001750 00000003533 11163362147 020545 0ustar00remonremon000000 000000 /* Copyright (C) 2008 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef AUDIO_CLIP_GROUP_H #define AUDIO_CLIP_GROUP_H #include "defines.h" #include "AudioClip.h" class AudioClipGroup { public: AudioClipGroup(){}; AudioClipGroup(QList clips); void add_clip(AudioClip* clip); void set_clips(QList clips); void move_to(int trackIndex, TimeRef location); void set_snappable(bool snap); void set_as_moving(bool move); void check_valid_track_index_delta(int& delta); QList copy_clips(); void add_all_clips_to_tracks(); void remove_all_clips_from_tracks(); int get_size() const {return m_clips.size();} int get_track_index() const {return m_topTrackIndex;} bool is_locked() const; TimeRef get_track_start_location() const {return m_trackStartLocation;} TimeRef get_track_end_location() const {return m_trackEndLocation;} TimeRef get_length() const {return m_trackEndLocation - m_trackStartLocation;} private: QList m_clips; TimeRef m_trackEndLocation; TimeRef m_trackStartLocation; int m_topTrackIndex; int m_bottomTrackIndex; void update_state(); }; #endif traverso-0.49.4/src/core/ResourcesManager.cpp000755 001750 001750 00000024457 11163362147 021472 0ustar00remonremon000000 000000 /* Copyright (C) 2006-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "ResourcesManager.h" #include "WriteSource.h" #include "ReadSource.h" #include "Information.h" #include "AudioClip.h" #include "Project.h" #include "Sheet.h" #include "Utils.h" #include "AudioDevice.h" // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" /** \class ResourcesManager \brief A class used to load / save the state of, create and delete ReadSources and AudioClips */ ResourcesManager::ResourcesManager(Project* project) : QObject(project) , m_project(project) { PENTERCONS; m_silentReadSource = 0; } ResourcesManager::~ResourcesManager() { PENTERDES; foreach(SourceData* data, m_sources) { if (! data->source->ref()) { delete data->source; } delete data; } foreach(ClipData* data, m_clips) { delete data->clip; delete data; } } QDomNode ResourcesManager::get_state( QDomDocument doc ) { PENTER; QDomElement rsmNode = doc.createElement("ResourcesManager"); QDomElement audioSourcesElement = doc.createElement("AudioSources"); foreach(SourceData* data, m_sources) { ReadSource* source = data->source; audioSourcesElement.appendChild(source->get_state(doc)); } rsmNode.appendChild(audioSourcesElement); QDomElement audioClipsElement = doc.createElement("AudioClips"); foreach(ClipData* data, m_clips) { AudioClip* clip = data->clip; if (data->isCopy && data->removed) { continue; } // If the clip was 'getted', then it's state has been fully set // and likely changed, so we can get the 'new' state from it. if (data->inUse) { audioClipsElement.appendChild(clip->get_state(doc)); } else { // In case it wasn't we should use the 'old' domNode which // was set during set_state(); audioClipsElement.appendChild(clip->get_dom_node()); } } rsmNode.appendChild(audioClipsElement); return rsmNode; } int ResourcesManager::set_state( const QDomNode & node ) { QDomNode sourcesNode = node.firstChildElement("AudioSources").firstChild(); while(!sourcesNode.isNull()) { ReadSource* source = new ReadSource(sourcesNode); SourceData* data = new SourceData(); data->source = source; m_sources.insert(source->get_id(), data); sourcesNode = sourcesNode.nextSibling(); if (source->get_channel_count() == 0) { m_silentReadSource = source; } } QDomNode clipsNode = node.firstChildElement("AudioClips").firstChild(); while(!clipsNode.isNull()) { AudioClip* clip = new AudioClip(clipsNode); ClipData* data = new ClipData(); data->clip = clip; m_clips.insert(clip->get_id(), data); clipsNode = clipsNode.nextSibling(); } emit stateRestored(); return 1; } ReadSource* ResourcesManager::import_source(const QString& dir, const QString& name) { QString fileName = dir + name; foreach(SourceData* data, m_sources) { if (data->source->get_filename() == fileName) { printf("id is %lld\n", data->source->get_id()); return get_readsource(data->source->get_id()); } } ReadSource* source = new ReadSource(dir, name); SourceData* data = new SourceData(); data->source = source; source->set_created_by_sheet(m_project->get_current_sheet()->get_id()); m_sources.insert(source->get_id(), data); source = get_readsource(source->get_id()); if (source->get_error() < 0) { m_sources.remove(source->get_id()); delete source; return 0; } emit sourceAdded(source); return source; } ReadSource* ResourcesManager::create_recording_source( const QString& dir, const QString& name, int channelCount, qint64 sheetId) { PENTER; ReadSource* source = new ReadSource(dir, name, channelCount); SourceData* data = new SourceData(); data->source = source; source->set_original_bit_depth(audiodevice().get_bit_depth()); source->set_created_by_sheet(sheetId); source->ref(); m_sources.insert(source->get_id(), data); emit sourceAdded(source); return source; } ReadSource* ResourcesManager::get_silent_readsource() { if (!m_silentReadSource) { m_silentReadSource = new ReadSource(); SourceData* data = new SourceData(); data->source = m_silentReadSource; m_sources.insert(m_silentReadSource->get_id(), data); m_silentReadSource->set_created_by_sheet( -1 ); } m_silentReadSource = get_readsource(m_silentReadSource->get_id()); return m_silentReadSource; } ReadSource * ResourcesManager::get_readsource(qint64 id) { SourceData* data = m_sources.value(id); if (!data) { PWARN("ResourcesManager::get_readsource(): ReadSource with id %lld is not in my database!", id); return 0; } ReadSource* source = data->source; // When the AudioSource is "get", do a ref counting. // If the source allready was ref counted, create a deep copy if (source->ref()) { PMESG("Creating deep copy of ReadSource: %s", QS_C(source->get_name())); source = source->deep_copy(); source->ref(); } if ( source->init() < 0) { info().warning( tr("ResourcesManager:: Failed to initialize ReadSource %1 (Reason: %2)") .arg(source->get_filename()).arg(source->get_error_string())); } return source; } /** * Get the AudioClip with id \a id This function will return 0 if no AudioClip was found with id \a id. Only ONE AudioClip instance with this id can be retrieved via this function. Using this function multiple times with the same id will implicitely create a new AudioClip with a new unique id!! * @param id The unique id of the AudioClip to get * @return The AudioClip with id \a id, 0 if no AudioClip was found, and a 'deep copy' of the AudioClip with id \a id if the AudioClip was allready getted before via this function. */ AudioClip* ResourcesManager::get_clip(qint64 id) { ClipData* data = m_clips.value(id); if (!data) { return 0; } AudioClip* clip = data->clip; if (data->inUse && !data->removed) { PMESG("Creating deep copy of Clip %s", QS_C(clip->get_name())); clip = clip->create_copy(); // It is NOT possible for 2 clips to have the same ID // check for this, since it's absolutely crucial, and // indicates a design error somewhere ! (most likely in // AudioClip::create_copy(); Q_ASSERT( ! m_clips.contains(clip->get_id()) ); ClipData* copy = new ClipData(); copy->clip = clip; copy->isCopy = true; m_clips.insert(clip->get_id(), copy); // Now that we have created a copy of the audioclip, start // the usual get_clip routine again to properly init the clip // and other stuff. return get_clip(clip->get_id()); } ReadSource* source = get_readsource(data->clip->get_readsource_id()); clip->set_audio_source(source); data->inUse = true; return clip; } AudioClip* ResourcesManager::new_audio_clip(const QString& name) { PENTER; AudioClip* clip = new AudioClip(name); ClipData* data = new ClipData(); data->clip = clip; m_clips.insert(clip->get_id(), data); return get_clip(clip->get_id()); } QList ResourcesManager::get_all_audio_sources( ) const { QList< ReadSource * > list; foreach(SourceData* data, m_sources) { list.append(data->source); } if (m_silentReadSource) { list.removeAll(m_silentReadSource); } return list; } QList< AudioClip * > ResourcesManager::get_all_clips() const { QList list; foreach(ClipData* data, m_clips) { list.append(data->clip); } return list; } void ResourcesManager::mark_clip_removed(AudioClip * clip) { ClipData* data = m_clips.value(clip->get_id()); if (!data) { PERROR("Clip with id %lld is not in my database!", clip->get_id()); return; } data->removed = true; SourceData* sourcedata = m_sources.value(clip->get_readsource_id()); if (!sourcedata) { PERROR("Source %lld not in database", clip->get_readsource_id()); } else { sourcedata->clipCount--; } emit clipRemoved(clip); } void ResourcesManager::mark_clip_added(AudioClip * clip) { ClipData* clipdata = m_clips.value(clip->get_id()); if (!clipdata) { PERROR("Clip with id %lld is not in my database!", clip->get_id()); return; } clipdata->removed = false; SourceData* sourcedata = m_sources.value(clip->get_readsource_id()); if (!sourcedata) { PERROR("Source %lld not in database", clip->get_readsource_id()); } else { sourcedata->clipCount++; } emit clipAdded(clip); } bool ResourcesManager::is_clip_in_use(qint64 id) const { ClipData* data = m_clips.value(id); if (!data) { PERROR("Clip with id %lld is not in my database!", id); return false; } return data->inUse && !data->removed; } bool ResourcesManager::is_source_in_use(qint64 id) const { SourceData* data = m_sources.value(id); if (!data) { PERROR("Source with id %lld is not in my database!", id); return false; } return data->clipCount > 0 ? true : false; } void ResourcesManager::set_source_for_clip(AudioClip * clip, ReadSource * source) { clip->set_audio_source(source); } ResourcesManager::SourceData::SourceData() { source = 0; clipCount = 0; } ResourcesManager::ClipData::ClipData() { clip = 0; inUse = false; isCopy = false; removed = false; } void ResourcesManager::destroy_clip(AudioClip * clip) { ClipData* data = m_clips.value(clip->get_id()); if (!data) { PERROR("Clip with id %lld not in database", clip->get_id()); } else { m_clips.remove(clip->get_id()); delete data; delete clip; } } void ResourcesManager::remove_source(ReadSource * source) { SourceData* data = m_sources.value(source->get_id()); if (!data) { } else { if (data->clipCount > 0) { info().critical(tr("ResourcesManager: Received request to remove Audio Source %1" "but it is still in use by %2 AudioClips!!. NOT removing it!"). arg(source->get_name()).arg(data->clipCount)); return; } m_sources.remove(source->get_id()); emit sourceRemoved(source); delete data; delete source; } } traverso-0.49.4/src/core/Curve.cpp000644 001750 001750 00000040544 11163362147 017301 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2006 Remon Sijrier Original version from Ardour curve.cc, modified in order to fit Traverso's lockless design Copyright (C) 2001-2003 Paul Davis Contains ideas derived from "Constrained Cubic Spline Interpolation" by CJC Kruger (www.korf.co.uk/spline.pdf). This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "Curve.h" #include #include "Sheet.h" #include "Track.h" #include "InputEngine.h" #include "Utils.h" #include #include #include #include #include #include "Mixer.h" #include "Information.h" // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" using namespace std; class MoveNode : public Command { public: MoveNode(Curve* curve, CurveNode* node, double when, double val, const QString& des); int prepare_actions(); int do_action(); int undo_action(); private : CurveNode* m_node; double m_origWhen; double m_origVal; double m_newWhen; double m_newVal; }; MoveNode::MoveNode(Curve* curve, CurveNode* node, double when, double val, const QString& des) : Command(curve, des) { m_node = node; m_origWhen = m_node->get_when(); m_origVal = m_node->get_value(); m_newWhen = when; m_newVal = val; } int MoveNode::prepare_actions() { return 1; } int MoveNode::do_action() { m_node->set_when_and_value(m_newWhen, m_newVal); return 1; } int MoveNode::undo_action() { m_node->set_when_and_value(m_origWhen, m_origVal); return 1; } Curve::Curve(ContextItem* parent) : ContextItem(parent) { PENTERCONS; m_id = create_id(); init(); } Curve::Curve(ContextItem* parent, const QDomNode node ) : ContextItem(parent) { init(); set_state(node); } Curve::~Curve() { APILinkedListNode* node = m_nodes.first(); while (node) { CurveNode* q = (CurveNode*)node; node = node->next; delete q; } } void Curve::init( ) { QObject::tr("Curve"); QObject::tr("CurveNode"); m_changed = true; m_lookup_cache.left = -1; m_defaultValue = 1.0f; m_sheet = 0; connect(this, SIGNAL(nodePositionChanged()), this, SLOT(set_changed())); } QDomNode Curve::get_state(QDomDocument doc, const QString& name) { PENTER3; QDomElement domNode = doc.createElement(name); QStringList nodesList; apill_foreach(CurveNode* cn, CurveNode, m_nodes) { nodesList << QString::number(cn->when, 'g', 24).append(",").append(QString::number(cn->value)); } if (m_nodes.size() == 0) { nodesList << "1," + QString::number(m_defaultValue); } domNode.setAttribute("nodes", nodesList.join(";")); domNode.setAttribute("defaulvalue", m_defaultValue); domNode.setAttribute("id", m_id); return domNode; } int Curve::set_state( const QDomNode & node ) { PENTER; QDomElement e = node.toElement(); QStringList nodesList = e.attribute( "nodes", "" ).split(";"); m_defaultValue = e.attribute( "defaulvalue", "1.0" ).toDouble(); m_id = e.attribute("id", "0" ).toLongLong(); if (m_id == 0) { m_id = create_id(); } for (int i=0; i qint64(get_range())) { float gain = ((CurveNode*)m_nodes.last())->value * makeupgain; if (gain == 1.0f) { return 0; } for (uint chan=0; chanmixdown, nframes); for (uint chan=0; chanmixdown[n] * makeupgain); } } return 1; } void Curve::solve () { uint32_t npoints; if (!m_changed) { printf("Curve::solve, no data change\n"); return; } if ((npoints = m_nodes.size()) > 2) { /* Compute coefficients needed to efficiently compute a constrained spline curve. See "Constrained Cubic Spline Interpolation" by CJC Kruger (www.korf.co.uk/spline.pdf) for more details. */ double x[npoints]; double y[npoints]; uint32_t i; QList::iterator xx; CurveNode* cn; i = 0; for(APILinkedListNode* node = m_nodes.first(); node!=0; node = node->next, ++i) { cn = (CurveNode*)node; x[i] = cn->when; y[i] = cn->value; } double lp0, lp1, fpone; lp0 =(x[1] - x[0])/(y[1] - y[0]); lp1 = (x[2] - x[1])/(y[2] - y[1]); if ( (lp0*lp1) < 0 ) { fpone = 0; } else { fpone = 2 / (lp1 + lp0); } double fplast = 0; i = 0; for(APILinkedListNode* node = m_nodes.first(); node!=0; node = node->next, ++i) { cn = (CurveNode*)node; if (cn == 0) { /* qCritical << _("programming error: ") << X_("non-CurvePoint event found in event list for a Curve") << endmsg;*/ /*NOTREACHED*/ } double xdelta; /* gcc is wrong about possible uninitialized use */ double xdelta2; /* ditto */ double ydelta; /* ditto */ double fppL, fppR; double fpi; if (i > 0) { xdelta = x[i] - x[i-1]; xdelta2 = xdelta * xdelta; ydelta = y[i] - y[i-1]; } /* compute (constrained) first derivatives */ if (i == 0) { /* first segment */ fplast = ((3 * (y[1] - y[0]) / (2 * (x[1] - x[0]))) - (fpone * 0.5)); /* we don't store coefficients for i = 0 */ continue; } else if (i == npoints - 1) { /* last segment */ fpi = ((3 * ydelta) / (2 * xdelta)) - (fplast * 0.5); } else { /* all other segments */ double slope_before = ((x[i+1] - x[i]) / (y[i+1] - y[i])); double slope_after = (xdelta / ydelta); if ((slope_after * slope_before) < 0.0) { /* slope m_changed sign */ fpi = 0.0; } else { fpi = 2 / (slope_before + slope_after); } } /* compute second derivative for either side of control point `i' */ double fractal = ((6 * ydelta) / xdelta2); // anyone knows a better name for it? fppL = (((-2 * (fpi + (2 * fplast))) / (xdelta))) + fractal; fppR = (2 * ((2 * fpi) + fplast) / xdelta) - fractal; /* compute polynomial coefficients */ double b, c, d; d = (fppR - fppL) / (6 * xdelta); c = ((x[i] * fppL) - (x[i-1] * fppR))/(2 * xdelta); double xim12, xim13; double xi2, xi3; xim12 = x[i-1] * x[i-1]; /* "x[i-1] squared" */ xim13 = xim12 * x[i-1]; /* "x[i-1] cubed" */ xi2 = x[i] * x[i]; /* "x[i] squared" */ xi3 = xi2 * x[i]; /* "x[i] cubed" */ b = (ydelta - (c * (xi2 - xim12)) - (d * (xi3 - xim13))) / xdelta; /* store */ cn->coeff[0] = y[i-1] - (b * x[i-1]) - (c * xim12) - (d * xim13); cn->coeff[1] = b; cn->coeff[2] = c; cn->coeff[3] = d; fplast = fpi; } } m_changed = false; } void Curve::get_vector (double x0, double x1, float *vec, int32_t veclen) { double rx, dx, lx, hx, max_x, min_x; int32_t i; int32_t original_veclen; int32_t npoints; if ((npoints = m_nodes.size()) == 0) { for (i = 0; i < veclen; ++i) { vec[i] = m_defaultValue; } return; } /* nodes is now known not to be empty */ CurveNode* lastnode = (CurveNode*)m_nodes.last(); CurveNode* firstnode = (CurveNode*)m_nodes.first(); max_x = lastnode->when; min_x = firstnode->when; lx = max (min_x, x0); if (x1 < 0) { x1 = lastnode->when; } hx = min (max_x, x1); original_veclen = veclen; if (x0 < min_x) { /* fill some beginning section of the array with the initial (used to be default) value */ double frac = (min_x - x0) / (x1 - x0); int32_t subveclen = (int32_t) floor (veclen * frac); subveclen = min (subveclen, veclen); for (i = 0; i < subveclen; ++i) { vec[i] = firstnode->value; } veclen -= subveclen; vec += subveclen; } if (veclen && x1 > max_x) { /* fill some end section of the array with the default or final value */ double frac = (x1 - max_x) / (x1 - x0); int32_t subveclen = (int32_t) floor (original_veclen * frac); float val; subveclen = min (subveclen, veclen); val = lastnode->value; i = veclen - subveclen; for (i = veclen - subveclen; i < veclen; ++i) { vec[i] = val; } veclen -= subveclen; } if (veclen == 0) { return; } if (npoints == 1 ) { for (i = 0; i < veclen; ++i) { vec[i] = firstnode->value; } return; } if (npoints == 2) { /* linear interpolation between 2 points */ /* XXX I'm not sure that this is the right thing to do here. but its not a common case for the envisaged uses. */ if (veclen > 1) { dx = (hx - lx) / (veclen - 1) ; } else { dx = 0; // not used } double slope = (lastnode->value - firstnode->value) / (lastnode->when - firstnode->when ); double yfrac = dx*slope; vec[0] = firstnode->value + slope * (lx - firstnode->when); for (i = 1; i < veclen; ++i) { vec[i] = vec[i-1] + yfrac; } return; } if (m_changed) { solve (); } rx = lx; if (veclen > 1) { dx = (hx - lx) / veclen; for (i = 0; i < veclen; ++i, rx += dx) { vec[i] = multipoint_eval (rx); } } } double Curve::multipoint_eval(double x) { if ((m_lookup_cache.left < 0) || ((m_lookup_cache.left > x) || (m_lookup_cache.range.second->when < x))) { CurveNode cn (this, x, 0.0); APILinkedListNode* first = m_nodes.first(); APILinkedListNode* last = m_nodes.last(); APILinkedListNode* middle; bool validrange = false; int len = m_nodes.size() - 1; int half; while (len > 0) { half = len >> 1; middle = first; // advance middle by half int n = half; while (n--) { middle = middle->next; } //start compare if (((CurveNode*)middle)->when < cn.when) { first = middle; first = first->next; len = len - half - 1; } else if (cn.when < ((CurveNode*)middle)->when) { len = half; } else { // lower bound (using first/middle) APILinkedListNode* lbfirst = first; APILinkedListNode* lblast = middle; APILinkedListNode* lbmiddle; // start distance. int lblen = 0; APILinkedListNode* temp = lbfirst; while (temp != lblast) { temp = temp->next; ++lblen; } int lbhalf; while (lblen > 0) { lbhalf = lblen >> 1; lbmiddle = lbfirst; // advance middle by half n = lbhalf; while (n--) { lbmiddle = lbmiddle->next; } if (((CurveNode*)lbmiddle)->when < cn.when) { lbfirst = lbmiddle; lbfirst = lbfirst->next; lblen = lblen - lbhalf - 1; } else { lblen = lbhalf; } } m_lookup_cache.range.first = (CurveNode*)lbfirst; // upper bound APILinkedListNode* ubfirst = middle->next; APILinkedListNode* ublast = last; APILinkedListNode* ubmiddle; // start distance. int ublen = 0; temp = ubfirst; while (temp != ublast) { temp = temp->next; ++ublen; } int ubhalf; while (ublen > 0) { ubhalf = ublen >> 1; ubmiddle = ubfirst; // advance middle by half n = ubhalf; while (n--) { ubmiddle = ubmiddle->next; } if (cn.when < ((CurveNode*)ubmiddle)->when) { ublen = ubhalf; } else { ubfirst = ubmiddle; ubfirst = ubfirst->next; ublen = ublen - ubhalf - 1; } } m_lookup_cache.range.second = (CurveNode*)ubfirst; validrange = true; break; } } if (!validrange) { m_lookup_cache.range.first = (CurveNode*)first; m_lookup_cache.range.second = (CurveNode*)first; } } /* EITHER a) x is an existing control point, so first == existing point, second == next point OR b) x is between control points, so range is empty (first == second, points to where to insert x) */ if (m_lookup_cache.range.first == m_lookup_cache.range.second) { /* x does not exist within the list as a control point */ m_lookup_cache.left = x; double x2 = x * x; CurveNode* cn = m_lookup_cache.range.second; return cn->coeff[0] + (cn->coeff[1] * x) + (cn->coeff[2] * x2) + (cn->coeff[3] * x2 * x); } /* x is a control point in the data */ /* invalidate the cached range because its not usable */ m_lookup_cache.left = -1; return m_lookup_cache.range.first->value; } void Curve::set_range(double when) { if (m_nodes.isEmpty()) { printf("Curve::set_range: no nodes!!"); return; } CurveNode* lastnode = (CurveNode*)m_nodes.last(); if (lastnode->when == when) { // printf("Curve::set_range: new range == current range!\n"); return; } if (when < 0.0 ) { printf("Curve::set_range: error, when < 0.0 ! (%f)\n", when); return; } Q_ASSERT(when >= 0.0); double factor = when / lastnode->when; if (factor == 1.0) return; x_scale (factor); set_changed(); } void Curve::x_scale(double factor) { Q_ASSERT(factor != 0.0); apill_foreach(CurveNode* node, CurveNode, m_nodes) { node->set_when(node->when * factor); } } void Curve::set_changed( ) { m_lookup_cache.left = -1; m_changed = true; } /** * Add a new Node to this Curve. * * The returned Command object can be placed on the history stack, * to make un-redo possible (the default (??) when called from the InputEngine) * * Note: This function should only be called from the GUI thread! * * @param node CurveNode to add to this Curve * @param historable Should the returned Command object be placed on the history stack? * @return A Command object, if the call was generated from the InputEngine, it can be leaved alone, if it was a direct call, use Command::process_command() to do the actuall work!! */ Command* Curve::add_node(CurveNode* node, bool historable) { PENTER2; apill_foreach(CurveNode* cn, CurveNode, m_nodes) { if (node->when == cn->when && node->value == cn->value) { info().warning(tr("There is allready a node at this exact position, not adding a new node")); delete node; return 0; } } AddRemove* cmd; cmd = new AddRemove(this, node, historable, m_sheet, "private_add_node(CurveNode*)", "nodeAdded(CurveNode*)", "private_remove_node(CurveNode*)", "nodeRemoved(CurveNode*)", tr("Add CurveNode")); return cmd; } /** * Remove a Node from this Curve. * * The returned Command object can be placed on the history stack, * to make un-redo possible (the default (??) when called from the InputEngine) * * Note: This function should only be called from the GUI thread! * * @param node CurveNode to be removed from this Curve * @param historable Should the returned Command object be placed on the history stack? * @return A Command object, if the call was generated from the InputEngine, it can be leaved alone, if it was a direct call, use Command::process_command() to do the actuall work!! */ Command* Curve::remove_node(CurveNode* node, bool historable) { PENTER2; if (m_nodes.first() == node) { MoveNode* cmd; cmd = new MoveNode(this, node, 0.0f, 1.0f, tr("Remove CurveNode")); return cmd; } AddRemove* cmd; cmd = new AddRemove(this, node, historable, m_sheet, "private_remove_node(CurveNode*)", "nodeRemoved(CurveNode*)", "private_add_node(CurveNode*)", "nodeAdded(CurveNode*)", tr("Remove CurveNode")); return cmd; } void Curve::private_add_node( CurveNode * node ) { m_nodes.add_and_sort(node); set_changed(); } void Curve::private_remove_node( CurveNode * node ) { m_nodes.remove(node); set_changed(); } void Curve::set_sheet(Sheet * sheet) { m_sheet = sheet; set_history_stack(m_sheet->get_history_stack()); } traverso-0.49.4/src/core/ContextItem.h000644 001750 001750 00000003461 11163362147 020122 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef CONTEXTITEM_H #define CONTEXTITEM_H #include class Command; class QUndoStack; class QUndoGroup; /** * \class ContextItem * \brief Interface class for objects (both core and gui) that operate in a 'Soft Selection' * Each core object that has/can have a visual representation should inherit from this class. Only core objects that inherit this class need to set the historystack which
they need to create/get themselves. */ class ContextItem : public QObject { Q_OBJECT public: ContextItem(QObject* parent) : QObject(parent) , m_hs(0) , m_contextItem(0) {} ContextItem() : QObject() , m_hs(0) , m_contextItem(0) {} ~ContextItem() {} ContextItem* get_context() const {return m_contextItem;} QUndoStack* get_history_stack() const {return m_hs;} qint64 get_id() const {return m_id;} void set_history_stack(QUndoStack* hs) {m_hs = hs;} void set_context_item(ContextItem* item) {m_contextItem = item;} protected: QUndoStack* m_hs; qint64 m_id; private: ContextItem* m_contextItem; friend class Tsar; }; #endif //eof traverso-0.49.4/src/core/ContextPointer.h000644 001750 001750 00000012242 11163362147 020641 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2006 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: ContextPointer.h,v 1.15 2008/01/21 16:22:13 r_sijrier Exp $ */ #ifndef CONTEXTPOINTER_H #define CONTEXTPOINTER_H #include #include #include "ViewPort.h" class ContextItem; class ContextPointer : public QObject { Q_OBJECT public: /** * Returns the current ViewPort's mouse x coordinate * @return The current ViewPort's mouse x coordinate */ inline int x() const {return m_x;} /** * Returns the current ViewPort's mouse y coordinate * @return The current ViewPort's mouse y coordinate */ inline int y() const {return m_y;} /** * Convenience function, equals QPoint(cpointer().x(), cpointer().y()) * @return The current ViewPorts mouse position; */ inline QPoint pos() {return QPoint(m_x, m_y);} /** * Convenience function that maps the ViewPort's mouse x
coordinate to the scene x coordinate * @return The current scene x coordinate, mapped from the ViewPort's mouse x coordinate */ inline int scene_x() const { Q_ASSERT(currentViewPort); return (int) currentViewPort->mapToScene(m_x, m_y).x(); } /** * Convenience function that maps the ViewPort's mouse y
coordinate to the ViewPort's scene y coordinate * @return The current ViewPort's scene y coordinate, mapped from the ViewPort's mouse y coordinate */ inline int scene_y() const { Q_ASSERT(currentViewPort); return (int) currentViewPort->mapToScene(m_x, m_y).y(); } /** * Returns the current's ViewPort's mouse position in the ViewPort's scene position. * @return The current's ViewPort's mouse position in the ViewPort's scene position. */ inline QPointF scene_pos() const { Q_ASSERT(currentViewPort); return currentViewPort->mapToScene(m_x, m_y); } /** * Used by ViewPort to update the internal state of ContextPointer Not intended to be used somewhere else. * @param x The ViewPort's mouse x coordinate * @param y The ViewPort's mouse y coordinate */ inline void set_point(int x, int y) { m_x = x; m_y = y; m_jogEvent = true; } /** * Returns the ViewPort x coordinate on first input event. * @return The ViewPort x coordinate on first input event. */ inline int on_first_input_event_x() const {return m_onFirstInputEventX; } /** * Returns the ViewPort y coordinate on first input event. * @return The ViewPort y coordinate on first input event. */ inline int on_first_input_event_y() const {return m_onFirstInputEventY; } /** * Returns the scene x coordinate on first input event. * @return The scene x coordinate on first input event. */ inline int on_first_input_event_scene_x() const { return (int) currentViewPort->mapToScene(m_onFirstInputEventX, m_onFirstInputEventY).x(); } /** * Returns the scene y coordinate on first input event. * @return The scene y coordinate on first input event. */ inline int on_first_input_event_scene_y() const { return (int) currentViewPort->mapToScene(m_onFirstInputEventX, m_onFirstInputEventY).y(); } /** * Called _only_ by InputEngine, not to be used anywhere else. */ inline void inputengine_first_input_event( ) { m_onFirstInputEventX = m_x; m_onFirstInputEventY = m_y; } inline int get_current_mode() const { if (currentViewPort) { return currentViewPort->get_current_mode(); } return -1; } void jog_start(); void jog_finished(); void reset_cursor(); ViewPort* get_viewport(); void set_current_viewport(ViewPort* vp) { currentViewPort = vp; } QList get_context_items(); void add_contextitem(QObject* item); void remove_contextitem(QObject* item); QList get_contextmenu_items() const; void set_contextmenu_items(QList list); private: ContextPointer(); ContextPointer(const ContextPointer&); // allow this function to create one instance friend ContextPointer& cpointer(); int m_x; int m_y; bool m_jogEvent; QTimer m_jogTimer; int m_onFirstInputEventX; int m_onFirstInputEventY; ViewPort* currentViewPort; QList contextItemsList; QList m_contextMenuItems; private slots: void update_jog(); }; #endif // use this function to access the context pointer ContextPointer& cpointer(); //eof traverso-0.49.4/src/core/libtraversocore.h000644 001750 001750 00000001156 11163362147 021063 0ustar00remonremon000000 000000 #include "AudioClip.h" #include "AudioClipManager.h" #include "AudioSource.h" #include "ResourcesManager.h" #include "Command.h" #include "CommandPlugin.h" #include "ContextItem.h" #include "Config.h" #include "ContextPointer.h" #include "Curve.h" #include "CurveNode.h" #include "FadeCurve.h" #include "Information.h" #include "InputEngine.h" #include "Marker.h" #include "Mixer.h" #include "Peak.h" #include "Project.h" #include "ProjectManager.h" #include "ReadSource.h" #include "SnapList.h" #include "Sheet.h" #include "TimeLine.h" #include "Track.h" #include "Utils.h" #include "ViewPort.h" #include "WriteSource.h" traverso-0.49.4/src/core/Config.h000644 001750 001750 00000003065 11163362147 017064 0ustar00remonremon000000 000000 /* Copyright (C) 2006 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: Config.h,v 1.9 2007/10/20 17:38:17 r_sijrier Exp $ */ #ifndef CONFIG_H #define CONFIG_H #include #include #include class Config : public QObject { Q_OBJECT public: QVariant get_property(const QString& type, const QString& property, QVariant defaultValue); void set_property(const QString& type, const QString& property, QVariant newValue); void check_and_load_configuration(); void reset_settings( ); void init_input_engine(); void save(); signals: void configChanged(); private: Config() {} ~Config(); Config(const Config&); // allow this function to create one instance friend Config& config(); void load_configuration(); void set_audiodevice_driver_properties(); QHash m_configs; }; // use this function to access the settings Config& config(); #endif traverso-0.49.4/src/core/FadeCurve.cpp000644 001750 001750 00000027372 11427550501 020061 0ustar00remonremon000000 000000 /* Copyright (C) 2006 Remon Sijrier, Nicola Doebelin This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: FadeCurve.cpp,v 1.36 2008/11/07 10:43:08 r_sijrier Exp $ */ #include "FadeCurve.h" #include #include #include "Sheet.h" #include "Fade.h" #include "AudioClip.h" #include "Command.h" #include "CommandGroup.h" #include #include "AudioDevice.h" #include "AudioBus.h" // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" QStringList FadeCurve::defaultShapes = QStringList() << "Fastest" << "Fast" << "Linear" << "Slow" << "Slowest"; FadeCurve::FadeCurve(AudioClip* clip, Sheet* sheet, QString type ) : Curve(clip) , m_clip(clip) , m_sType(type) { Q_UNUSED(sheet); if (type == "FadeIn") { m_type = FadeIn; } if (type == "FadeOut") { m_type = FadeOut; } m_sheet = m_clip->get_sheet(); m_controlPoints.append(QPointF(0.0, 0.0)); m_controlPoints.append(QPointF(0.25, 0.25)); m_controlPoints.append(QPointF(0.75, 0.75)); m_controlPoints.append(QPointF(1.0, 1.0)); m_bendFactor = 0.0; m_strenghtFactor = 0.5; m_mode = 2; m_raster = 0; m_bypass = false; connect(this, SIGNAL(stateChanged()), this, SLOT(solve_node_positions())); connect(this, SIGNAL(bendValueChanged()), this, SIGNAL(stateChanged())); connect(this, SIGNAL(strengthValueChanged()), this, SIGNAL(stateChanged())); connect(this, SIGNAL(modeChanged()), this, SIGNAL(stateChanged())); init(); } FadeCurve::~ FadeCurve( ) { PENTERDES; } void FadeCurve::init() { QObject::tr("FadeCurve"); // Populate the curve with 12 CurveNodes float f = 0.0; int nodecount = 11; for (int i = 0; i <= nodecount; ++i) { QPointF p = get_curve_point(f); CurveNode* node = new CurveNode(this, p.x(), p.y()); AddRemove* cmd = (AddRemove*) add_node(node, false); cmd->set_instantanious(true); Command::process_command(cmd); // printf("adding node with x=%f, y=%f\n", p.x(), p.y()); f += 1.0 / nodecount; } set_range(1.0); } QDomNode FadeCurve::get_state( QDomDocument doc ) { QDomElement node = doc.createElement(m_sType); node.setAttribute("bendfactor", m_bendFactor); node.setAttribute("strengthfactor", m_strenghtFactor); node.setAttribute("bypassed", m_bypass); node.setAttribute("range", get_range()); node.setAttribute("mode", m_mode); node.setAttribute("raster", m_raster); QStringList controlPointsList; for (int i=0; i< m_controlPoints.size(); ++i) { QPointF point = m_controlPoints.at(i); controlPointsList << QString::number(point.x()).append(",").append(QString::number(point.y())); } node.setAttribute("controlpoints", controlPointsList.join(";")); return node; } int FadeCurve::set_state( const QDomNode & node ) { QDomElement e = node.toElement(); m_bendFactor = e.attribute( "bendfactor", "0.0" ).toDouble(); m_strenghtFactor = e.attribute( "strengthfactor", "0.5" ).toDouble(); m_bypass = e.attribute( "bypassed", "0" ).toInt(); m_mode = e.attribute( "mode", "2" ).toInt(); m_raster = e.attribute( "raster", "0" ).toInt(); QStringList controlPointsList = e.attribute( "controlpoints", "0.0,0.0;0.25,0.25;0.75,0.75;1.0,1.0" ).split(";"); for (int i=0; iget_channel_count()]; int outputRate = audiodevice().get_sample_rate(); uint framesToProcess = nframes; TimeRef trackStartLocation, trackEndLocation, mix_pos; TimeRef fadeRange = TimeRef(get_range()); TimeRef transportLocation = m_sheet->get_transport_location(); TimeRef upperRange = transportLocation + TimeRef(framesToProcess, outputRate); if (m_type == FadeIn) { trackStartLocation = m_clip->get_track_start_location(); } else { trackStartLocation = m_clip->get_track_end_location() - fadeRange; } trackEndLocation = trackStartLocation + fadeRange; if ( (trackStartLocation < upperRange) && (trackEndLocation > transportLocation) ) { if (transportLocation < trackStartLocation) { // Using to_frame() for both the m_trackStartLocation and transportLocation seems to round // better then using (m_trackStartLocation - transportLocation).to_frame() // TODO : find out why! uint offset = (trackStartLocation).to_frame(outputRate) - transportLocation.to_frame(outputRate); mix_pos = TimeRef(); // printf("offset %d\n", offset); for (int chan=0; changet_channel_count(); ++chan) { audio_sample_t* buf = bus->get_buffer(chan, framesToProcess); mixdown[chan] = buf + offset; } framesToProcess = framesToProcess - offset; } else { mix_pos = (transportLocation - trackStartLocation); for (int chan=0; changet_channel_count(); ++chan) { mixdown[chan] = bus->get_buffer(chan, framesToProcess); } } if (trackEndLocation < upperRange) { // Using to_frame() for both the upperRange and m_trackEndLocation seems to round // better then using (upperRange - m_trackEndLocation).to_frame() // TODO : find out why! framesToProcess -= upperRange.to_frame(outputRate) - trackEndLocation.to_frame(outputRate); // printf("if (m_trackEndLocation < upperRange): framesToProcess %d\n", framesToProcess); } } else { return; } upperRange = mix_pos + TimeRef(framesToProcess, outputRate); get_vector(mix_pos.universal_frame(), upperRange.universal_frame(), m_sheet->gainbuffer, framesToProcess); for (int chan=0; changet_channel_count(); ++chan) { for (nframes_t frame = 0; frame < framesToProcess; ++frame) { mixdown[chan][frame] *= m_sheet->gainbuffer[frame]; } } } void FadeCurve::set_shape(QString shapeName) { QDomDocument doc("FadeShapes"); if (defaultShapes.contains(shapeName)) { QFile file(":/fadeshapes"); if (!file.open(QIODevice::ReadOnly)) { printf("Could not open fadeshapes file!!\n"); return; } if (!doc.setContent(&file)) { file.close(); printf("Could not set QDomDocument content!\n"); return; } file.close(); } else { // Load from custom saved fades } QDomElement root = doc.documentElement(); QDomNode node = root.firstChildElement(m_sType); QDomElement fadeElement = node.firstChildElement(shapeName); if (fadeElement.isNull()) { printf("%s does not exist?????\n", shapeName.toAscii().data()); return; } CommandGroup* group = new CommandGroup(this, tr("Fade Preset")); group->add_command(new FadeBend(this, fadeElement.attribute( "bendfactor", "0.0" ).toDouble())); group->add_command(new FadeStrength(this, fadeElement.attribute( "strengthfactor", "0.5" ).toDouble())); Command::process_command(group); emit stateChanged(); } void FadeCurve::solve_node_positions( ) { // printf("FadeCurve::solve_node_positions()\n"); // calculate control points values if (m_mode == 0) { // bended if (m_type == FadeIn) { m_controlPoints[1] = QPointF(m_strenghtFactor * (1.0 - m_bendFactor), m_strenghtFactor * m_bendFactor); m_controlPoints[2] = QPointF(1.0 - (m_strenghtFactor * m_bendFactor), 1.0 - (m_strenghtFactor * (1.0 - m_bendFactor))); } if (m_type == FadeOut) { m_controlPoints[1] = QPointF(m_strenghtFactor * m_bendFactor, m_strenghtFactor * (1.0 - m_bendFactor)); m_controlPoints[2] = QPointF(1.0 - (m_strenghtFactor * (1.0 - m_bendFactor)), 1.0 - (m_strenghtFactor * m_bendFactor)); } } if (m_mode == 1) { // s-shape m_controlPoints[1] = QPointF(m_strenghtFactor * (1.0 - m_bendFactor), m_strenghtFactor * m_bendFactor); m_controlPoints[2] = QPointF(1.0 - (m_strenghtFactor * (1.0 - m_bendFactor)), 1.0 - (m_strenghtFactor * m_bendFactor)); } if (m_mode == 2) { // long if (m_type == FadeIn) { m_controlPoints[1] = QPointF(m_strenghtFactor * (1.0 - m_bendFactor), m_strenghtFactor * m_bendFactor); m_controlPoints[2] = QPointF(1.0, 1.0); } if (m_type == FadeOut) { m_controlPoints[1] = QPointF(0.0, 0.0); m_controlPoints[2] = QPointF(1.0 - (m_strenghtFactor * (1.0 - m_bendFactor)), 1.0 - (m_strenghtFactor * m_bendFactor)); } } // calculate curve nodes values float f = 0.0; APILinkedList list = get_nodes(); int listsize = list.size(); if (listsize > 0) { APILinkedListNode* node = list.first()->next; while (node) { f += 1.0 / (listsize - 1); QPointF p = get_curve_point(f); ((CurveNode*)node)->set_relative_when_and_value(p.x(), p.y()); node = node->next; } } set_changed(); } QPointF FadeCurve::get_curve_point( float f) { float x = m_controlPoints.at(0).x() * pow((1.0 - f), 3.0) + 3 * m_controlPoints.at(1).x() * f * pow((1.0 - f), 2.0) + 3 * m_controlPoints.at(2).x() * pow(f, 2.0) * (1.0 - f) + m_controlPoints.at(3).x() * pow(f, 3.0); float y = m_controlPoints.at(0).y() * pow((1.0 - f), 3.0) + 3 * m_controlPoints.at(1).y() * f * pow((1.0 - f), 2.0) + 3 * m_controlPoints.at(2).y() * pow(f, 2.0) * (1.0 - f) + m_controlPoints.at(3).y() * pow(f, 3.0); if (m_type == FadeOut) { y = 1.0 - y; } return QPointF(x, y); } void FadeCurve::set_range(double when) { Curve::set_range(when); emit rangeChanged(); } void FadeCurve::set_bend_factor( float factor ) { if (factor > 1.0) factor = 1.0; if (factor < 0.0) factor = 0.0; m_bendFactor = factor; emit bendValueChanged(); } void FadeCurve::set_strength_factor( float factor ) { if (factor > 1.0) factor = 1.0; if (factor < 0.0) factor = 0.0; m_strenghtFactor = factor; emit strengthValueChanged(); } QList< QPointF > FadeCurve::get_control_points( ) { return m_controlPoints; } Command* FadeCurve::set_mode( ) { if (m_mode < 2) { return new FadeMode(this, m_mode, m_mode+1); } else { return new FadeMode(this, m_mode, 0); } } void FadeCurve::set_mode(int m) { m_mode = m; emit modeChanged(); } Command* FadeCurve::reset( ) { return (m_type == FadeIn) ? m_clip->reset_fade_in() : m_clip->reset_fade_out(); } Command* FadeCurve::toggle_bypass( ) { m_bypass = !m_bypass; emit stateChanged(); return 0; } Command* FadeCurve::toggle_raster( ) { m_raster = ! m_raster; emit rasterChanged(); return 0; } traverso-0.49.4/src/core/InputEngine.h000644 001750 001750 00000017775 11163362147 020121 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2008 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef INPUTENGINE_H #define INPUTENGINE_H #include #include #include #include #include #include #include class ContextItem; class Command; class CommandPlugin; static const int FKEY = 0; // - press one key fast static const int FKEY2 = 1; // - press two keys fast, together static const int HOLDKEY = 2; // [K] - Hold one key static const int HKEY2 = 3; // [KK] - Hold two keys, together static const int D_FKEY = 4; // <> - double press one key fast static const int D_FKEY2 = 5; // <> - double press two keys fast, together static const int FHKEY = 6; // <[K]> - press fast and then hold one key static const int FHKEY2 = 7; // <[KK]> - press fast and then hold two keys together static const int S_FKEY_FKEY = 8; // >K>K - press one key and then other key fast and sequentially static const int S_FKEY_FKEY2 = 9; // >K>KK - press one key and then two other keys fast and sequentially static const int S_FKEY2_FKEY = 10; // >KK>K - press two keys and then another one fast and sequentially static const int S_FKEY2_FKEY2 = 11; // >KK>KK - press two keys and then another one fast and sequentially static const int S_FKEY_HKEY = 12; // >K[K] - press fastly one key and then hold another key, sequentially static const int S_FKEY_HKEY2 = 13; // >K[KK] - press fastly one key and then hold two ther ones, sequentially static const int S_FKEY2_HKEY = 14; // >KK[K] - press two keys together fastly and then hold a third one, sequentially static const int S_FKEY2_HKEY2 = 15; // >KK[KK] - press two keys together fastly and then hold a third one, sequentially // internal class used for qt event catching class EventCatcher : public QObject { Q_OBJECT public: EventCatcher(); QTimer holdTimer; QTimer clearOutputTimer; QTimer secondChanceTimer; public slots: void assume_hold(); void quit_second_chance(); void clear_output(); }; struct IEAction { void render_key_sequence(const QString& key1, const QString& key2); ~IEAction(); struct Data { QStringList modes; QVariantList arguments; QList modifierkeys; QString slotsignature; QString pluginname; QString commandname; QString submenu; bool useX; bool useY; int sortorder; }; QHash objects; QHash objectUsingModifierKeys; int type; int fact1_key1; int fact1_key2; int fact2_key1; int fact2_key2; bool isInstantaneous; QByteArray keySequence; }; struct MenuData { static bool smaller(const MenuData left, const MenuData right ) { return left.sortorder < right.sortorder; } static bool greater(const MenuData* left, const MenuData* right ) { return left->sortorder > right->sortorder; } QString keysequence; QString iedata; QString description; QString submenu; int sortorder; QList modifierkeys; }; class InputEngine : public QObject { Q_OBJECT public: void catch_key_press(QKeyEvent *); void catch_key_release(QKeyEvent *); void catch_mousebutton_press( QMouseEvent * e ); void catch_mousebutton_release( QMouseEvent * e ); void catch_mousebutton_doubleclick( QMouseEvent * e ); void catch_scroll(QWheelEvent * e ); int collected_number(); bool is_jogging(); bool is_holding(); QList create_menudata_for(QObject* item); Command* get_holding_command() const; void create_menudata_for_metaobject(const QMetaObject* mo, QList& list) const; int broadcast_action_from_contextmenu(const QString& name); void jog(); void bypass_jog_until_mouse_movements_exceeded_manhattenlength(int length=35); void activate(); void suspend(); void clear_modifier_keys(); Command* succes(); Command* failure(); Command* did_not_implement(); int init_map(const QString& mapFilename); void set_clear_time(int time); void set_hold_sensitiveness(int factor); void set_double_fact_interval(int time); private: InputEngine(); InputEngine(const InputEngine&) : QObject() {} ~InputEngine(); static const int STACK_SIZE = 4; static const int MAX_ACTIONS = 300; static const int PRESS_EVENT = 1; static const int RELEASE_EVENT = 2; enum BroadcastResult { SUCCES=1, FAILURE=2, DIDNOTIMPLEMENT=3 }; QList m_ieActions; QList m_modifierKeys; QList m_activeModifierKeys; QHash m_commandplugins; QHash m_modes; EventCatcher catcher; Command* holdingCommand; QString sCollectedNumber; QPoint m_jogBypassPos; bool active; bool isHolding; bool isPressEventLocked; bool isHoldingOutput; bool isFirstFact; bool isDoubleKey; bool isJogging; bool m_cancelHold; bool m_bypassJog; int fact1_k1; int fact1_k2; int fact2_k1; int fact2_k2; int fact1Type; int wholeMapIndex; int wholeActionType; int collectedNumber; int stackIndex; int eventType[STACK_SIZE]; int eventStack[STACK_SIZE]; int pressEventCounter; // that avoid more than 2 press events in a same fact int pairOf2; int pairOf3; int clearTime; int assumeHoldTime; int doubleFactWaitTime; long eventTime[STACK_SIZE]; int m_broadcastResult; int m_unbypassJogDistance; bool is_fake( int keyval); int identify_first_fact(); int identify_first_and_second_facts_together(); void push_event(int pType, int pKey); void press_checker(); void release_checker(); void push_fact( int k1 , int k2); void give_a_chance_for_second_fact(); void dispatch_action(int mapIndex); void dispatch_hold(); void finish_hold(); void conclusion(); void hold_output(); void stop_collecting(); bool check_number_collection(int eventcode); //! call the slot that handler a given action int broadcast_action(IEAction* action, bool autorepeat=false, bool fromContextMenu=false); void set_jogging(bool jog); void reset(); void process_press_event(int eventcode, bool isAutoRepeat=false); void process_release_event(int eventcode); int find_index_for_instant_fkey( int key ); int find_index_for_instant_fkey2( int key1, int key2 ); int find_index_for_single_fact(int type, int key1, int key2); bool is_modifier_keyfact(int eventcode); int holdEventCode; friend class EventCatcher; // allow this function to create one instance friend InputEngine& ie(); }; // use this function to get the InputEngine object InputEngine& ie(); #endif //eof traverso-0.49.4/src/core/Information.h000644 001750 001750 00000003125 11163362147 020141 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef INFORMATION_H #define INFORMATION_H #include struct InfoStruct { QString message; int type; }; static const int INFO = 0; static const int WARNING = 1; static const int CRITICAL = 2; class Information : public QObject { Q_OBJECT public: void information(const QString& s); void warning(const QString& s); void critical(const QString& s); private: Information(); Information(const Information&) : QObject() {} // allow this function to create one instance friend Information& info(); signals: void message(InfoStruct ); private slots: void audiodevice_message(QString message, int severity); }; // use this function to propagate the Information Information& info(); #endif //eof traverso-0.49.4/src/core/CommandPlugin.h000644 001750 001750 00000004126 11163362147 020413 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef COMMAND_PLUGIN_H #define COMMAND_PLUGIN_H #include #include #include #include #include class CommandInterface { public: virtual ~CommandInterface() {} virtual Command* create(QObject* obj, const QString& command, QVariantList arguments) = 0; }; Q_DECLARE_INTERFACE(CommandInterface, "org.traversodaw.Command.CommandInterface/1.0"); /** * \class CommandPlugin * \brief An abstract class to create new Command's which can be loaded dynamically * */ class CommandPlugin : public QObject, public CommandInterface { Q_OBJECT Q_INTERFACES(CommandInterface); public: virtual ~CommandPlugin() {} /** * Create a Command object, based on the command string. * @param obj The Context Item object for which the Command has to be made * @param command The name of the Command to be created * @param arguments List of arguments which can be parsed by the to be created Command object. * @return On success a Command object, the caller takes authorship, or 0 on failure. */ virtual Command* create(QObject* obj, const QString& command, QVariantList arguments) = 0; virtual QStringList commands() const { return QStringList(m_dict.keys()); } virtual bool implements(const QString& command) const { return m_dict.contains(command); } protected: QHash m_dict; }; #endif //eof traverso-0.49.4/src/core/Project.cpp000755 001750 001750 00000047256 11163362147 017635 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include #include #include #include #include #include #include "Project.h" #include "Sheet.h" #include "ProjectManager.h" #include "Information.h" #include "InputEngine.h" #include "ResourcesManager.h" #include "Export.h" #include "AudioDevice.h" #include "Config.h" #include "ContextPointer.h" #include "Utils.h" #include #include "FileHelpers.h" #define PROJECT_FILE_VERSION 3 // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" /** \class Project \brief Project restores and saves the state of a Traverso Project A Project can have as much Sheet's as one likes. A Project with one Sheet acts like a 'Session' where the Sheet can be turned into a CD with various Tracks using Marker 's When a Project has multiple Sheet's, each Sheet will be a CD Track, this can be usefull if each Track on a CD is independend of the other CD Tracks. */ Project::Project(const QString& title) : ContextItem(), m_title(title) { PENTERCONS; m_currentSheetId = 0; m_exportThread = 0; engineer = ""; m_useResampling = config().get_property("Conversion", "DynamicResampling", true).toBool(); m_rootDir = config().get_property("Project", "directory", "/directory/unknown/").toString() + "/" + m_title; m_sourcesDir = m_rootDir + "/audiosources"; m_rate = audiodevice().get_sample_rate(); m_bitDepth = audiodevice().get_bit_depth(); m_resourcesManager = new ResourcesManager(this); m_hs = new QUndoStack(pm().get_undogroup()); cpointer().add_contextitem(this); } Project::~Project() { PENTERDES; cpointer().remove_contextitem(this); foreach(Sheet* sheet, m_sheets) { sheet->schedule_for_deletion(); sheet->disconnect_from_audiodevice(); } delete m_hs; } int Project::create(int sheetcount, int numtracks) { PENTER; PMESG("Creating new project %s NumSheets=%d", QS_C(m_title), sheetcount); QDir dir; if (dir.mkdir(m_rootDir) < 0) { info().critical(tr("Cannot create dir %1").arg(m_rootDir)); return -1; } if (create_peakfiles_dir() < 0) { return -1; } if (create_audiosources_dir() < 0) { return -1; } if (pm().create_projectfilebackup_dir(m_rootDir) < 0) { return -1; } for (int i=0; i< sheetcount; i++) { Sheet* sheet = new Sheet(this, numtracks); m_sheets.append(sheet); sheet->connect_to_audiodevice(); } if (m_sheets.size()) { set_current_sheet(m_sheets.first()->get_id()); } m_id = create_id(); m_importDir = QDir::homePath(); info().information(tr("Created new Project %1").arg(m_title)); return 1; } int Project::create_audiosources_dir() { QDir dir; if (dir.mkdir(m_sourcesDir) < 0) { info().critical(tr("Cannot create dir %1").arg(m_sourcesDir)); return -1; } return 1; } int Project::create_peakfiles_dir() { QDir dir; QString peaksDir = m_rootDir + "/peakfiles/"; if (dir.mkdir(peaksDir) < 0) { info().critical(tr("Cannot create dir %1").arg(peaksDir)); return -1; } return 1; } int Project::load(QString projectfile) { PENTER; QDomDocument doc("Project"); QFile file; QString filename; if (projectfile.isEmpty()) { filename = m_rootDir + "/project.tpf"; file.setFileName(filename); } else { filename = projectfile; file.setFileName(filename); } if (!file.open(QIODevice::ReadOnly)) { m_errorString = tr("Project %1: Cannot open project.tpf file! (Reason: %2)").arg(m_title).arg(file.errorString()); info().critical(m_errorString); return PROJECT_FILE_COULD_NOT_BE_OPENED; } // Check if important directories still exist! QDir dir; if (!dir.exists(m_rootDir + "/peakfiles")) { create_peakfiles_dir(); } if (!dir.exists(m_rootDir + "/audiosources")) { create_audiosources_dir(); } // Start setting and parsing the content of the xml file QString errorMsg; if (!doc.setContent(&file, &errorMsg)) { m_errorString = tr("Project %1: Failed to parse project.tpf file! (Reason: %2)").arg(m_title).arg(errorMsg); info().critical(m_errorString); return SETTING_XML_CONTENT_FAILED; } QDomElement docElem = doc.documentElement(); QDomNode propertiesNode = docElem.firstChildElement("Properties"); QDomElement e = propertiesNode.toElement(); if (e.attribute("projectfileversion", "-1").toInt() != PROJECT_FILE_VERSION) { m_errorString = tr("Project File Version does not match, unable to load Project!"); info().warning(m_errorString); return PROJECT_FILE_VERSION_MISMATCH; } m_title = e.attribute( "title", "" ); engineer = e.attribute( "engineer", "" ); m_description = e.attribute( "description", "No description set"); m_discid = e.attribute( "discId", "" ); m_upcEan = e.attribute( "upc_ean", "" ); m_genre = e.attribute( "genre", "" ).toInt(); m_performer = e.attribute( "performer", "" ); m_arranger = e.attribute( "arranger", "" ); m_songwriter = e.attribute( "songwriter", "" ); m_message = e.attribute( "message", "" ); m_rate = e.attribute( "rate", "" ).toInt(); m_bitDepth = e.attribute( "bitdepth", "" ).toInt(); m_id = e.attribute("id", "0").toLongLong(); if (m_id == 0) { m_id = create_id(); } m_importDir = e.attribute("importdir", QDir::homePath()); // Load all the AudioSources for this project QDomNode asmNode = docElem.firstChildElement("ResourcesManager"); m_resourcesManager->set_state(asmNode); QDomNode sheetsNode = docElem.firstChildElement("Sheets"); QDomNode sheetNode = sheetsNode.firstChild(); // Load all the Sheets while(!sheetNode.isNull()) { Sheet* sheet = new Sheet(this, sheetNode); Command::process_command(add_sheet(sheet, false)); sheetNode = sheetNode.nextSibling(); } qint64 id = e.attribute("currentsheetid", "0" ).toLongLong(); if ( id == 0) { if (m_sheets.size()) { id = m_sheets.first()->get_id(); } } set_current_sheet(id); info().information( tr("Project %1 loaded").arg(m_title) ); emit projectLoadFinished(); return 1; } int Project::save(bool autosave) { PENTER; QDomDocument doc("Project"); QString fileName = m_rootDir + "/project.tpf"; QFile data( fileName ); if (!data.open( QIODevice::WriteOnly ) ) { QString errorstring = FileHelper::fileerror_to_string(data.error()); info().critical( tr("Couldn't open Project properties file for writing! (File %1. Reason: %2)").arg(fileName).arg(errorstring) ); return -1; } get_state(doc); QTextStream stream(&data); doc.save(stream, 4); data.close(); if (!autosave) { info().information( tr("Project %1 saved ").arg(m_title) ); } pm().start_incremental_backup(m_title); return 1; } QDomNode Project::get_state(QDomDocument doc, bool istemplate) { PENTER; QDomElement projectNode = doc.createElement("Project"); QDomElement properties = doc.createElement("Properties"); properties.setAttribute("title", m_title); properties.setAttribute("engineer", engineer); properties.setAttribute("description", m_description); properties.setAttribute("discId", m_discid ); properties.setAttribute("upc_ean", m_upcEan); properties.setAttribute("genre", QString::number(m_genre)); properties.setAttribute("performer", m_performer); properties.setAttribute("arranger", m_arranger); properties.setAttribute("songwriter", m_songwriter); properties.setAttribute("message", m_message); properties.setAttribute("currentsheetid", m_currentSheetId); properties.setAttribute("rate", m_rate); properties.setAttribute("bitdepth", m_bitDepth); properties.setAttribute("projectfileversion", PROJECT_FILE_VERSION); if (! istemplate) { properties.setAttribute("id", m_id); } else { properties.setAttribute("title", "Template Project File!!"); } properties.setAttribute("importdir", m_importDir); projectNode.appendChild(properties); doc.appendChild(projectNode); // Get the AudioSources Node, and append if (! istemplate) { projectNode.appendChild(m_resourcesManager->get_state(doc)); } // Get all the Sheets QDomNode sheetsNode = doc.createElement("Sheets"); foreach(Sheet* sheet, m_sheets) { sheetsNode.appendChild(sheet->get_state(doc, istemplate)); } projectNode.appendChild(sheetsNode); return projectNode; } void Project::set_title(const QString& title) { if (title == m_title) { // do nothing if the title is the same as the current one return; } if (pm().project_exists(title)) { info().critical(tr("Project with title '%1' allready exists, not setting new title!").arg(title)); return; } QString newrootdir = config().get_property("Project", "directory", "/directory/unknown/").toString() + "/" + title; QDir dir(m_rootDir); if ( ! dir.exists() ) { info().critical(tr("Project directory %1 no longer exists, did you rename it? " "Shame on you! Please undo that, and come back later to rename your Project...").arg(m_rootDir)); return; } m_title = title; save(); if (pm().rename_project_dir(m_rootDir, newrootdir) < 0 ) { return; } QMessageBox::information( 0, tr("Traverso - Information"), tr("Project title changed, Project will to be reloaded to ensure proper operation"), QMessageBox::Ok); pm().load_renamed_project(m_title); } void Project::set_engineer(const QString& pEngineer) { engineer=pEngineer; } void Project::set_description(const QString& des) { m_description = des; } void Project::set_discid(const QString& pId) { m_discid = pId; } void Project::set_performer(const QString& pPerformer) { m_performer = pPerformer; } void Project::set_arranger(const QString& pArranger) { m_arranger = pArranger; } void Project::set_songwriter(const QString& sw) { m_songwriter = sw; } void Project::set_message(const QString& pMessage) { m_message = pMessage; } void Project::set_upc_ean(const QString& pUpc) { m_upcEan = pUpc; } void Project::set_genre(int pGenre) { m_genre = pGenre; } bool Project::has_changed() { foreach(Sheet* sheet, m_sheets) { if(sheet->is_changed()) return true; } return false; } Command* Project::add_sheet(Sheet* sheet, bool historable) { PENTER; AddRemove* cmd; cmd = new AddRemove(this, sheet, historable, 0, "private_add_sheet(Sheet*)", "sheetAdded(Sheet*)", "private_remove_sheet(Sheet*)", "sheetRemoved(Sheet*)", tr("Sheet %1 added").arg(sheet->get_title())); cmd->set_instantanious(true); return cmd; } void Project::set_current_sheet(qint64 id) { PENTER; if (m_currentSheetId == id) { return; } Sheet* newcurrent = 0; foreach(Sheet* sheet, m_sheets) { if (sheet->get_id() == id) { newcurrent = sheet; break; } } if (!newcurrent) { info().information( tr("Sheet '%1' doesn't exist!").arg(id) ); emit currentSheetChanged(0); return; } m_currentSheetId=id; emit currentSheetChanged(newcurrent); } Sheet* Project::get_current_sheet() const { Sheet* current = 0; foreach(Sheet* sheet, m_sheets) { if (sheet->get_id() == m_currentSheetId) { current = sheet; break; } } return current; } Sheet* Project::get_sheet(qint64 id) const { Sheet* current = 0; foreach(Sheet* sheet, m_sheets) { if (sheet->get_id() == id) { current = sheet; break; } } return current; } Command* Project::remove_sheet(Sheet* sheet, bool historable) { AddRemove* cmd; cmd = new AddRemove(this, sheet, historable, 0, "private_remove_sheet(Sheet*)", "sheetRemoved(Sheet*)", "private_add_sheet(Sheet*)", "sheetAdded(Sheet*)", tr("Remove Sheet %1").arg(sheet->get_title())); cmd->set_instantanious(true); return cmd; } int Project::export_project(ExportSpecification* spec) { PENTER; if (!m_exportThread) { m_exportThread = new ExportThread(this); } if (m_exportThread->isRunning()) { info().warning(tr("Export already in progress, cannot start it twice!")); return -1; } QDir dir(spec->exportdir); if (!spec->exportdir.isEmpty() && !dir.exists()) { if (!dir.mkdir(spec->exportdir)) { info().warning(tr("Unable to create export directory! Please check permissions for this directory: %1").arg(spec->exportdir)); return -1; } } spec->progress = 0; spec->running = true; spec->stop = false; spec->breakout = false; m_exportThread->set_specification(spec); m_exportThread->start(); return 0; } int Project::start_export(ExportSpecification* spec) { PMESG("Starting export, rate is %d bitdepth is %d", spec->sample_rate, spec->data_width ); spec->blocksize = 32768; spec->dataF = new audio_sample_t[spec->blocksize * spec->channels]; audio_sample_t* readbuffer = new audio_sample_t[spec->blocksize * spec->channels]; overallExportProgress = renderedSheets = 0; sheetsToRender.clear(); if (spec->allSheets) { foreach(Sheet* sheet, m_sheets) { sheetsToRender.append(sheet); } } else { Sheet* sheet = get_current_sheet(); if (sheet) { sheetsToRender.append(sheet); } } foreach(Sheet* sheet, sheetsToRender) { PMESG("Starting export for sheet %lld", sheet->get_id()); emit exportStartedForSheet(sheet); spec->resumeTransport = false; spec->resumeTransportLocation = sheet->get_transport_location(); sheet->readbuffer = readbuffer; if (spec->normalize) { spec->peakvalue = 0.0; spec->renderpass = ExportSpecification::CALC_NORM_FACTOR; if (sheet->prepare_export(spec) < 0) { PERROR("Failed to prepare sheet for export"); continue; } while(sheet->render(spec) > 0) {} spec->normvalue = (1.0 - FLT_EPSILON) / spec->peakvalue; if (spec->peakvalue > 1.0) { info().critical(tr("Detected clipping in exported audio! (%1)") .arg(coefficient_to_dbstring(spec->peakvalue))); } if (!spec->breakout) { info().information(tr("calculated norm factor: %1").arg(coefficient_to_dbstring(spec->normvalue))); } } spec->renderpass = ExportSpecification::WRITE_TO_HARDDISK; if (sheet->prepare_export(spec) < 0) { PERROR("Failed to prepare sheet for export"); break; } while(sheet->render(spec) > 0) {} if (!QMetaObject::invokeMethod(sheet, "set_transport_pos", Qt::QueuedConnection, Q_ARG(TimeRef, spec->resumeTransportLocation))) { printf("Invoking Sheet::set_transport_pos() failed\n"); } if (spec->resumeTransport) { if (!QMetaObject::invokeMethod(sheet, "start_transport", Qt::QueuedConnection)) { printf("Invoking Sheet::start_transport() failed\n"); } } if (spec->breakout) { break; } renderedSheets++; } PMESG("Export Finished"); spec->running = false; overallExportProgress = 0; delete [] spec->dataF; delete [] readbuffer; spec->dataF = 0; emit exportFinished(); return 1; } int Project::create_cdrdao_toc(ExportSpecification* spec) { QList sheets; QString filename = spec->exportdir; if (spec->allSheets) { foreach(Sheet* sheet, m_sheets) { sheets.append(sheet); } // filename of the toc file is "project-name.toc" filename += get_title() + ".toc"; } else { Sheet* sheet = get_current_sheet(); if (!sheet) { return -1; } sheets.append(sheet); } QString output; output += "CD_DA\n\n"; output += "CD_TEXT {\n"; output += " LANGUAGE_MAP {\n 0 : EN\n }\n\n"; output += " LANGUAGE 0 {\n"; output += " TITLE \"" + get_title() + "\"\n"; output += " PERFORMER \"" + get_performer() + "\"\n"; output += " DISC_ID \"" + get_discid() + "\"\n"; output += " UPC_EAN \"" + get_upc_ean() + "\"\n\n"; output += " ARRANGER \"" + get_arranger() + "\"\n"; output += " SONGWRITER \"" + get_songwriter() + "\"\n"; output += " MESSAGE \"" + get_message() + "\"\n"; output += " GENRE \"" + QString::number(get_genre()) + "\"\n }\n}\n\n"; bool pregap = true; spec->renderpass = ExportSpecification::CREATE_CDRDAO_TOC; foreach(Sheet* sheet, sheets) { if (sheet->prepare_export(spec) < 0) { return -1; } output += sheet->get_cdrdao_tracklist(spec, pregap); pregap = false; // only add the pregap at the first sheet } if (spec->writeToc) { if (!spec->allSheets) { // filename of the toc file is "sheet-name.toc" filename += spec->basename + ".toc"; } spec->tocFileName = filename; QFile file(filename); if (file.open(QFile::WriteOnly)) { printf("Saving cdrdao toc-file to %s\n", QS_C(spec->tocFileName)); QTextStream out(&file); out << output; file.close(); } } spec->cdrdaoToc = output; return 1; } Command* Project::select() { int index = ie().collected_number(); if (index <= m_sheets.size() && index > 0) { set_current_sheet(m_sheets.at(index - 1)->get_id()); } return (Command*) 0; } int Project::get_rate( ) const { // FIXME: Projects should eventually just use the universal samplerate if (m_useResampling) { return audiodevice().get_sample_rate(); } return m_rate; } int Project::get_bitdepth( ) const { return m_bitDepth; } void Project::set_sheet_export_progress(int progress) { overallExportProgress = (progress / sheetsToRender.count()) + (renderedSheets * (100 / sheetsToRender.count()) ); emit sheetExportProgressChanged(progress); emit overallExportProgressChanged(overallExportProgress); } QList Project::get_sheets( ) const { return m_sheets; } int Project::get_sheet_index(qint64 id) const { for (int i=0; iget_id() == id) { return i + 1; } } return 0; } int Project::get_current_sheet_id( ) const { return m_currentSheetId; } int Project::get_num_sheets( ) const { return m_sheets.size(); } QString Project::get_title( ) const { return m_title; } QString Project::get_engineer( ) const { return engineer; } QString Project::get_description() const { return m_description; } QString Project::get_discid() const { return m_discid; } QString Project::get_performer() const { return m_performer; } QString Project::get_arranger() const { return m_arranger; } QString Project::get_songwriter() const { return m_songwriter; } QString Project::get_message() const { return m_message; } QString Project::get_upc_ean() const { return m_upcEan; } int Project::get_genre() { return m_genre; } QString Project::get_root_dir( ) const { return m_rootDir; } QString Project::get_audiosources_dir() const { return m_rootDir + "/audiosources/"; } ResourcesManager * Project::get_audiosource_manager( ) const { return m_resourcesManager; } void Project::private_add_sheet(Sheet * sheet) { PENTER; m_sheets.append(sheet); sheet->connect_to_audiodevice(); set_current_sheet(sheet->get_id()); } void Project::private_remove_sheet(Sheet * sheet) { PENTER; m_sheets.removeAll(sheet); if (m_sheets.isEmpty()) { m_currentSheetId = -1; } qint64 newcurrent = 0; if (m_sheets.size() > 0) { newcurrent = m_sheets.last()->get_id(); } set_current_sheet(newcurrent); sheet->disconnect_from_audiodevice(); } QString Project::get_import_dir() const { return m_importDir; } void Project::set_import_dir(const QString& dir) { m_importDir = dir; } bool Project::is_save_to_close() const { if (is_recording()) { QMessageBox::information( 0, tr("Traverso - Information"), tr("You're still recording, please stop recording first to be able to exit the application!"), QMessageBox::Ok); return false; } return true; } bool Project::is_recording() const { foreach(Sheet* sheet, m_sheets) { if (sheet->is_recording() && sheet->is_transport_rolling()) { return true; } } return false; } traverso-0.49.4/src/core/AudioSource.cpp000644 001750 001750 00000004474 11163362147 020441 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "AudioSource.h" #include "Sheet.h" #include "Peak.h" #include "Export.h" #include "Utils.h" // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" // QMutex mutex; // This constructor is called at file import or recording AudioSource::AudioSource(const QString& dir, const QString& name) : m_dir(dir) , m_name(name) , m_shortName(name) , m_wasRecording (false) { PENTERCONS; m_fileName = m_dir + m_name; m_id = create_id(); } // This constructor is called for existing (recorded/imported) audio sources AudioSource::AudioSource() : m_dir("") , m_name("") , m_fileName("") , m_wasRecording(false) { } AudioSource::~AudioSource() { PENTERDES; } void AudioSource::set_name(const QString& name) { m_name = name; if (m_wasRecording) { m_shortName = m_name.left(m_name.length() - 20); } else { m_shortName = m_name; } m_fileName = m_dir + m_name; } void AudioSource::set_dir(const QString& dir) { m_dir = dir; m_fileName = m_dir + m_name; } int AudioSource::get_rate( ) const { return m_rate; } void AudioSource::set_original_bit_depth( uint bitDepth ) { m_origBitDepth = bitDepth; } void AudioSource::set_created_by_sheet(qint64 id) { m_origSheetId = id; } QString AudioSource::get_filename( ) const { return m_fileName; } QString AudioSource::get_dir( ) const { return m_dir; } QString AudioSource::get_name( ) const { return m_name; } int AudioSource::get_bit_depth( ) const { return m_origBitDepth; } QString AudioSource::get_short_name() const { return m_shortName; } // eof traverso-0.49.4/src/core/AudioFileCopyConvert.cpp000644 001750 001750 00000012437 11163362147 022252 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "AudioFileCopyConvert.h" #include #include #include #include "Export.h" #include "AbstractAudioReader.h" #include "ProjectManager.h" #include "ResourcesManager.h" #include "ReadSource.h" #include "WriteSource.h" #include "Peak.h" #include "defines.h" AudioFileCopyConvert::AudioFileCopyConvert() { m_stopProcessing = false; moveToThread(this); start(); connect(this, SIGNAL(dequeueTask()), this, SLOT(dequeue_tasks()), Qt::QueuedConnection); } /** * Queues the ReadSource source to be copied. This function will take ownership of the ReadSource and takes care of 'deleting' it once the copy is finished!! * @param source * @param dir * @param outfilename * @param tracknumber * @param trackname */ void AudioFileCopyConvert::enqueue_task(ReadSource * source, ExportSpecification* spec, const QString& dir, const QString& outfilename, int tracknumber, const QString& trackname) { QFileInfo fi(outfilename); CopyTask task; task.readsource = source; task.outFileName = fi.completeBaseName(); task.extension = fi.suffix(); task.tracknumber = tracknumber; task.trackname = trackname; task.dir = dir; task.spec = spec; m_mutex.lock(); m_tasks.enqueue(task); m_mutex.unlock(); emit dequeueTask(); } void AudioFileCopyConvert::dequeue_tasks() { m_mutex.lock(); if (m_tasks.size()) { CopyTask task = m_tasks.dequeue(); m_mutex.unlock(); process_task(task); return; } m_mutex.unlock(); } void AudioFileCopyConvert::process_task(CopyTask task) { emit taskStarted(task.readsource->get_name()); uint buffersize = 16384; DecodeBuffer decodebuffer; task.spec->startLocation = TimeRef(); task.spec->endLocation = task.readsource->get_length(); task.spec->totalTime = task.spec->endLocation; task.spec->pos = TimeRef(); task.spec->isRecording = false; task.spec->exportdir = task.dir; task.spec->writerType = "sndfile"; task.spec->extraFormat["filetype"] = "wav"; task.spec->data_width = 1; // 1 means float task.spec->channels = task.readsource->get_channel_count(); task.spec->sample_rate = task.readsource->get_rate(); task.spec->blocksize = buffersize; task.spec->name = task.outFileName; task.spec->dataF = new audio_sample_t[buffersize * 2]; WriteSource* writesource = new WriteSource(task.spec); bool failedToPrepareWritesource = false; int oldprogress = 0; if (writesource->prepare_export() == -1) { failedToPrepareWritesource = true; goto out; } // Enable on the fly generation of peak data to speedup conversion // (no need to re-read all the audio files to generate peaks) writesource->set_process_peaks(true); do { // if the user asked to stop processing, jump out of this // loop, and cleanup any resources in use. if (m_stopProcessing) { goto out; } nframes_t diff = (task.spec->endLocation - task.spec->pos).to_frame(task.readsource->get_rate()); nframes_t this_nframes = std::min(diff, buffersize); nframes_t nframes = this_nframes; memset (task.spec->dataF, 0, sizeof (task.spec->dataF[0]) * nframes * task.spec->channels); task.readsource->file_read(&decodebuffer, task.spec->pos, nframes); for (uint x = 0; x < nframes; ++x) { for (int y = 0; y < task.spec->channels; ++y) { task.spec->dataF[y + x*task.spec->channels] = decodebuffer.destination[y][x]; } } // due the fact peak generating does _not_ happen in writesource->process // but in a function used by DiskIO, we have to hack the peak processing // in here. for (int y = 0; y < task.spec->channels; ++y) { writesource->get_peak()->process(y, decodebuffer.destination[y], nframes); } // Process the data, and write to disk writesource->process(buffersize); task.spec->pos.add_frames(nframes, task.readsource->get_rate()); int currentprogress = int(double(task.spec->pos.universal_frame()) / double(task.spec->totalTime.universal_frame()) * 100); if (currentprogress > oldprogress) { oldprogress = currentprogress; emit progress(currentprogress); } } while (task.spec->pos != task.spec->totalTime); out: if (!failedToPrepareWritesource) { writesource->finish_export(); } delete writesource; delete [] task.spec->dataF; resources_manager()->remove_source(task.readsource); // The user asked to stop processing, exit the event loop // and signal we're done. if (m_stopProcessing) { exit(0); wait(1000); m_tasks.clear(); emit processingStopped(); return; } emit taskFinished(task.dir + "/" + task.outFileName + ".wav", task.tracknumber, task.trackname); } void AudioFileCopyConvert::stop_merging() { m_stopProcessing = true; } traverso-0.49.4/src/core/SnapList.cpp000644 001750 001750 00000021446 11163362147 017752 0ustar00remonremon000000 000000 /* Copyright (C) 2006-2008 Nicola Doebelin, Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "SnapList.h" #include "Peak.h" #include "Sheet.h" #include "AudioClip.h" #include "AudioClipManager.h" #include "Config.h" #include "ContextPointer.h" #include "TimeLine.h" #include "Marker.h" #include #include //#define debugsnaplist #if defined(debugsnaplist) #define SLPRINT(args...) printf(args) #else #define SLPRINT(args...); #endif SnapList::SnapList(Sheet* sheet) : m_sheet(sheet) { m_isDirty = true; m_rangeStart = TimeRef(); m_rangeEnd = TimeRef(); m_scalefactor = 1; } void SnapList::mark_dirty() { // printf("mark_dirty()\n"); m_isDirty = true; m_wasDirty = true; } void SnapList::update_snaplist() { m_xposList.clear(); m_xposLut.clear(); m_xposBool.clear(); // collects all clip boundaries and adds them to the snap list QList acList = m_sheet->get_audioclip_manager()->get_clip_list(); SLPRINT("acList size is %d\n", acList.size()); // Be able to snap to trackstart if (m_rangeStart == qint64(0)) { m_xposList.append(TimeRef()); } for( int i = 0; i < acList.size(); i++ ) { AudioClip* clip = acList.at(i); if ( ! clip->is_snappable()) { continue; } TimeRef startlocation = clip->get_track_start_location(); TimeRef endlocation = clip->get_track_end_location(); if (startlocation > endlocation) { PERROR("clip xstart > xend, this must be a programming error!"); continue; // something wrong, ignore this clip } if (startlocation >= m_rangeStart && startlocation <= m_rangeEnd) { m_xposList.append(startlocation); } if (endlocation >= m_rangeStart && endlocation <= m_rangeEnd) { m_xposList.append(endlocation); } } // add all on-screen markers QList markerList = m_sheet->get_timeline()->get_markers(); for (int i = 0; i < markerList.size(); ++i) { if (markerList.at(i)->is_snappable() && markerList.at(i)->get_when() >= m_rangeStart && markerList.at(i)->get_when() <= m_rangeEnd) { m_xposList.append(markerList.at(i)->get_when()); } } // add the working cursor's position TimeRef worklocation = m_sheet->get_work_location(); //printf("worklocation xpos is %d\n", worklocation / m_scalefactor); if (m_sheet->get_work_snap()->is_snappable() && worklocation >= m_rangeStart && worklocation <= m_rangeEnd) { m_xposList.append(m_sheet->get_work_location()); } // sort the list qSort(m_xposList); int range = (int)((m_rangeEnd - m_rangeStart) / m_scalefactor); // create a linear lookup table for (int i = 0; i <= range; ++i) { m_xposLut.push_back(TimeRef()); m_xposBool.push_back(false); } TimeRef lastVal; long lastIndex = -1; // now modify the regions around snap points in the lookup table for (int i = 0; i < m_xposList.size(); i++) { if (lastIndex > -1 && m_xposList.at(i) == lastVal) { continue; // check for duplicates and skip them } // check if neighbouring snap regions overlap. // if yes, reduce snap-range to keep the border in the middle int snaprange = config().get_property("Snap", "range", 10).toInt(); int ls = - snaprange; if (lastIndex > -1) { if ( (m_xposList.at(i) - lastVal) < (2 * snaprange * m_scalefactor) ) { ls = - (int) ((m_xposList.at(i) / m_scalefactor - lastVal / m_scalefactor) / 2); } } for (int j = ls; j <= snaprange; j++) { int pos = (int)((m_xposList.at(i) - m_rangeStart) / m_scalefactor + j); // index in the LUT if (pos < 0) { continue; } if (pos >= m_xposLut.size()) { break; } m_xposLut[pos] = m_xposList.at(i); m_xposBool[pos] = true; } lastVal = m_xposList.at(i); lastIndex = i; } m_isDirty = false; } // public function that checks if there is a snap position // within +- snap-range of the supplied value i TimeRef SnapList::get_snap_value(const TimeRef& pos) { if (m_isDirty) { update_snaplist(); } int i = (int)((pos - m_rangeStart) / m_scalefactor); SLPRINT("get_snap_value:: i is %d\n", i); // catch dangerous values: if (i < 0) { SLPRINT("get_snap_value:: i < 0\n"); return pos; } if (m_xposLut.isEmpty()) { SLPRINT("get_snap_value:: empty lut\n"); return pos; } if (i >= m_xposLut.size()) { SLPRINT("get_snap_value:: i > m_xposLut.size()\n"); return pos; } if (is_snap_value(pos)) { SLPRINT("get_snap_value returns: %d (was %d)\n", m_xposLut.at(i), pos); return m_xposLut.at(i); } SLPRINT("get_snap_value returns: %d (was %d)\n", pos, pos); return pos; } // returns true if i is inside a snap area, else returns false bool SnapList::is_snap_value(const TimeRef& pos) { if (m_isDirty) { update_snaplist(); } int i = (int)((pos - m_rangeStart) / m_scalefactor); SLPRINT("is_snap_value:: i is %d\n", i); // need to catch values outside the LUT. Return false in that case if (i < 0) { return false; } if (i >= m_xposBool.size()) { return false; } SLPRINT("is_snap_value returns: %d\n", m_xposBool.at(i)); return m_xposBool.at(i); } // returns the difference between the unsnapped and snapped location. // The return value is negative if the supplied value is < snapped value qint64 SnapList::get_snap_diff(const TimeRef& pos) { if (m_isDirty) { update_snaplist(); } int i = (int)((pos - m_rangeStart) / m_scalefactor); SLPRINT("get_snap_diff:: i is %d\n", i); // need to catch values outside the LUT. Return 0 in that case if (i < 0) { return 0; } if (i >= m_xposLut.size()) { return 0; } SLPRINT("get_snap_diff returns: %d\n", m_xposLut.at(i)); return (pos - m_xposLut.at(i)).universal_frame(); } void SnapList::set_range(const TimeRef& start, const TimeRef& end, int scalefactor) { SLPRINT("setting xstart %d, xend %d scalefactor %d\n", start, end, scalefactor); if (m_rangeStart == start && m_rangeEnd == end && m_scalefactor == scalefactor) { return; } m_rangeStart = start; m_rangeEnd = end; m_scalefactor = scalefactor; m_isDirty = true; }; TimeRef SnapList::next_snap_pos(const TimeRef& pos) { if (m_isDirty) { update_snaplist(); } int index = (int)(pos / m_scalefactor); if (pos < TimeRef()) { PERROR("pos < 0"); return TimeRef(); } if (index > m_xposLut.size()) { index = m_xposLut.size() - 1; } TimeRef newpos = pos; for (; index pos) { newpos = snap; break; } } return newpos; } TimeRef SnapList::prev_snap_pos(const TimeRef& pos) { if (m_isDirty) { update_snaplist(); } if (pos < TimeRef()) { PERROR("pos < 0"); return TimeRef(); } if (! m_xposLut.size()) { return pos; } int index = (int)(pos / m_scalefactor); if (index > m_xposLut.size()) { index = m_xposLut.size() - 1; } TimeRef newpos = pos; do { TimeRef snap = m_xposLut.at(index); if (snap < pos && snap != TimeRef()) { newpos = snap; break; } index--; } while (index >= 0); if (index == -1) { return TimeRef(); } if (newpos == pos) { return pos; } return newpos; } TimeRef SnapList::calculate_snap_diff(TimeRef leftlocation, TimeRef rightlocation) { // "nframe_t" domain, but must be signed ints because they can become negative qint64 snapStartDiff = 0; qint64 snapEndDiff = 0; qint64 snapDiff = 0; // check if there is anything to snap bool start_snapped = false; bool end_snapped = false; if (is_snap_value(leftlocation)) { start_snapped = true; } if (is_snap_value(rightlocation)) { end_snapped = true; } if (start_snapped) { snapStartDiff = get_snap_diff(leftlocation); snapDiff = snapStartDiff; // in case both ends snapped, change this value later, else leave it } if (end_snapped) { snapEndDiff = get_snap_diff(rightlocation); snapDiff = snapEndDiff; // in case both ends snapped, change this value later, else leave it } // If both snapped, check which one is closer. Do not apply this check if one of the // ends hasn't snapped, because it's diff value will be 0 by default and will always // be smaller than the actually snapped value. if (start_snapped && end_snapped) { if (abs(snapEndDiff) > abs(snapStartDiff)) snapDiff = snapStartDiff; else snapDiff = snapEndDiff; } return TimeRef(snapDiff); } bool SnapList::was_dirty() { bool ret = m_wasDirty; m_wasDirty = false; return ret; } traverso-0.49.4/src/core/ProjectConverter.h000644 001750 001750 00000003557 11163362147 021163 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef PROJECT_CONVERTER_H #define PROJECT_CONVERTER_H #include #include #include #include class AudioFileMerger; class ReadSource; class ProjectConverter : public QObject { Q_OBJECT public: ProjectConverter(); void set_project(const QString& rootdir, const QString& name); int start(); void stop_conversion(); QString get_conversion_description(); private: QHash m_readsources; AudioFileMerger* m_merger; int m_filesToMerge; int m_filesMerged; QDomDocument m_document; QString m_rootdir; QString m_projectname; int m_projectfileversion; int save_converted_document(); int start_conversion_from_version_2_to_3(); private slots: void conversion_finished(); void file_merge_started(QString file); void file_merge_finished(QString file); void finish_2_3_conversion(); void processing_stopped(); signals: void progress(int); void actionProgressInfo(QString); void fileMergeStarted(QString file); void fileMergeFinished(QString file); void conversionFinished(); void message(QString); }; #endif traverso-0.49.4/src/core/ReadSource.h000644 001750 001750 00000006203 11163362147 017710 0ustar00remonremon000000 000000 /* Copyright (C) 2006-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef READSOURCE_H #define READSOURCE_H #include "AudioSource.h" #include class ResampleAudioReader; class AudioClip; struct BufferStatus; class DecodeBuffer; class DiskIO; class ReadSource : public AudioSource { Q_OBJECT public : ReadSource(const QDomNode node); ReadSource(const QString& dir, const QString& name); ReadSource(const QString& dir, const QString& name, int channelCount); ReadSource(); // For creating a 0-channel, silent ReadSource ~ReadSource(); enum ReadSourceError { COULD_NOT_OPEN_FILE = -1, INVALID_CHANNEL_COUNT = -2, ZERO_CHANNELS = -3, FILE_DOES_NOT_EXIST = -4 }; ReadSource* deep_copy(); int set_state( const QDomNode& node ); QDomNode get_state(QDomDocument doc); int rb_read(audio_sample_t** dest, TimeRef& start, nframes_t cnt); void rb_seek_to_file_position(TimeRef& position); int file_read(DecodeBuffer* buffer, const TimeRef& start, nframes_t cnt) const; int file_read(DecodeBuffer* buffer, nframes_t start, nframes_t cnt); int init(); int get_error() const {return m_error;} QString get_error_string() const; int set_file(const QString& filename); void set_active(bool active); void set_audio_clip(AudioClip* clip); void set_diskio(DiskIO* diskio); nframes_t get_nframes() const; int get_file_rate() const; int get_output_rate() const {return m_outputRate;} const TimeRef& get_length() const {return m_length;} void sync(DecodeBuffer* buffer); void process_ringbuffer(DecodeBuffer* buffer, bool seeking=false); void prepare_rt_buffers(); BufferStatus* get_buffer_status(); void set_output_rate(int rate); private: ResampleAudioReader* m_audioReader; AudioClip* m_clip; DiskIO* m_diskio; int m_refcount; int m_error; bool m_silent; TimeRef m_rbFileReadPos; TimeRef m_rbRelativeFileReadPos; TimeRef m_syncPos; volatile size_t m_rbReady; volatile size_t m_needSync; volatile size_t m_active; volatile size_t m_wasActivated; volatile size_t m_bufferUnderRunDetected; bool m_syncInProgress; mutable TimeRef m_length; QString m_decodertype; int m_outputRate; BufferStatus* m_bufferstatus; int ref() { return m_refcount++;} void private_init(); void start_resync(TimeRef& position); void finish_resync(); int rb_file_read(DecodeBuffer* buffer, nframes_t cnt); friend class ResourcesManager; friend class ProjectConverter; signals: void stateChanged(); }; #endif traverso-0.49.4/src/core/Project.h000644 001750 001750 00000010106 11163362147 017257 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef PROJECT_H #define PROJECT_H #include #include #include #include "ContextItem.h" class Sheet; class ResourcesManager; struct ExportSpecification; class ExportThread; class Project : public ContextItem { Q_OBJECT public : ~Project(); // Get functions int get_current_sheet_id() const; int get_num_sheets() const; int get_rate() const; int get_bitdepth() const; ResourcesManager* get_audiosource_manager() const; QString get_title() const; QString get_engineer() const; QString get_description() const; QString get_discid() const; QString get_performer() const; QString get_arranger() const; QString get_songwriter() const; QString get_message() const; QString get_upc_ean() const; int get_genre(); QString get_root_dir() const; QString get_audiosources_dir() const; QString get_import_dir() const; QString get_error_string() const {return m_errorString;} QList get_sheets() const; Sheet* get_current_sheet() const ; Sheet* get_sheet(qint64 id) const; int get_sheet_index(qint64 id) const; QDomNode get_state(QDomDocument doc, bool istemplate=false); // Set functions void set_title(const QString& title); void set_engineer(const QString& pEngineer); void set_description(const QString& des); void set_discid(const QString& pId); void set_performer(const QString& pPerformer); void set_arranger(const QString& pArranger); void set_songwriter(const QString& sw); void set_message(const QString& pMessage); void set_upc_ean(const QString& pUPC); void set_genre(int pGenre); void set_sheet_export_progress(int pogress); void set_current_sheet(qint64 id); void set_import_dir(const QString& dir); Command* add_sheet(Sheet* sheet, bool historable=true); Command* remove_sheet(Sheet* sheet, bool historable=true); bool has_changed(); bool is_save_to_close() const; bool is_recording() const; int save(bool autosave=false); int load(QString projectfile = ""); int export_project(ExportSpecification* spec); int start_export(ExportSpecification* spec); int create_cdrdao_toc(ExportSpecification* spec); enum { SETTING_XML_CONTENT_FAILED = -1, PROJECT_FILE_COULD_NOT_BE_OPENED = -2, PROJECT_FILE_VERSION_MISMATCH = -3 }; public slots: Command* select(); private: Project(const QString& title); QList m_sheets; ResourcesManager* m_resourcesManager; ExportThread* m_exportThread; QString m_title; QString m_rootDir; QString m_sourcesDir; QString engineer; QString m_description; QString m_importDir; QString m_discid; int m_genre; QString m_upcEan; QString m_performer; QString m_arranger; QString m_songwriter; QString m_message; QString m_errorString; int m_rate; int m_bitDepth; bool m_useResampling; int overallExportProgress; int renderedSheets; QList sheetsToRender; qint64 m_currentSheetId; int create(int sheetcount, int numtracks); int create_audiosources_dir(); int create_peakfiles_dir(); friend class ProjectManager; private slots: void private_add_sheet(Sheet* sheet); void private_remove_sheet(Sheet* sheet); signals: void currentSheetChanged(Sheet* ); void sheetAdded(Sheet*); void sheetRemoved(Sheet*); void sheetExportProgressChanged(int ); void overallExportProgressChanged(int ); void exportFinished(); void exportStartedForSheet(Sheet* ); void projectLoadFinished(); }; #endif traverso-0.49.4/src/core/ProjectManager.cpp000755 001750 001750 00000041473 11163362147 021123 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2006 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "ProjectManager.h" #include #include #include #include #include #include #include #include "Project.h" #include "Sheet.h" #include "ContextPointer.h" #include "ResourcesManager.h" #include "Information.h" #include "Config.h" #include "FileHelpers.h" #include #include // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" /** \class ProjectManager \brief ProjectManager is a singleton used for loading, creating and deleting Projects. */ QUndoGroup ProjectManager::undogroup; ProjectManager::ProjectManager() : ContextItem() { PENTERCONS; currentProject = (Project*) 0; m_exitInProgress = false; m_watcher = new QFileSystemWatcher(0); QString path = config().get_property("Project", "directory", "").toString(); set_current_project_dir(path); cpointer().add_contextitem(this); connect(m_watcher, SIGNAL(directoryChanged(const QString&)), this, SLOT(project_dir_rename_detected(const QString&))); } /** * Used to get a reference to the ProjectManager * @return A reference to the ProjectManager singleton */ ProjectManager& pm() { static ProjectManager projMan; return projMan; } /** * The Resources Manager for the currently loaded Project * @return A pointer to the Resources Manager of the loaded Project, 0 if no Project is loaded */ ResourcesManager* resources_manager() { Project* proj = pm().get_project(); if (proj) { return proj->get_audiosource_manager(); } return 0; } void ProjectManager::set_current_project(Project* project) { PENTER; emit projectLoaded(project); QString oldprojectname = ""; if (currentProject) { if (m_exitInProgress) { QString oncloseaction = config().get_property("Project", "onclose", "save").toString(); if (oncloseaction == "save") { currentProject->save(); } else if (oncloseaction == "ask") { if (QMessageBox::question(0, tr("Save Project"), tr("Do you want to save the Project before quiting?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes) == QMessageBox::Yes) { currentProject->save(); } } } else { currentProject->save(); } oldprojectname = currentProject->get_title(); delete currentProject; } currentProject = project; QString title = ""; if (currentProject) { title = currentProject->get_title(); config().set_property("Project", "current", title); } if ( ! oldprojectname.isEmpty() ) { cleanup_backupfiles_for_project(oldprojectname); } } Project* ProjectManager::create_new_project(int numSheets, int numTracks, const QString& projectName) { PENTER; if (project_exists(projectName)) { info().critical(tr("Project %1 already exists!").arg(projectName)); return 0; } QString newrootdir = config().get_property("Project", "directory", "/directory/unknown/").toString() + "/" + projectName; m_projectDirs.append(newrootdir); Project* newProject = new Project(projectName); if (newProject->create(numSheets, numTracks) < 0) { delete newProject; info().critical(tr("Unable to create new Project %1").arg(projectName)); return 0; } return newProject; } Project* ProjectManager::create_new_project(const QString& templatefile, const QString& projectName) { if (project_exists(projectName)) { info().critical(tr("Project %1 already exists!").arg(projectName)); return 0; } QString newrootdir = config().get_property("Project", "directory", "/directory/unknown/").toString() + "/" + projectName; m_projectDirs.append(newrootdir); Project* newProject = new Project(projectName); if (newProject->create(0, 0) < 0) { delete newProject; info().critical(tr("Unable to create new Project %1").arg(projectName)); return 0; } if (newProject->load(templatefile) < 0) { return 0; } // title gets overwritten in newProject->load() newProject->set_title(projectName); return newProject; } int ProjectManager::load_project(const QString& projectName) { PENTER; if( ! project_exists(projectName) ) { PERROR("project %s doesn't exist!", projectName.toAscii().data()); return -1; } Project* newProject = new Project(projectName); if (!newProject) return -1; set_current_project(newProject); int err; if ((err = currentProject->load()) < 0) { switch (err) { case Project::PROJECT_FILE_VERSION_MISMATCH: { emit projectFileVersionMismatch(currentProject->get_root_dir(), currentProject->get_title()); break; } default: { emit projectLoadFailed(currentProject->get_title(), currentProject->get_error_string()); } } delete currentProject; currentProject = 0; set_current_project(0); info().critical(tr("Unable to load Project %1").arg(projectName)); return -1; } return 1; } int ProjectManager::load_renamed_project(const QString & name) { Q_ASSERT(currentProject); delete currentProject; currentProject= 0; return load_project(name); } int ProjectManager::remove_project( const QString& name ) { // check if we are removing the currentProject, and delete it before removing its files if (project_is_current(name)) { PMESG("removing current project\n"); set_current_project(0); } QString oldrootdir = config().get_property("Project", "directory", "/directory/unknown/").toString() + "/" + name; m_projectDirs.removeAll(oldrootdir); return FileHelper::remove_recursively( name ); } bool ProjectManager::project_is_current(const QString& title) { QString path = config().get_property("Project", "directory", "/directory/unknown").toString(); path += "/" + title; if (currentProject && (currentProject->get_root_dir() == path)) { return true; } return false; } bool ProjectManager::project_exists(const QString& title) { QString project_dir = config().get_property("Project", "directory", "/directory/unknown").toString(); QString project_path = project_dir + "/" + title; QFileInfo fileInfo(project_path); if (fileInfo.exists()) { return true; } return false; } Command* ProjectManager::save_project() { if (currentProject) { currentProject->save(); } else { info().information( tr("No Project to save, open or create a Project first!")); } return (Command*) 0; } Project * ProjectManager::get_project( ) { return currentProject; } void ProjectManager::start() { QString projectsPath = config().get_property("Project", "directory", "/unknown/directory/").toString(); QDir dir; if ( (projectsPath.isEmpty()) || (!dir.exists(projectsPath)) ) { if (projectsPath.isEmpty()) { projectsPath = QDir::homePath(); } QString newPath = QFileDialog::getExistingDirectory(0, tr("Choose a directory to store your Projects in"), projectsPath ); if (newPath.isEmpty()) { QMessageBox::warning( 0, tr("Traverso - Warning"), tr("No directory was selected, to retry open the 'Open Project Dialog' and " "click 'Select Project Directory' button\n")); return; } QFileInfo fi(newPath); if (dir.exists(newPath) && !fi.isWritable()) { QMessageBox::warning( 0, tr("Traverso - Warning"), tr("This directory is not writable by you! \n") + tr("Please check permission for this directory or " "choose another one:\n\n %1").arg(newPath) ); return; } if (dir.exists(newPath)) { info().information(tr("Using existing Project directory: %1\n").arg(newPath)); } else if (!dir.mkpath(newPath)) { QMessageBox::warning( 0, tr("Traverso - Warning"), tr("Unable to create Project directory! \n") + tr("Please check permission for this directory: %1").arg(newPath) ); return; } else { info().information(tr("Created new Project directory for you here: %1\n").arg(newPath)); } QDir newdir(newPath); config().set_property("Project", "directory", newdir.canonicalPath()); } bool loadProjectAtStartUp = config().get_property("Project", "loadLastUsed", 1).toBool(); if (loadProjectAtStartUp) { QString projectToLoad = config().get_property("Project", "current", "").toString(); if (projectToLoad.isNull() || projectToLoad.isEmpty()) { projectToLoad="Untitled"; } if (project_exists(projectToLoad)) { load_project(projectToLoad); } else { if (projectToLoad != "Untitled") { info().critical(tr("Project %1 no longer could be found! (Did you remove or rename the Project directory ?)").arg(projectToLoad)); } else { Project* project; if ( (project = create_new_project(1, 4, "Untitled")) ) { project->set_description(tr("Default Project created by Traverso")); project->save(); delete project; load_project("Untitled"); } else { PWARN("Cannot create project Untitled. Continuing anyway..."); } } } } else { set_current_project(0); } } void ProjectManager::start(const QString & basepath, const QString & projectname) { config().set_property("Project", "directory", basepath); if (project_exists(projectname)) { load_project(projectname); } } QUndoGroup* ProjectManager::get_undogroup() const { return &undogroup; } Command* ProjectManager::exit() { PENTER; if (currentProject) { if (currentProject->get_sheets().size() == 0) { // No sheets to unregister from the audiodevice, // just save and quit: set_current_project(0); QApplication::exit(); return 0; } else if (currentProject->is_save_to_close()) { m_exitInProgress = true; set_current_project(0); } else { return 0; } } else { QApplication::exit(); } return (Command*) 0; } void ProjectManager::scheduled_for_deletion( Sheet * sheet ) { PENTER; m_deletionSheetList.append(sheet); } void ProjectManager::delete_sheet( Sheet * sheet ) { PENTER; m_deletionSheetList.removeAll(sheet); emit aboutToDelete(sheet); delete sheet; if (m_deletionSheetList.isEmpty() && m_exitInProgress) { QApplication::exit(); } } Command* ProjectManager::undo() { undogroup.undo(); return 0; } Command* ProjectManager::redo() { undogroup.redo(); return 0; } int ProjectManager::rename_project_dir(const QString & olddir, const QString & newdir) { QDir dir(olddir); m_projectDirs.removeAll(olddir); m_projectDirs.append(newdir); if ( ! dir.rename(olddir, newdir)) { info().critical(tr("Could not rename Project directory to %1").arg(newdir)); return - 1; } return 1; } void ProjectManager::set_current_project_dir(const QString & path) { if (path.isEmpty()) { return; } QDir newdir(path); config().set_property("Project", "directory", newdir.canonicalPath()); QStringList list = newdir.entryList(QDir::Dirs | QDir::NoDotAndDotDot); m_projectDirs.clear(); foreach(const QString &string, list) { m_projectDirs += path + "/" + string; } m_watcher->addPath(path); emit projectDirChangeDetected(); } void ProjectManager::project_dir_rename_detected(const QString & dirname) { Q_UNUSED(dirname); emit projectDirChangeDetected(); QString path = config().get_property("Project", "directory", "").toString(); QDir dir(path); QStringList list = dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot); bool startwhining = false; foreach(const QString &string, list) { if (!m_projectDirs.contains(path + "/" + string)) { startwhining = true; break; } } if (!startwhining) { return; } emit unsupportedProjectDirChangeDetected(); } void ProjectManager::add_valid_project_path(const QString & path) { m_projectDirs.append(path); } void ProjectManager::remove_wrong_project_path(const QString & path) { m_projectDirs.removeAll(path); } void ProjectManager::start_incremental_backup(const QString& projectname) { if (! project_exists(projectname)) { return; } QString project_dir = config().get_property("Project", "directory", "/directory/unknown").toString(); QString project_path = project_dir + "/" + projectname; QString fileName = project_path + "/project.tpf"; QString backupdir = project_path + "/projectfilebackup"; // Check if the projectfilebackup directory still exist QDir dir(backupdir); if (!dir.exists(backupdir)) { create_projectfilebackup_dir(project_path); } QFile reader(fileName); if (!reader.open(QIODevice::ReadOnly)) { info().warning(tr("Projectfile backup: The project file %1 could not be opened for reading (Reason: %2)").arg(fileName).arg(reader.errorString())); return; } QDateTime time = QDateTime::currentDateTime(); QString writelocation = backupdir + "/" + time.toString() + "__" + QString::number(time.toTime_t()); QFile compressedWriter(writelocation); if (!compressedWriter.open( QIODevice::WriteOnly ) ) { compressedWriter.close(); return; } QByteArray array = reader.readAll(); QByteArray compressed = qCompress(array, 9); QDataStream stream(&compressedWriter); stream << compressed; compressedWriter.close(); } void ProjectManager::cleanup_backupfiles_for_project(const QString & projectname) { if (! project_exists(projectname)) { return; } QString project_dir = config().get_property("Project", "directory", "/directory/unknown").toString(); QString project_path = project_dir + "/" + projectname; QString backupdir = project_path + "/projectfilebackup"; // Check if the projectfilebackup directory still exist QDir dir(backupdir); // A map to insert files based on their time value, // so it's sorted on date automatically QMap map; QStringList entrylist = dir.entryList(QDir::Files); // If there are more then 1000 saves, remove the last 200! if (entrylist.size() > 1000) { printf("more then thousand backup files, deleting oldest 200\n"); int key; foreach (QString file, dir.entryList(QDir::Files)) { key = file.right(10).toUInt(); map.insert(key, file); } QList tobedeleted = map.values(); if (tobedeleted.size() < 201) { return; } for(int i=0; i<200; ++i) { QFile file(backupdir + "/" + tobedeleted.at(i)); if ( ! file.remove() ) { printf("Could not remove file %s (Reason: %s)\n", QS_C(tobedeleted.at(i)), QS_C(FileHelper::fileerror_to_string(file.error()))); } } } } int ProjectManager::restore_project_from_backup(const QString& projectname, uint restoretime) { if (! project_exists(projectname)) { return -1; } QString project_dir = config().get_property("Project", "directory", "/directory/unknown").toString(); QString project_path = project_dir + "/" + projectname; QString backupDir = project_path + "/projectfilebackup"; if (currentProject) { currentProject->save(); set_current_project(0); delete currentProject; currentProject = 0; } QString fileName = project_path + "/project.tpf"; QDir dir(backupDir); QString backupfile; foreach (QString backup, dir.entryList(QDir::Files)) { if (backup.right(10).toUInt() == restoretime) { backupfile = backupDir + "/" + backup; printf("backupfile %s\n", QS_C(backupfile)); break; } } QFile reader(backupfile); if (!reader.open(QIODevice::ReadOnly)) { // reader.close(); return -1; } QFile writer(fileName); if (!writer.open( QIODevice::WriteOnly | QIODevice::Text) ) { PERROR("Could not open %s for writing!", QS_C(fileName)); writer.close(); return -1; } QDataStream dataIn(&reader); QByteArray compByteArray; dataIn >> compByteArray; QByteArray a = qUncompress(compByteArray); QTextStream stream(&writer); stream << a; writer.close(); return 1; } QList< uint > ProjectManager::get_backup_date_times(const QString& projectname) { if (! project_exists(projectname)) { return QList(); } QString project_dir = config().get_property("Project", "directory", "/directory/unknown").toString(); QString backupDir = project_dir + "/" + projectname + "/projectfilebackup"; QList dateList; QDir dir(backupDir); foreach (QString filename, dir.entryList(QDir::Files)) { bool ok; uint date = filename.right(10).toUInt(&ok); if (ok) { dateList.append(date); } else { printf("filename: %s is not backupfile made by Traverso, removing it!\n", QS_C(filename)); QFile::remove(backupDir + "/" + filename); } } return dateList; } int ProjectManager::create_projectfilebackup_dir(const QString& rootDir) { QDir dir; QString path = rootDir + "/projectfilebackup/"; if (dir.mkdir(path) < 0) { info().critical(tr("Cannot create dir %1").arg(path)); return -1; } return 1; } traverso-0.49.4/src/core/ProjectManager.h000644 001750 001750 00000006512 11163362147 020560 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2006 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef ProjectManager_H #define ProjectManager_H #include "ContextItem.h" #include #include #include #include class Project; class Sheet; class Command; class ResourcesManager; class QFileSystemWatcher; class ProjectManager : public ContextItem { Q_OBJECT Q_CLASSINFO("save_project", tr("Save Project")) Q_CLASSINFO("exit", tr("Exit application")) public: Project* create_new_project(int numSheet, int numTracks, const QString& projectName); Project* create_new_project(const QString& templatefile, const QString& projectName); int load_project(const QString& projectName); int load_renamed_project(const QString& name); bool project_exists(const QString& title); int create_projectfilebackup_dir(const QString& rootDir); int remove_project(const QString& title); void scheduled_for_deletion(Sheet* sheet); void delete_sheet(Sheet* sheet); void set_current_project_dir(const QString& path); void add_valid_project_path(const QString& path); void remove_wrong_project_path(const QString& path); int rename_project_dir(const QString& olddir, const QString& newdir); int restore_project_from_backup(const QString& projectdir, uint restoretime); QList get_backup_date_times(const QString& projectdir); void start_incremental_backup(const QString& projectname); Project* get_project(); QUndoGroup* get_undogroup() const; void start(); void start(const QString& basepath, const QString& projectname); public slots: Command* save_project(); Command* exit(); Command* undo(); Command* redo(); private: ProjectManager(); ProjectManager(const ProjectManager&); Project* currentProject; QList m_deletionSheetList; bool m_exitInProgress; QStringList m_projectDirs; QFileSystemWatcher* m_watcher; bool clientRequestInProgress; static QUndoGroup undogroup; void set_current_project(Project* project); void cleanup_backupfiles_for_project(const QString& projectname); bool project_is_current(const QString& title); // allow this function to create one instance friend ProjectManager& pm(); signals: void projectLoaded(Project* ); void aboutToDelete(Sheet* ); void currentProjectDirChanged(); void unsupportedProjectDirChangeDetected(); void projectDirChangeDetected(); void projectLoadFailed(QString,QString); void projectFileVersionMismatch(QString,QString); private slots: void project_dir_rename_detected(const QString& dirname); }; // use this function to access the ProjectManager ProjectManager& pm(); // Use this function to get the loaded Project's Resources Manager ResourcesManager* resources_manager(); #endif traverso-0.49.4/src/core/AudioClip.h000644 001750 001750 00000012433 11163362147 017527 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2008 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef AUDIOCLIP_H #define AUDIOCLIP_H #include #include #include #include "ContextItem.h" #include "AudioProcessingItem.h" #include "Snappable.h" #include "defines.h" #include "GainEnvelope.h" class Sheet; class ReadSource; class WriteSource; class Track; class Peak; class AudioBus; class FadeCurve; class PluginChain; class AudioClip : public ContextItem, public AudioProcessingItem, public Snappable { Q_OBJECT Q_CLASSINFO("mute", tr("Mute")) Q_CLASSINFO("reset_fade_in", tr("In: Remove")) Q_CLASSINFO("reset_fade_out", tr("Out: Remove")) Q_CLASSINFO("reset_fade_both", tr("Both: Remove")) Q_CLASSINFO("normalize", tr("Normalize")) Q_CLASSINFO("lock", tr("Lock")) public: AudioClip(const QString& name); AudioClip(const QDomNode& node); ~AudioClip(); enum RecordingStatus { NO_RECORDING, RECORDING, FINISHING_RECORDING }; void set_audio_source(ReadSource* source); int init_recording(QByteArray bus); int process(nframes_t nframes); void set_track_start_location(const TimeRef& location); void set_name(const QString& name); void set_fade_in(double range); void set_fade_out(double range); void set_track(Track* track); void set_sheet(Sheet* sheet); void set_selected(bool selected); void set_as_moving(bool moving); int set_state( const QDomNode& node ); AudioClip* create_copy(); Track* get_track() const; Sheet* get_sheet() const; Peak* get_peak() const {return m_peak;} QDomNode get_state(QDomDocument doc); FadeCurve* get_fade_in() const; FadeCurve* get_fade_out() const; PluginChain* get_plugin_chain() const {return m_pluginChain;} TimeRef get_source_length() const; TimeRef get_length() const {return m_length;} TimeRef get_track_start_location() const {return m_trackStartLocation;} TimeRef get_track_end_location() const {return m_trackEndLocation;} TimeRef get_source_start_location() const {return m_sourceStartLocation;} TimeRef get_source_end_location() const {return m_sourceEndLocation;} int get_channels() const; int get_rate() const; int get_bitdepth() const; qint64 get_readsource_id() const; qint64 get_sheet_id() const {return m_sheetId;} ReadSource* get_readsource() const; QString get_name() const; QDomNode get_dom_node() const; bool is_take() const; bool is_selected(); bool is_locked() const {return m_isLocked;} bool has_sheet() const; bool is_readsource_invalid() const {return !m_isReadSourceValid;} bool is_smaller_then(APILinkedListNode* node) {return ((AudioClip*)node)->get_track_start_location() > get_track_start_location();} bool is_moving() const {return m_isMoving;} int recording_state() const; private: Track* m_track; Sheet* m_sheet; ReadSource* m_readSource; WriteSource* m_recorder; APILinkedList m_fades; Peak* m_peak; AudioBus* m_captureBus; FadeCurve* fadeIn; FadeCurve* fadeOut; QDomNode m_domNode; QString m_name; QByteArray m_captureBusName; TimeRef m_trackStartLocation; TimeRef m_trackEndLocation; TimeRef m_sourceEndLocation; TimeRef m_sourceStartLocation; TimeRef m_sourceLength; TimeRef m_length; bool m_isTake; bool m_isLocked; bool m_isReadSourceValid; bool m_isMoving; RecordingStatus m_recordingStatus; qint64 m_readSourceId; qint64 m_sheetId; void create_fade_in(); void create_fade_out(); void init(); void set_source_end_location(const TimeRef& location); void set_source_start_location(const TimeRef& location); void set_track_end_location(const TimeRef& location); void set_sources_active_state(); void process_capture(nframes_t nframes); float calculate_normalization_factor(float targetdB = 0.0); friend class ResourcesManager; signals: void stateChanged(); void muteChanged(); void lockChanged(); void positionChanged(); void fadeAdded(FadeCurve*); void fadeRemoved(FadeCurve*); void recordingFinished(AudioClip*); public slots: void finish_recording(); void finish_write_source(); void set_left_edge(TimeRef newLeftLocation); void set_right_edge(TimeRef newRightLocation); void track_audible_state_changed(); void toggle_mute(); void toggle_lock(); void set_gain(float g); float get_gain() const; Command* mute(); Command* reset_fade_in(); Command* reset_fade_out(); Command* reset_fade_both(); Command* normalize(); Command* lock(); private slots: void private_add_fade(FadeCurve* fade); void private_remove_fade(FadeCurve* fade); void get_capture_bus(); }; inline qint64 AudioClip::get_readsource_id( ) const {return m_readSourceId;} inline float AudioClip::get_gain( ) const { return m_fader->get_gain(); } #endif traverso-0.49.4/src/core/Command.h000644 001750 001750 00000003770 11163362147 017240 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2006 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: Command.h,v 1.13 2008/02/12 20:39:08 r_sijrier Exp $ */ #ifndef COMMAND_H #define COMMAND_H #include #include #include #include #include class HistoryStack; class ContextItem; class Command : public QObject, public QUndoCommand { public : Command(ContextItem* item, const QString& des = "No description set!"); Command(const QString& des = "No description set!"); virtual ~Command(); virtual int begin_hold(); virtual int finish_hold(); virtual int prepare_actions(); virtual int do_action(); virtual int undo_action(); virtual int jog(); virtual void set_cursor_shape(int useX, int useY); virtual void cancel_action(); virtual void set_collected_number(const QString& collected); void undo() {undo_action();} void redo() {do_action();} void set_valid(bool valid); void set_historable(bool historible); int push_to_history_stack(); static void process_command(Command* cmd); protected: bool m_isValid; bool m_isHistorable; QString m_description; private: QUndoStack* m_historyStack; }; #endif traverso-0.49.4/src/core/Sheet.h000644 001750 001750 00000020450 12417542747 016735 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef SONG_H #define SONG_H #include "ContextItem.h" #include "AudioProcessingItem.h" #include #include #include "defines.h" #include "APILinkedList.h" #include "GainEnvelope.h" class Project; class Track; class AudioSource; class WriteSource; class Track; class AudioClip; class DiskIO; class AudioClipManager; class TAudioDeviceClient; class AudioBus; class PluginChain; class SnapList; class Plugin; class TimeLine; class Snappable; class DecodeBuffer; struct ExportSpecification; class Sheet : public ContextItem, public AudioProcessingItem { Q_OBJECT Q_CLASSINFO("start_transport", tr("Play")) Q_CLASSINFO("set_recordable_and_start_transport", tr("Record")); Q_CLASSINFO("work_next_edge", tr("Workcursor: To next edge")) Q_CLASSINFO("work_previous_edge", tr("Workcursor: To previous edge")) Q_CLASSINFO("undo", tr("Undo")) Q_CLASSINFO("redo", tr("Redo")) Q_CLASSINFO("toggle_snap", tr("Snap: On/Off")) Q_CLASSINFO("toggle_solo", tr("Solo: On/Off")) Q_CLASSINFO("toggle_mute", tr("Mute: On/Off")) Q_CLASSINFO("toggle_arm", tr("Arm: On/Off")) Q_CLASSINFO("set_editing_mode", tr("Mode: Edit")) Q_CLASSINFO("set_effects_mode", tr("Mode: Curve")) Q_CLASSINFO("prev_skip_pos", tr("To previous snap position")) Q_CLASSINFO("next_skip_pos", tr("To next snap position")) public: Sheet(Project* project); Sheet(Project* project, int numtracks); Sheet(Project* project, const QDomNode node); ~Sheet(); enum Mode { EDIT = 1, EFFECTS = 2 }; // Get functions qreal get_hzoom() const {return m_hzoom;} int get_rate(); int get_bitdepth(); int get_numtracks() const {return m_tracks.size();} int get_track_index(qint64 id); int get_mode() const {return m_mode;} int is_transport_rolling() const {return m_transport;} void get_scrollbar_xy(int& x, int& y) {x = m_sbx; y = m_sby;} const TimeRef& get_work_location() const {return m_workLocation;} nframes_t get_first_visible_frame() const; TimeRef get_last_location() const; const TimeRef& get_transport_location() const {return m_transportLocation;} const TimeRef& get_new_transport_location() const {return m_newTransportLocation;} QString get_title() const {return title;} QString get_artists() const {return artists;} QDomNode get_state(QDomDocument doc, bool istemplate=false); QList get_tracks() const; DiskIO* get_diskio() const; AudioClipManager* get_audioclip_manager() const; AudioBus* get_master_out() const {return m_masterOut;} AudioBus* get_render_bus() const {return m_renderBus;} AudioBus* get_clip_render_bus() const {return m_clipRenderBus;} SnapList* get_snap_list() const; PluginChain* get_plugin_chain() const; TimeLine* get_timeline() const {return m_timeline;} Snappable* get_work_snap() {return workSnap;} Track* get_track(qint64 id); Track* get_track_for_index(int index); // Set functions void set_artists(const QString& pArtistis); void set_first_visible_frame(nframes_t pos); void set_title(const QString& sTitle); void set_work_at(const TimeRef& location); void set_hzoom(qreal hzoom); void set_snapping(bool snap); void set_scrollbar_xy(int x, int y) {m_sbx = x; m_sby = y;} int set_state( const QDomNode & node ); void set_recording(bool recording, bool realtime); void skip_to_start(); void skip_to_end(); int process(nframes_t nframes); // jackd only feature int transport_control(transport_state_t state); int process_export(nframes_t nframes); int prepare_export(ExportSpecification* spec); int render(ExportSpecification* spec); void solo_track(Track* track); void create(int tracksToCreate); void move_clip(Track* from, Track* too, AudioClip* clip, TimeRef location); Command* add_track(Track* track, bool historable=true); Command* remove_track(Track* track, bool historable=true); bool any_track_armed(); bool realtime_path() const {return m_realtimepath;} bool is_changed() const {return changed;} bool is_snap_on() const {return m_isSnapOn;} bool is_recording() const {return m_recording;} bool is_smaller_then(APILinkedListNode* node) {Q_UNUSED(node); return false;} void disconnect_from_audiodevice(); void connect_to_audiodevice(); void schedule_for_deletion(); QString get_cdrdao_tracklist(ExportSpecification* spec, bool pregap = false); audio_sample_t* mixdown; audio_sample_t* readbuffer; audio_sample_t* gainbuffer; DecodeBuffer* renderDecodeBuffer; #if defined (THREAD_CHECK) unsigned long threadId; #endif private: APILinkedList m_tracks; QList m_recordingClips; QTimer m_skipTimer; Project* m_project; WriteSource* m_exportSource; AudioBus* m_playBackBus; TAudioDeviceClient* m_audiodeviceClient; AudioBus* m_masterOut; AudioBus* m_renderBus; AudioBus* m_clipRenderBus; DiskIO* m_diskio; AudioClipManager* m_acmanager; TimeLine* m_timeline; QList m_xposList; // The following data could be read/written by multiple threads // (gui, audio and m_diskio thread). Therefore they should have // atomic behaviour, still not sure if volatile size_t declaration // would suffice, or should we use t_atomic_int_set/get() to make // it 100% portable and working on all platforms...? volatile size_t m_transportFrame; volatile size_t m_newTransportFramePos; volatile size_t m_transport; volatile size_t m_seeking; volatile size_t m_startSeek; TimeRef m_transportLocation; TimeRef m_workLocation; TimeRef m_newTransportLocation; nframes_t firstVisibleFrame; QString artists; QString title; int m_mode; qreal m_hzoom; int m_sbx; int m_sby; uint m_currentSampleRate; bool m_rendering; bool changed; bool m_isSnapOn; bool m_resumeTransport; bool m_stopTransport; bool m_realtimepath; bool m_scheduledForDeletion; bool m_recording; bool m_prepareRecording; bool m_readyToRecord; SnapList* snaplist; Snappable* workSnap; void init(); int finish_audio_export(); void start_seek(); void start_transport_rolling(bool realtime); void stop_transport_rolling(); void update_skip_positions(); void resize_buffer(bool updateArmStatus, nframes_t size); Track* create_track(); friend class AudioClipManager; friend class TimeLine; public slots : void seek_finished(); void audiodevice_client_removed(TAudioDeviceClient* ); void audiodevice_started(); void audiodevice_params_changed(); void set_gain(float gain); void set_transport_pos(TimeRef location); float get_gain() const; void set_temp_follow_state(bool state); Command* next_skip_pos(); Command* prev_skip_pos(); Command* start_transport(); Command* set_recordable(); Command* set_recordable_and_start_transport(); Command* work_next_edge(); Command* work_previous_edge(); Command* toggle_snap(); Command* toggle_solo(); Command* toggle_mute(); Command* toggle_arm(); Command* set_editing_mode(); Command* set_effects_mode(); signals: void trackRemoved(Track* ); void trackAdded(Track* ); void hzoomChanged(); void transportStarted(); void transportStopped(); void workingPosChanged(); void transportPosSet(); void firstVisibleFrameChanged(); void lastFramePositionChanged(); void seekStart(); void snapChanged(); void tempFollowChanged(bool state); void propertyChanged(); void setCursorAtEdge(); void masterGainChanged(); void modeChanged(); void recordingStateChanged(); void prepareRecording(); private slots: void private_add_track(Track* track); void private_remove_track(Track* track); void handle_diskio_writebuffer_overrun(); void handle_diskio_readbuffer_underrun(); void prepare_recording(); void clip_finished_recording(AudioClip* clip); void config_changed(); }; inline float Sheet::get_gain() const { return m_fader->get_gain(); } #endif //eof traverso-0.49.4/src/core/ContextPointer.cpp000644 001750 001750 00000012371 11163362147 021177 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2006 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: ContextPointer.cpp,v 1.17 2007/12/15 16:50:18 r_sijrier Exp $ */ #include "ContextPointer.h" #include "ContextItem.h" #include "Config.h" #include "InputEngine.h" #include "Utils.h" #include "Themer.h" // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" /** * \class ContextPointer * \brief ContextPointer forms the bridge between the ViewPort (GUI) and the InputEngine (core) * Use it in classes that inherit ViewPort to discover ViewItems under
the mouse cursor on the first input event x/y coordinates.
Also provides convenience functions to get ViewPort x/y coordinates
as well as scene x/y coordinates, which can be used for example in the
jog() implementation of Command classes. ViewPort's mouse event handling automatically updates the state of ContextPointer
as well as the InputEngine, which makes sure the mouse is grabbed and released
during Hold type Command's. Use cpointer() to get a reference to the singleton object! * \sa ViewPort, InputEngine */ /** * * @return A reference to the singleton (static) ContextPointer object */ ContextPointer& cpointer() { static ContextPointer contextPointer; return contextPointer; } ContextPointer::ContextPointer() { m_x = 0; m_y = 0; m_jogEvent = false; currentViewPort = 0; connect(&m_jogTimer, SIGNAL(timeout()), this, SLOT(update_jog())); } /** * Returns a list of all 'soft selected' ContextItems. To be able to also dispatch key facts to objects that don't inherit from ContextItem, but do inherit from QObject, the returned list holds QObjects. * @return A list of 'soft selected' ContextItems, as QObject's. */ QList< QObject * > ContextPointer::get_context_items( ) { PENTER; QList pointedViewItems; if (currentViewPort) { currentViewPort->get_pointed_context_items(pointedViewItems); } QList contextItems; ContextItem* item; ContextItem* nextItem; for (int i=0; i < pointedViewItems.size(); ++i) { item = pointedViewItems.at(i); contextItems.append(item); while ((nextItem = item->get_context())) { contextItems.append(nextItem); item = nextItem; } } if (currentViewPort) { contextItems.append(currentViewPort); } for (int i=0; i < contextItemsList.size(); ++i) { contextItems.append(contextItemsList.at(i)); } return contextItems; } /** * Use this function to add an object that inherits from QObject
permanently to the 'soft selected' item list. The added object will always be added to the list returned in
get_context_items(). This way, one can add objects that do not
inherit ContextItem, to be processed into the key fact dispatching
of InputEngine. * @param item The QObject to be added to the 'soft selected' item list */ void ContextPointer::add_contextitem( QObject * item ) { if (! contextItemsList.contains(item)) contextItemsList.append(item); } void ContextPointer::remove_contextitem(QObject* item) { int index = contextItemsList.indexOf(item); contextItemsList.removeAt(index); } /** * Called _only_ by InputEngine, not to be used anywhere else. */ void ContextPointer::jog_start() { if (currentViewPort) { currentViewPort->viewport()->grabMouse(); } m_jogEvent = true; int interval = config().get_property("CCE", "jogupdateinterval", 33).toInt(); m_jogTimer.start(interval); } /** * Called _only_ by InputEngine, not to be used anywhere else. */ void ContextPointer::jog_finished() { if (currentViewPort) { currentViewPort->viewport()->releaseMouse(); // This issues a mouse move event, so the cursor // will change to the item that's below it.... QCursor::setPos(QCursor::pos()-QPoint(1,1)); } m_jogTimer.stop(); } /** * The current pointed ViewPort * @return The current pointed ViewPort, 0 if none is pointed */ ViewPort * ContextPointer::get_viewport( ) { if (currentViewPort) { return currentViewPort; } return 0; } /** * Used by InputEngine to reset the current ViewPort's HoldCursor
after a 'Hold type' Command has been finished. Not be called
from anywhere else */ void ContextPointer::reset_cursor( ) { Q_ASSERT(currentViewPort); currentViewPort->reset_cursor(); } QList< QObject * > ContextPointer::get_contextmenu_items() const { return m_contextMenuItems; } void ContextPointer::set_contextmenu_items(QList< QObject * > list) { m_contextMenuItems = list; } void ContextPointer::update_jog() { if (m_jogEvent) { ie().jog(); m_jogEvent = false; } } traverso-0.49.4/src/core/gdither_types_internal.h000644 001750 001750 00000003407 11163362147 022425 0ustar00remonremon000000 000000 /* * Copyright (C) 2002 Steve Harris * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * $Id: gdither_types_internal.h,v 1.1 2006/04/20 14:51:39 r_sijrier Exp $ */ #ifndef GDITHER_TYPES_H #define GDITHER_TYPES_H #include #ifdef __cplusplus extern "C" { #endif #define GDITHER_SH_BUF_SIZE 8 #define GDITHER_SH_BUF_MASK 7 /* this must agree with whats in gdither_types.h */ typedef enum { GDitherNone = 0, GDitherRect, GDitherTri, GDitherShaped } GDitherType; typedef enum { GDither8bit = 8, GDither16bit = 16, GDither32bit = 32, GDitherFloat = 25, GDitherDouble = 54 } GDitherSize; typedef struct { uint32_t phase; float buffer[GDITHER_SH_BUF_SIZE]; } GDitherShapedState; typedef struct GDither_s { GDitherType type; uint32_t channels; uint32_t bit_depth; uint32_t dither_depth; float scale; uint32_t post_scale; float post_scale_fp; float bias; int clamp_u; int clamp_l; float *tri_state; GDitherShapedState *shaped_state; } *GDither; #ifdef __cplusplus } #endif #endif traverso-0.49.4/src/core/Track.h000644 001750 001750 00000010357 11163362147 016725 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef TRACK_H #define TRACK_H #include #include #include #include #include "ContextItem.h" #include "GainEnvelope.h" #include "AudioProcessingItem.h" #include "defines.h" class AudioClip; class Sheet; class PluginChain; class Plugin; class Track : public ContextItem, public AudioProcessingItem { Q_OBJECT Q_CLASSINFO("mute", tr("Mute")) Q_CLASSINFO("toggle_arm", tr("Record: On/Off")) Q_CLASSINFO("solo", tr("Solo")) Q_CLASSINFO("silence_others", tr("Silence other tracks")) public : Track(Sheet* sheet, const QString& name, int height); Track(Sheet* sheet, const QDomNode node); ~Track(); static const int INITIAL_HEIGHT = 100; Command* add_clip(AudioClip* clip, bool historable=true, bool ismove=false); Command* add_plugin(Plugin* plugin); Command* remove_clip(AudioClip* clip, bool historable=true, bool ismove=false); Command* remove_plugin(Plugin* plugin); AudioClip* init_recording(); int arm(); int disarm(); // Get functions: AudioClip* get_clip_after(const TimeRef& pos); AudioClip* get_clip_before(const TimeRef& pos); void get_render_range(TimeRef& startlocation, TimeRef& endlocation); QString get_bus_in() const {return busIn;} QString get_bus_out() const{return busOut;} int get_height() const {return m_height;} float get_pan() const {return m_pan;} Sheet* get_sheet() const {return m_sheet;} QString get_name() const {return m_name;} int get_total_clips(); QDomNode get_state(QDomDocument doc, bool istemplate=false); PluginChain* get_plugin_chain() const {return m_pluginChain;} QList get_cliplist() const; int get_sort_index() const; bool is_smaller_then(APILinkedListNode* node) {return ((Track*)node)->get_sort_index() > get_sort_index();} // Set functions: void set_bus_out(QByteArray bus); void set_bus_in(QByteArray bus); void set_muted_by_solo(bool muted); void set_name(const QString& name); void set_solo(bool solo); void set_muted(bool muted); void set_pan(float pan); void set_sort_index(int index); void set_height(int h); void set_capture_left_channel(bool capture); void set_capture_right_channel(bool capture); int set_state( const QDomNode& node ); //Bool functions: bool is_muted_by_solo(); bool is_solo(); bool armed(); bool capture_left_channel() { return m_captureLeftChannel; } bool capture_right_channel() { return m_captureRightChannel; } // End bool functions int process(nframes_t nframes); private : Sheet* m_sheet; APILinkedList m_clips; float m_pan; int numtakes; QByteArray busIn; QByteArray busOut; QString m_name; int m_sortIndex; int m_height; bool isSolo; bool isArmed; bool mutedBySolo; bool m_captureLeftChannel; bool m_captureRightChannel; void set_armed(bool armed); void init(); signals: void audioClipAdded(AudioClip* clip); void audioClipRemoved(AudioClip* clip); void heightChanged(); void muteChanged(bool isMuted); void soloChanged(bool isSolo); void armedChanged(bool isArmed); void lockChanged(bool isLocked); void gainChanged(); void panChanged(); void stateChanged(); void audibleStateChanged(); void inBusChanged(); void outBusChanged(); public slots: void set_gain(float gain); void clip_position_changed(AudioClip* clip); float get_gain() const; Command* mute(); Command* toggle_arm(); Command* solo(); Command* silence_others(); private slots: void private_add_clip(AudioClip* clip); void private_remove_clip(AudioClip* clip); }; inline float Track::get_gain( ) const { return m_fader->get_gain(); } #endif traverso-0.49.4/src/core/AudioFileMerger.h000644 001750 001750 00000003007 11163362147 020656 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef AUDIO_FILE_MERGER_H #define AUDIO_FILE_MERGER_H #include #include #include class ReadSource; class AudioFileMerger : public QThread { Q_OBJECT public: AudioFileMerger(); void run() { exec(); } void enqueue_task(ReadSource* source0, ReadSource* source2, const QString& dir, const QString& outfilename); void stop_merging(); private slots: void dequeue_tasks(); private: struct MergeTask { QString outFileName; QString dir; ReadSource* readsource0; ReadSource* readsource1; }; QQueue m_tasks; QMutex m_mutex; bool m_stopMerging; void process_task(MergeTask task); signals: void dequeueTask(); void progress(int); void taskStarted(QString); void taskFinished(QString); void processingStopped(); }; #endif traverso-0.49.4/src/core/ResourcesManager.h000644 001750 001750 00000004644 11163362147 021130 0ustar00remonremon000000 000000 /* Copyright (C) 2006-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef RESOURCES_MANAGER_H #define RESOURCES_MANAGER_H #include #include #include #include #include class AudioSource; class ReadSource; class AudioClip; class Project; class ResourcesManager : public QObject { Q_OBJECT public: ResourcesManager(Project* project); ~ResourcesManager(); int set_state( const QDomNode& node ); QDomNode get_state(QDomDocument doc); ReadSource* create_recording_source(const QString& dir, const QString& name, int channelCount, qint64 sheetId); ReadSource* import_source(const QString& dir, const QString& name); ReadSource* get_silent_readsource(); AudioClip* new_audio_clip(const QString& name); AudioClip* get_clip(qint64 id); void mark_clip_removed(AudioClip* clip); void mark_clip_added(AudioClip* clip); void set_source_for_clip(AudioClip* clip, ReadSource* source); void destroy_clip(AudioClip* clip); void remove_source(ReadSource* source); bool is_clip_in_use(qint64) const; bool is_source_in_use(qint64 id) const; ReadSource* get_readsource(qint64 id); QList get_all_audio_sources() const; QList get_all_clips() const; private: struct ClipData { ClipData(); AudioClip* clip; bool inUse; bool isCopy; bool removed; }; struct SourceData { SourceData(); ReadSource* source; int clipCount; }; Project* m_project; QHash m_sources; QHash m_clips; ReadSource* m_silentReadSource; signals: void stateRestored(); void clipRemoved(AudioClip* clip); void clipAdded(AudioClip* clip); void sourceAdded(ReadSource* source); void sourceRemoved(ReadSource* source); }; #endif traverso-0.49.4/src/core/AudioFileCopyConvert.h000644 001750 001750 00000003265 11163362147 021716 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef AUDIO_FILE_COPY_CONVERT_H #define AUDIO_FILE_COPY_CONVERT_H #include #include #include class ReadSource; struct ExportSpecification; class AudioFileCopyConvert : public QThread { Q_OBJECT public: AudioFileCopyConvert(); void run() { exec(); } void enqueue_task(ReadSource* source, ExportSpecification* spec, const QString& dir, const QString& outfilename, int tracknumber, const QString& trackname); void stop_merging(); private slots: void dequeue_tasks(); private: struct CopyTask { QString outFileName; QString dir; QString extension; int tracknumber; QString trackname; ReadSource* readsource; ExportSpecification* spec; }; QQueue m_tasks; QMutex m_mutex; bool m_stopProcessing; void process_task(CopyTask task); signals: void dequeueTask(); void progress(int); void taskStarted(QString); void taskFinished(QString, int, QString); void processingStopped(); }; #endif traverso-0.49.4/src/core/SnapList.h000644 001750 001750 00000003150 11163362147 017407 0ustar00remonremon000000 000000 /* Copyright (C) 2006-2008 Nicola Doebelin, Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef SNAPLIST_H #define SNAPLIST_H #include #include "defines.h" class Sheet; class SnapList { public: SnapList(Sheet* sheet); ~SnapList() {}; TimeRef get_snap_value(const TimeRef& location); bool is_snap_value(const TimeRef& location); qint64 get_snap_diff(const TimeRef& location); TimeRef next_snap_pos(const TimeRef& location); TimeRef prev_snap_pos(const TimeRef& location); TimeRef calculate_snap_diff(TimeRef leftlocation, TimeRef rightlocation); void set_range(const TimeRef& start, const TimeRef& end, int scalefactor); void mark_dirty(); bool was_dirty(); private: Sheet* m_sheet; QList m_xposList; QList m_xposLut; QList m_xposBool; bool m_isDirty; bool m_wasDirty; TimeRef m_rangeStart; TimeRef m_rangeEnd; qint64 m_scalefactor; void update_snaplist(); }; #endif /* EOF */ traverso-0.49.4/src/core/Export.cpp000644 001750 001750 00000006245 12357214027 017475 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2006 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: Export.cpp,v 1.16 2008/01/21 16:22:13 r_sijrier Exp $ */ #include "Export.h" #include "Project.h" #include // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" ExportThread::ExportThread(Project* project) : QThread(project) { m_project = project; } void ExportThread::set_specification(ExportSpecification * spec) { m_spec = spec; m_spec->thread = this; } void ExportThread::run( ) { m_project->start_export(m_spec); } ExportSpecification::ExportSpecification() { sample_rate = -1; src_quality = SRC_SINC_MEDIUM_QUALITY; channels = -1; startLocation = qint64(-1); endLocation = qint64(-1); dither_type = GDitherTri; dataF = 0; blocksize = -1; data_width = -1; totalTime = qint64(-1); pos = qint64(-1); allSheets = false; stop = false; breakout = false; isRecording = -1; exportdir = ""; basename = ""; name = ""; writeToc = false; normalize = false; renderpass = WRITE_TO_HARDDISK; normvalue = 1.0; peakvalue = 0.0; isCdExport = false; } int ExportSpecification::is_valid() { if (sample_rate == -1) { printf("ExportSpecification: No samplerate configured!\n"); return -1; } if (channels == -1) { printf("ExportSpecification: No channels configured!\n"); return -1; } if (startLocation == qint64(-1)) { printf("ExportSpecification: No start frame configured!\n"); return -1; } if (endLocation == qint64(-1)) { printf("ExportSpecification: No end frame configured!\n"); return -1; } if (! dataF ) { printf("ExportSpecification: No mixdown buffer created!!\n"); return -1; } if (blocksize == -1) { printf("ExportSpecification: No blocksize configured!\n"); return -1; } if (data_width == -1) { printf("ExportSpecification: No data width configured!\n"); return -1; } if (totalTime == qint64(-1)) { printf("ExportSpecification: No total frames configured!\n"); return -1; } if (isRecording == -1) { printf("ExportSpecification: No isRecording configured!\n"); return -1; } if (pos == qint64(-1) && isRecording == 0) { printf("ExportSpecification: No position configured!\n"); return -1; } if (exportdir.isEmpty()) { printf("ExportSpecification: No export dir configured!\n"); return -1; } if (name.isEmpty()) { printf("ExportSpecification: No name configured!\n"); return -1; } return 1; } traverso-0.49.4/src/core/Snappable.h000644 001750 001750 00000002106 11163362147 017557 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Ben Levitt This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: Snappable.h,v 1.1 2007/03/29 22:18:38 benjie Exp $ */ #ifndef SNAPPABLE_H #define SNAPPABLE_H class SnapList; class Snappable { public: Snappable(); ~Snappable() {}; void set_snappable(bool snap); bool is_snappable() const; void set_snap_list(SnapList *sList); private: bool m_isSnappable; SnapList *snapList; }; #endif /* EOF */ traverso-0.49.4/src/core/gdither.cpp000644 001750 001750 00000030144 11163362147 017636 0ustar00remonremon000000 000000 /* * Copyright (C) 2002 Steve Harris * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * $Id: gdither.cpp,v 1.4 2009/03/14 14:13:46 r_sijrier Exp $ */ #include #include #include /* this monstrosity is necessary to get access to lrintf() and random(). whoever is writing the glibc headers and should be hauled off to a programmer re-education camp. for the rest of their natural lives. or longer. */ #define _ISOC9X_SOURCE 1 #define _ISOC99_SOURCE 1 #ifdef __cplusplus #include #else #include #endif #undef __USE_SVID #define __USE_SVID 1 #ifdef __cplusplus #include #else #include #endif #include #include "defines.h" /* Lipshitz's minimally audible FIR, only really works for 46kHz-ish signals */ static const float shaped_bs[] = { 2.033f, -2.165f, 1.959f, -1.590f, 0.6149f }; /* Some useful constants */ #define MAX_U8 255 #define MIN_U8 0 #define SCALE_U8 128.0f #define MAX_S16 32767 #define MIN_S16 -32768 #define SCALE_S16 32768.0f #define MAX_S24 8388607 #define MIN_S24 -8388608 #define SCALE_S24 8388608.0f GDither gdither_new(GDitherType type, uint32_t channels, GDitherSize bit_depth, int dither_depth) { GDither s; s = (GDither)calloc(1, sizeof(struct GDither_s)); s->type = type; s->channels = channels; s->bit_depth = (int)bit_depth; if (dither_depth <= 0 || dither_depth > (int)bit_depth) { dither_depth = (int)bit_depth; } s->dither_depth = dither_depth; s->scale = (float)(1LL << (dither_depth - 1)); if (bit_depth == GDitherFloat || bit_depth == GDitherDouble) { s->post_scale_fp = 1.0f / s->scale; s->post_scale = 0; } else { s->post_scale_fp = 0.0f; s->post_scale = 1 << ((int)bit_depth - dither_depth); } switch (bit_depth) { case GDither8bit: /* Unsigned 8 bit */ s->bias = 1.0f; s->clamp_u = 255; s->clamp_l = 0; break; case GDither16bit: /* Signed 16 bit */ s->bias = 0.0f; s->clamp_u = 32767; s->clamp_l = -32768; break; case GDither32bit: /* Signed 24 bit, in upper 24 bits of 32 bit word */ s->bias = 0.0f; s->clamp_u = 8388607; s->clamp_l = -8388608; break; case GDitherFloat: /* normalised float */ s->bias = 0.0f; s->clamp_u = lrintf(s->scale); s->clamp_l = lrintf(-s->scale); break; case GDitherDouble: /* normalised float */ s->bias = 0.0f; s->clamp_u = lrintf(s->scale); s->clamp_l = lrintf(-s->scale); break; case 23: /* special performance test case */ s->scale = SCALE_S24; s->post_scale = 256; s->bias = 0.0f; s->clamp_u = 8388607; s->clamp_l = -8388608; break; default: /* Not a bit depth we can handle */ free(s); return NULL; break; } switch (type) { case GDitherNone: case GDitherRect: /* No state */ break; case GDitherTri: /* The last whitenoise sample */ s->tri_state = (float *) calloc(channels, sizeof(float)); break; case GDitherShaped: /* The error from the last few samples encoded */ s->shaped_state = (GDitherShapedState*) calloc(channels, sizeof(GDitherShapedState)); break; } return s; } void gdither_free(GDither s) { if (s) { free(s->tri_state); free(s->shaped_state); free(s); } } inline static void gdither_innner_loop(const GDitherType dt, const uint32_t stride, const float bias, const float scale, const uint32_t post_scale, const int bit_depth, const uint32_t channel, const uint32_t length, float *ts, GDitherShapedState *ss, float *x, void *y, const int clamp_u, const int clamp_l) { uint32_t pos, i; u_int8_t *o8 = (u_int8_t*) y; int16_t *o16 = (int16_t*) y; int32_t *o32 = (int32_t*) y; float tmp, r, ideal; int64_t clamped; i = channel; for (pos = 0; pos < length; pos++, i += stride) { tmp = x[i] * scale + bias; switch (dt) { case GDitherNone: break; case GDitherRect: tmp -= GDITHER_NOISE; break; case GDitherTri: r = GDITHER_NOISE - 0.5f; tmp -= r - ts[channel]; ts[channel] = r; break; case GDitherShaped: /* Save raw value for error calculations */ ideal = tmp; /* Run FIR and add white noise */ ss->buffer[ss->phase] = GDITHER_NOISE * 0.5f; tmp += ss->buffer[ss->phase] * shaped_bs[0] + ss->buffer[(ss->phase - 1) & GDITHER_SH_BUF_MASK] * shaped_bs[1] + ss->buffer[(ss->phase - 2) & GDITHER_SH_BUF_MASK] * shaped_bs[2] + ss->buffer[(ss->phase - 3) & GDITHER_SH_BUF_MASK] * shaped_bs[3] + ss->buffer[(ss->phase - 4) & GDITHER_SH_BUF_MASK] * shaped_bs[4]; /* Roll buffer and store last error */ ss->phase = (ss->phase + 1) & GDITHER_SH_BUF_MASK; ss->buffer[ss->phase] = (float)lrintf(tmp) - ideal; break; } clamped = lrintf(tmp); if (clamped > clamp_u) { clamped = clamp_u; } else if (clamped < clamp_l) { clamped = clamp_l; } switch (bit_depth) { case GDither8bit: o8[i] = (u_int8_t) (clamped * post_scale); break; case GDither16bit: o16[i] = (int16_t) (clamped * post_scale); break; case GDither32bit: o32[i] = (int32_t) (clamped * post_scale); break; } } } /* floating point version of the inner loop function */ inline static void gdither_innner_loop_fp(const GDitherType dt, const uint32_t stride, const float bias, const float scale, const float post_scale, const int bit_depth, const uint32_t channel, const uint32_t length, float *ts, GDitherShapedState *ss, float *x, void *y, const int clamp_u, const int clamp_l) { uint32_t pos, i; float *oflt = (float*) y; double *odbl = (double*) y; float tmp, r, ideal; double clamped; i = channel; for (pos = 0; pos < length; pos++, i += stride) { tmp = x[i] * scale + bias; switch (dt) { case GDitherNone: break; case GDitherRect: tmp -= GDITHER_NOISE; break; case GDitherTri: r = GDITHER_NOISE - 0.5f; tmp -= r - ts[channel]; ts[channel] = r; break; case GDitherShaped: /* Save raw value for error calculations */ ideal = tmp; /* Run FIR and add white noise */ ss->buffer[ss->phase] = GDITHER_NOISE * 0.5f; tmp += ss->buffer[ss->phase] * shaped_bs[0] + ss->buffer[(ss->phase - 1) & GDITHER_SH_BUF_MASK] * shaped_bs[1] + ss->buffer[(ss->phase - 2) & GDITHER_SH_BUF_MASK] * shaped_bs[2] + ss->buffer[(ss->phase - 3) & GDITHER_SH_BUF_MASK] * shaped_bs[3] + ss->buffer[(ss->phase - 4) & GDITHER_SH_BUF_MASK] * shaped_bs[4]; /* Roll buffer and store last error */ ss->phase = (ss->phase + 1) & GDITHER_SH_BUF_MASK; ss->buffer[ss->phase] = (float)lrintf(tmp) - ideal; break; } clamped = rintf(tmp); if (clamped > clamp_u) { clamped = clamp_u; } else if (clamped < clamp_l) { clamped = clamp_l; } switch (bit_depth) { case GDitherFloat: oflt[i] = (float) (clamped * post_scale); break; case GDitherDouble: odbl[i] = (double) (clamped * post_scale); break; } } } #define GDITHER_CONV_BLOCK 512 void gdither_run(GDither s, uint32_t channel, uint32_t length, double *x, void *y) { float conv[GDITHER_CONV_BLOCK]; uint32_t i, pos; char *ycast = (char *)y; int step; switch (s->bit_depth) { case GDither8bit: step = 1; break; case GDither16bit: step = 2; break; case GDither32bit: case GDitherFloat: step = 4; break; case GDitherDouble: step = 8; break; default: step = 0; break; } pos = 0; while (pos < length) { for (i=0; (i + pos) < length && i < GDITHER_CONV_BLOCK; i++) { conv[i] = x[pos + i]; } gdither_runf(s, channel, i, conv, ycast + s->channels * step); pos += i; } } void gdither_runf(GDither s, uint32_t channel, uint32_t length, float *x, void *y) { uint32_t pos, i; float tmp; int64_t clamped; GDitherShapedState *ss = NULL; if (!s || channel >= s->channels) { return; } if (s->shaped_state) { ss = s->shaped_state + channel; } if (s->type == GDitherNone && s->bit_depth == 23) { int32_t *o32 = (int32_t*) y; for (pos = 0; pos < length; pos++) { i = channel + (pos * s->channels); tmp = x[i] * 8388608.0f; clamped = lrintf(tmp); if (clamped > 8388607) { clamped = 8388607; } else if (clamped < -8388608) { clamped = -8388608; } o32[i] = (int32_t) (clamped * 256); } return; } /* some common case handling code - looks a bit wierd, but it allows * the compiler to optiomise out the branches in the inner loop */ if (s->bit_depth == 8 && s->dither_depth == 8) { switch (s->type) { case GDitherNone: gdither_innner_loop(GDitherNone, s->channels, 128.0f, SCALE_U8, 1, 8, channel, length, NULL, NULL, x, y, MAX_U8, MIN_U8); break; case GDitherRect: gdither_innner_loop(GDitherRect, s->channels, 128.0f, SCALE_U8, 1, 8, channel, length, NULL, NULL, x, y, MAX_U8, MIN_U8); break; case GDitherTri: gdither_innner_loop(GDitherTri, s->channels, 128.0f, SCALE_U8, 1, 8, channel, length, s->tri_state, NULL, x, y, MAX_U8, MIN_U8); break; case GDitherShaped: gdither_innner_loop(GDitherShaped, s->channels, 128.0f, SCALE_U8, 1, 8, channel, length, NULL, ss, x, y, MAX_U8, MIN_U8); break; } } else if (s->bit_depth == 16 && s->dither_depth == 16) { switch (s->type) { case GDitherNone: gdither_innner_loop(GDitherNone, s->channels, 0.0f, SCALE_S16, 1, 16, channel, length, NULL, NULL, x, y, MAX_S16, MIN_S16); break; case GDitherRect: gdither_innner_loop(GDitherRect, s->channels, 0.0f, SCALE_S16, 1, 16, channel, length, NULL, NULL, x, y, MAX_S16, MIN_S16); break; case GDitherTri: gdither_innner_loop(GDitherTri, s->channels, 0.0f, SCALE_S16, 1, 16, channel, length, s->tri_state, NULL, x, y, MAX_S16, MIN_S16); break; case GDitherShaped: gdither_innner_loop(GDitherShaped, s->channels, 0.0f, SCALE_S16, 1, 16, channel, length, NULL, ss, x, y, MAX_S16, MIN_S16); break; } } else if (s->bit_depth == 32 && s->dither_depth == 24) { switch (s->type) { case GDitherNone: gdither_innner_loop(GDitherNone, s->channels, 0.0f, SCALE_S24, 256, 32, channel, length, NULL, NULL, x, y, MAX_S24, MIN_S24); break; case GDitherRect: gdither_innner_loop(GDitherRect, s->channels, 0.0f, SCALE_S24, 256, 32, channel, length, NULL, NULL, x, y, MAX_S24, MIN_S24); break; case GDitherTri: gdither_innner_loop(GDitherTri, s->channels, 0.0f, SCALE_S24, 256, 32, channel, length, s->tri_state, NULL, x, y, MAX_S24, MIN_S24); break; case GDitherShaped: gdither_innner_loop(GDitherShaped, s->channels, 0.0f, SCALE_S24, 256, 32, channel, length, NULL, ss, x, y, MAX_S24, MIN_S24); break; } } else if (s->bit_depth == GDitherFloat || s->bit_depth == GDitherDouble) { gdither_innner_loop_fp(s->type, s->channels, s->bias, s->scale, s->post_scale_fp, s->bit_depth, channel, length, s->tri_state, ss, x, y, s->clamp_u, s->clamp_l); } else { /* no special case handling, just process it from the struct */ gdither_innner_loop(s->type, s->channels, s->bias, s->scale, s->post_scale, s->bit_depth, channel, length, s->tri_state, ss, x, y, s->clamp_u, s->clamp_l); } } /* vi:set ts=8 sts=4 sw=4: */ traverso-0.49.4/src/core/WriteSource.h000644 001750 001750 00000004663 11163362147 020137 0ustar00remonremon000000 000000 /* Copyright (C) 2006-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef WRITESOURCE_H #define WRITESOURCE_H #include "AudioSource.h" #include "gdither.h" #include struct ExportSpecification; class Peak; class DiskIO; class AbstractAudioWriter; /// WriteSource is an AudioSource used for writing (recording, rendering) purposes class WriteSource : public AudioSource { Q_OBJECT public : WriteSource(ExportSpecification* spec); ~WriteSource(); int rb_write(audio_sample_t** src, nframes_t cnt); int rb_file_write(nframes_t cnt); void process_ringbuffer(audio_sample_t* buffer); int get_processable_buffer_space() const; int get_chunck_size() const {return m_chunkSize;} int get_buffer_size() const {return m_bufferSize;} Peak* get_peak() {return m_peak;} int process(nframes_t nframes); int prepare_export(); int finish_export(); void set_process_peaks(bool process); void set_recording(int rec); size_t is_recording() const; void set_diskio(DiskIO* io ); private: AbstractAudioWriter* m_writer; ExportSpecification* m_spec; Peak* m_peak; DiskIO* m_diskio; GDither m_dither; bool m_processPeaks; size_t m_isRecording; nframes_t m_sampleRate; uint32_t m_sample_bytes; // Sample rate conversion variables nframes_t m_out_samples_max; nframes_t m_leftover_frames; SRC_DATA m_src_data; SRC_STATE* m_src_state; nframes_t m_max_leftover_frames; float* m_leftoverF; float* m_dataF2; void* m_output_data; void prepare_rt_buffers(); signals: void exportFinished(); }; inline int WriteSource::get_processable_buffer_space( ) const { return m_buffers.at(0)->read_space(); } inline size_t WriteSource::is_recording( ) const { return m_isRecording; } #endif traverso-0.49.4/src/core/Information.cpp000644 001750 001750 00000003664 11163362147 020504 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "Information.h" #include "Utils.h" #include "AudioDevice.h" #include "Debugger.h" Information& info() { static Information information; return information; } void Information::information( const QString & mes ) { InfoStruct s; s.message = mes; s.type = INFO; PMESG("Information::information %s", QS_C(mes)); emit message(s); } void Information::warning( const QString & mes ) { InfoStruct s; s.message = mes; s.type = WARNING; PWARN("Information::warning %s", QS_C(mes)); emit message(s); } void Information::critical( const QString & mes ) { InfoStruct s; s.message = mes; s.type = CRITICAL; PERROR("Information::critical %s", QS_C(mes)); emit message(s); } void Information::audiodevice_message(QString message, int severity) { switch(severity) { case 0: information(message); break; case 1: warning(message); break; case 2: critical(message); break; default: information(message); } } Information::Information() { connect(&audiodevice(), SIGNAL(message(QString, int)), this, SLOT(audiodevice_message(QString, int))); } traverso-0.49.4/src/core/Export.h000644 001750 001750 00000004615 11163362147 017142 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2006 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: Export.h,v 1.18 2008/01/21 16:22:13 r_sijrier Exp $ */ #ifndef EXPORT_H #define EXPORT_H #include #include #include #include #include "defines.h" #include "gdither.h" class Project; class ExportThread; struct ExportSpecification { ExportSpecification(); int is_valid(); enum RenderPass { CALC_NORM_FACTOR, WRITE_TO_HARDDISK, CREATE_CDRDAO_TOC }; int sample_rate; int src_quality; int channels; TimeRef startLocation; TimeRef endLocation; GDitherType dither_type; /* used exclusively during export */ QString writerType; float* dataF; int blocksize; int data_width; TimeRef totalTime; TimeRef pos; QMap extraFormat; /* shared between UI thread and audio thread */ int progress; /* audio thread sets this */ bool stop; /* UI sets this */ bool breakout; bool running; /* audio thread sets to false when export is done */ int status; bool allSheets; int isRecording; QString exportdir; QString basename; QString name; QString tocFileName; QString cdrdaoToc; bool writeToc; bool normalize; int renderpass; float peakvalue; float normvalue; bool resumeTransport; TimeRef resumeTransportLocation; bool renderfinished; bool isCdExport; ExportThread* thread; }; class ExportThread : public QThread { Q_OBJECT public: ExportThread(Project* project); ~ExportThread() {} void run(); void sleep_for(uint msecs) { msleep(msecs); } void set_specification(ExportSpecification* spec); private: Project* m_project; ExportSpecification* m_spec; }; #endif traverso-0.49.4/src/core/Marker.h000644 001750 001750 00000004712 11163362147 017100 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef MARKER_H #define MARKER_H #include "ContextItem.h" #include "Snappable.h" #include "defines.h" #include class TimeLine; class Marker : public ContextItem, public Snappable { Q_OBJECT public: enum Type { CDTRACK, ENDMARKER, }; Marker(TimeLine* tl, const TimeRef when, Type type = CDTRACK); Marker(TimeLine* tl, const QDomNode node); ~Marker() {}; QDomNode get_state(QDomDocument doc); int set_state(const QDomNode& node); void set_description(const QString &); void set_performer(const QString &); void set_composer(const QString &); void set_songwriter(const QString &); void set_arranger(const QString &); void set_message(const QString &); void set_isrc(const QString &); void set_preemphasis(bool); void set_copyprotect(bool); void set_index(int); TimeLine * get_timeline() const {return m_timeline;} TimeRef get_when() const {return m_when;} QString get_description() const {return m_description;} QString get_performer() const {return m_performer;} QString get_composer() const {return m_composer;} QString get_songwriter() const {return m_songwriter;} QString get_arranger() const {return m_arranger;} QString get_message() const {return m_message;} QString get_isrc() const {return m_isrc;} bool get_preemphasis(); bool get_copyprotect(); Type get_type() {return m_type;}; int get_index() {return m_index;}; public slots: void set_when (const TimeRef& when); private: TimeLine* m_timeline; TimeRef m_when; QString m_description, m_performer, m_composer, m_songwriter, m_arranger, m_message, m_isrc; bool m_preemph, m_copyprotect; Type m_type; int m_index; signals: void positionChanged(); void descriptionChanged(); void indexChanged(); }; #endif //eof traverso-0.49.4/src/core/InputEngine.cpp000644 001750 001750 00000143176 11163362147 020447 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2008 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "InputEngine.h" #include "ContextItem.h" #include "ContextPointer.h" #include "Information.h" #include "Command.h" #include #include "Utils.h" #include #include #include #include #include #include #include #include // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" #define MAX_TIME_DIFFERENCE_FOR_DOUBLE_KEY_CONSIDERATION 50 #define MouseScrollHorizontalLeft -1 #define MouseScrollHorizontalRight -2 #define MouseScrollVerticalUp -3 #define MouseScrollVerticalDown -4 /** * \class InputEngine * \brief Processes keyboard/mouse events, dispatches the result, and handles the returned Command objects * InputEngine forms, together with ViewPort, Command, ContextPointer, ContextItem
and Qt's Undo Framework, the framework that makes up the the Contextual
Interaction Interface, with analog type of actions, and un/redo (aka History) support. Dispatching key facts to ContextItem objects InputEngine parses the keyboard/mouse events generated by the pointed ViewPort
If the keysequence matches that of any given in the keymap file, it call's
broadcast_action(). A list of pointed ContextItem objects is retrieved then
from ContextPointer. This list represents all (gui) ContextItem objects with their
corresponding 'core' ContextItem objects, stacked, with the topmost gui object on top. For each ContextItem in the list, the class name is retreived, and looked up in the keymap
if for the detected key fact an object was supplied with the exact same name.
If this is the case, the function name, also given in the keymap file by the given object name
is used to call the ContextItem's function. If succesfull, the InputEngine will stop iterating
over the list, and start handling the returned Command object. If the keymap specified that the object's doesn't have a function (slot) to be called, but instead
uses a CommandPlugin, the list of loaded CommandPlugins is searched to find a match for the
plugin name supplied in the keymap file, if there is a match, the Plugin is used to create
the Command object, and the same routine is used to handle this Command object. If the Command object returned no error during the handling, it'll be placed on it's
historystack. If no historystack was available, it's do_action() will be called, and
deleted afterwards. * \sa Command, ContextPointer, ViewPort, CommandPlugin */ static void set_hexcode(int & variable, const QString& text) { variable = 0; QString s; int x = 0; if ((text != QString::null) && (text.length() > 0) ) { s="ABCDEFGHIJKLMNOPQRSTUVWXYZ"; x = s.indexOf(text); if (x>=0) { variable = Qt::Key_A + x; } else { s="|ESC |TAB |BACKTAB |BKSPACE |RETURN |ENTER |INSERT |DELETE " "|PAUSE |PRINT |SYSREQ |CLEAR "; x = s.indexOf("|" + text); if (x>=0) variable = Qt::Key_Escape + (x/9); else { s="|HOME |END |LARROW |UARROW |RARROW " "|DARROW |PRIOR |NEXT "; x = s.indexOf("|" + text); if (x>=0) variable = Qt::Key_Home + (x/9); else { s="|SHIFT |CTRL |META |ALT |CAPS " "|NUMLOCK |SCROLL "; x = s.indexOf("|" + text); if (x>=0) variable = Qt::Key_Shift + (x/9); else { s="F1 F2 F3 F4 F5 F6 F7 F8 F9 F10F11F12"; x=s.indexOf(text); if (x>=0) { variable = Qt::Key_F1 + (x/3); } else if (text=="SPACE") { variable = Qt::Key_Space; } else if (text == "MouseButtonLeft") { variable = Qt::LeftButton; } else if (text == "MouseButtonRight") { variable = Qt::RightButton; } else if (text == "MouseButtonMiddle") { variable = Qt::MidButton; } else if (text == "MouseButtonX1") { variable = Qt::XButton1; } else if (text == "MouseButtonX2") { variable = Qt::XButton2; } else if (text == "MouseScrollHorizontalLeft") { variable = MouseScrollHorizontalLeft; } else if (text =="MouseScrollHorizontalRight") { variable = MouseScrollHorizontalRight; } else if (text == "MouseScrollVerticalUp") { variable = MouseScrollVerticalUp; } else if( text == "MouseScrollVerticalDown") { variable = MouseScrollVerticalDown; } else { PERROR("No HEX code found for %s", QS_C(text)); } } } } } } PMESG3("HEXCODE FOR %s=%d", QS_C(text), variable); } InputEngine& ie() { static InputEngine inputengine; return inputengine; } InputEngine::InputEngine() { PENTERCONS; holdingCommand = 0; // holdEvenCode MUST be a value != ANY key code! // when set to 'not matching any key!!!!!! holdEventCode = -100; isJogging = false; reset(); clearTime = 2000; assumeHoldTime = 200; // it will wait a release for 200 ms. Otherwise it will assume a hold doubleFactWaitTime = 200; collectedNumber = -1; sCollectedNumber = "-1"; activate(); //#define profile #if defined (profile) trav_time_t starttime = get_microseconds(); #endif foreach (QObject* obj, QPluginLoader::staticInstances()) { CommandPlugin* plug = qobject_cast(obj); m_commandplugins.insert(plug->metaObject()->className(), plug); } #if !defined (STATIC_BUILD) QDir pluginsDir("lib/commandplugins"); foreach (const QString &fileName, pluginsDir.entryList(QDir::Files)) { QPluginLoader loader(pluginsDir.absoluteFilePath(fileName)); CommandPlugin* plug = qobject_cast(loader.instance()); if (plug) { m_commandplugins.insert(plug->metaObject()->className(), plug); printf("InputEngine:: Succesfully loaded plugin: %s\n", plug->metaObject()->className()); } else { printf("InputEngine:: Plugin load failed with %s\n", QS_C(loader.errorString())); } } #endif #if defined (profile) int processtime = (int) (get_microseconds() - starttime); printf("InputEngine::Plugin load time: %d useconds\n\n", processtime); #endif } InputEngine::~ InputEngine( ) { foreach(IEAction* action, m_ieActions) { delete action; } } void InputEngine::activate() { PENTER3; isFirstFact=true; active=true; } void InputEngine::suspend() { PENTER3; active=false; set_jogging(false); } int InputEngine::broadcast_action_from_contextmenu(const QString& keySequence) { PENTER2; IEAction* action = 0; foreach(IEAction* ieaction, m_ieActions) { if (ieaction->keySequence == keySequence) { action = ieaction; break; } } if (keySequence.contains("++")) { info().information(tr("Modifier key actions are not supported from Context Menu")); return -1; } if (! action) { PERROR("ContextMenu keySequence doesn't apply to any InputEngine knows off!! (%s)", QS_C(keySequence)); return -1; } if ( action && ((action->type == HOLDKEY) || (action->type == HKEY2))) { info().information(tr("Hold actions are not supported from Context Menu")); return -1; } return broadcast_action(action, false, true); } int InputEngine::broadcast_action(IEAction* action, bool autorepeat, bool fromContextMenu) { PENTER2; Command* k = 0; QObject* item = 0; int useX=0, useY=0; QList list; if ( ! fromContextMenu ) { list = cpointer().get_context_items(); } else { list = cpointer().get_contextmenu_items(); } QString slotsignature = ""; if (holdingCommand) { list.prepend(holdingCommand); } PMESG("Trying to find IEAction for key sequence %s", action->keySequence.data()); for (int i=0; i < list.size(); ++i) { k = 0; m_broadcastResult = 0; item = list.at(i); if (!item) { PERROR("no item in cpointer()'s context item list ??"); continue; } IEAction::Data* data = action->objectUsingModifierKeys.value(QString(item->metaObject()->className())); // A match was found for actions using the modifier key // let's see if it is valid for the current active modifier keys! if (data) { PMESG("found match in objectUsingModierKeys"); bool modifierkeymatch = true; if (data->modifierkeys.size()) { foreach(int key, data->modifierkeys) { if ( ! m_activeModifierKeys.contains(key)) { PMESG("m_activeModifierKeys doesn't contain code %d", key); modifierkeymatch = false; break; } } } else { modifierkeymatch = false; } if (! modifierkeymatch) { data = 0; } } // No match found for actions using a modifier key, let's see if there // is one in the 'normal' actions list. if (! data ) { // This test makes sure that we don't select an unmodified command // when the user is holding down modifier keys. if (m_activeModifierKeys.size() > 0) { continue; } data = action->objects.value(QString(item->metaObject()->className())); if (! data ) { PMESG("No data found for object %s", item->metaObject()->className()); continue; } } // Now that we found a match, we still have to check if // the current mode is valid for this data! QString currentmode = m_modes.key(cpointer().get_current_mode()); QString allmodes = m_modes.key(0); if ( (! data->modes.contains(currentmode)) && (! data->modes.contains(allmodes))) { PMESG("%s on %s is not valid for mode %s", action->keySequence.data(), item->metaObject()->className(), QS_C(currentmode)); continue; } PMESG("Data found for %s!", item->metaObject()->className()); PMESG("setting slotsignature to %s", QS_C(data->slotsignature)); PMESG("setting pluginname to %s", QS_C(data->pluginname)); PMESG("setting plugincommand to %s", QS_C(data->commandname)); QString pluginname = "", commandname = ""; slotsignature = data->slotsignature; pluginname = data->pluginname; commandname = data->commandname; useX = data->useX; useY = data->useY; if (item == holdingCommand) { if (QMetaObject::invokeMethod(item, QS_C(slotsignature), Qt::DirectConnection, Q_ARG(bool, autorepeat))) { PMESG("HIT, invoking %s::%s", holdingCommand->metaObject()->className(), QS_C(slotsignature)); break; } } // We first try to find if there is a match in the loaded plugins. if ( ! holdingCommand ) { if ( ! pluginname.isEmpty() ) { CommandPlugin* plug = m_commandplugins.value(pluginname); if (!plug) { info().critical(tr("Command Plugin %1 not found!").arg(pluginname)); } else { if ( ! plug->implements(commandname) ) { info().critical(tr("Plugin %1 doesn't implement Command %2") .arg(pluginname).arg(commandname)); } else { PMESG("InputEngine:: Using plugin %s for command %s", QS_C(pluginname), QS_C(data->commandname)); k = plug->create(item, commandname, data->arguments); } } } } // Either the plugins didn't have a match, or were holding. if ( ! k ) { IEAction::Data* delegatingdata; QString delegatedobject; if (holdingCommand) { delegatingdata = action->objects.value("HoldCommand"); delegatedobject = "HoldCommand"; } else { delegatedobject = item->metaObject()->className(); if (m_activeModifierKeys.size() > 0) { delegatingdata = action->objectUsingModifierKeys.value(delegatedobject); } else { delegatingdata = action->objects.value(delegatedobject); } PMESG("delegatedobject is %s", QS_C(delegatedobject)); } if ( ! delegatingdata) { PMESG("No delegating data ? WEIRD"); continue; } QStringList strlist = delegatingdata->slotsignature.split("::"); if (strlist.size() == 2) { PMESG("Detected delegate action, checking if it is valid!"); QString classname = strlist.at(0); QString slot = strlist.at(1); QObject* obj = 0; bool validobject = false; for (int j=0; j < list.size(); ++j) { obj = list.at(j); if (obj->metaObject()->className() == classname) { PMESG("Found an item in the contextitem list that equals delegated object"); validobject = true; break; } } if (validobject) { if (QMetaObject::invokeMethod(obj, QS_C(slot), Qt::DirectConnection, Q_RETURN_ARG(Command*, k))) { PMESG("HIT, invoking (delegated) %s::%s", QS_C(classname), QS_C(slot)); } else { PMESG("Delegated object slot call didn't work out, sorry!"); PMESG("%s::%s() --> %s::%s()", item->metaObject()->className(), QS_C(slot), QS_C(classname), QS_C(slot)); } } else { PMESG("Delegated object %s was not found in the context items list!", QS_C(classname)); } } else { if (QMetaObject::invokeMethod(item, QS_C(slotsignature), Qt::DirectConnection, Q_RETURN_ARG(Command*, k))) { PMESG("HIT, invoking %s::%s", item->metaObject()->className(), QS_C(slotsignature)); } else { PMESG("nope %s wasn't the right one, next ...", item->metaObject()->className()); } } } // Let's see if the ContextItem used either succes(), failure() or did_not_implement() // return functions, so we can detect to either return happily, the action was succesfull // but no command object needed to be returned, the action was not succesfull, and we // don't want to try lower level context items or the action was succesfull but we'd like // to give a lower level contextitem precedence over the current one. if (m_broadcastResult) { if (m_broadcastResult == SUCCES) { PMESG("Broadcast Result indicates succes, but no returned Command object"); return 1; } if (m_broadcastResult == FAILURE) { PMESG("Broadcast Result indicates failure, and doesn't want lower level items to be processed"); return 0; } if (m_broadcastResult == DIDNOTIMPLEMENT) { PMESG("Broadcast Result indicates succes, but didn't want to perform it's action," "so we continue traversing the contextitem list"); continue; } } if (k && (!isHolding)) { if (k->prepare_actions() != -1) { k->set_valid(true); if (k->push_to_history_stack() < 0) { // The command doesn't have a history stack, or wasn't // historable for some reason.... At least call do_action // since that still isn't done (should be done by QUndoStack...) k->do_action(); delete k; k = 0; } } else { PWARN("prepare actions failed!"); delete k; k = 0; } } if (k && isHolding) { if (k->begin_hold() != -1) { k->set_valid(true); k->set_cursor_shape(useX, useY); holdingCommand = k; set_jogging(true); } else { PERROR("hold action begin_hold() failed!"); // OOPSSS, something went wrong when making the Command // set following stuff to zero to make finish_hold do nothing delete k; k = 0; set_jogging( false ); wholeMapIndex = -1; } } break; } return 1; } Command* InputEngine::succes() { m_broadcastResult = SUCCES; return 0; } Command* InputEngine::failure() { m_broadcastResult = FAILURE; return 0; } Command* InputEngine::did_not_implement() { m_broadcastResult = DIDNOTIMPLEMENT; return 0; } void InputEngine::jog() { PENTER3; if (isJogging) { if (holdingCommand) { if (m_bypassJog) { QPoint diff = m_jogBypassPos - cpointer().pos(); if (diff.manhattanLength() > m_unbypassJogDistance) { m_bypassJog = false; } else { return; } m_jogBypassPos = cpointer().pos(); } holdingCommand->jog(); } } } void InputEngine::bypass_jog_until_mouse_movements_exceeded_manhattenlength(int length) { m_unbypassJogDistance = length; m_bypassJog = true; m_jogBypassPos = cpointer().pos(); } void InputEngine::set_jogging(bool jog) { if (jog) { cpointer().jog_start(); } else { cpointer().jog_finished(); } isJogging = jog; } bool InputEngine::is_jogging() { return isJogging; } // JMB ENGINE : EVENT LEVEL HANDLING ------------------------------- // reset the event stack and the press 'stack' (not exactly a stack) void InputEngine::reset() { PENTER3; isFirstFact = true; isDoubleKey = false; fact1_k1 = 0; fact1_k2 = 0; isHolding = false; isPressEventLocked = false; m_cancelHold = false; stackIndex = 0; pressEventCounter = 0; fact2_k1 = 0; fact2_k2 = 0; wholeMapIndex = -1; m_bypassJog = false; for (int i=0; i < STACK_SIZE; i++) { eventType[i] = 0; eventStack[i] = 0; eventTime[i] = 0; } } void InputEngine::clear_modifier_keys() { m_activeModifierKeys.clear(); } // Everthing starts here. Catch event takes anything happen in the keyboard // and pushes it into a stack. void InputEngine::catch_key_press(QKeyEvent * e ) { if (e->isAutoRepeat() && !isHolding) { return; } PENTER4; process_press_event(e->key(), e->isAutoRepeat()); } void InputEngine::catch_key_release( QKeyEvent * e) { if (e->isAutoRepeat()) { return; } PENTER4; process_release_event(e->key()); } void InputEngine::catch_mousebutton_press( QMouseEvent * e ) { process_press_event(e->button()); } void InputEngine::catch_mousebutton_release( QMouseEvent * e ) { process_release_event(e->button()); } void InputEngine::catch_mousebutton_doubleclick( QMouseEvent * e ) { process_press_event(e->button()); process_release_event(e->button()); process_press_event(e->button()); process_release_event(e->button()); } void InputEngine::catch_scroll(QWheelEvent* e) { if (e->orientation() == Qt::Horizontal) { if (e->delta() > 0) { } if (e->delta() < 0) { } } else { if (e->delta() > 0) { process_press_event(MouseScrollVerticalUp); process_release_event(MouseScrollVerticalUp); } if (e->delta() < 0) { process_press_event(MouseScrollVerticalDown); process_release_event(MouseScrollVerticalDown); } } } void InputEngine::process_press_event(int eventcode, bool isAutoRepeat) { if (eventcode == Qt::Key_Escape && is_holding()) { m_cancelHold = true; finish_hold(); return; } // first check if this fact is just a collected number if (check_number_collection(eventcode)) { // another digit was collected. return; } if (is_modifier_keyfact(eventcode)) { if ( (! isAutoRepeat) && (! m_activeModifierKeys.contains(eventcode)) ) { m_activeModifierKeys.append(eventcode); } return; } if (isFirstFact && !isHolding) { cpointer().inputengine_first_input_event(); if (eventStack[0] == 0) { // Here we jump straight to the command if "K" is unambiguously an FKEY int fkey_index = find_index_for_instant_fkey(eventcode); if (fkey_index >= 0) { catcher.holdTimer.stop(); // quit the holding check.. IEAction* action = m_ieActions.at(fkey_index); broadcast_action(action, isAutoRepeat); conclusion(); return; } } else { // Here we jump straight to the command if "KL" is unambiguously an FKEY2 int fkey2_index = find_index_for_instant_fkey2(eventcode, eventStack[0]); if (fkey2_index >= 0) { catcher.holdTimer.stop(); // quit the holding check.. IEAction* action = m_ieActions.at(fkey2_index); broadcast_action(action, isAutoRepeat); conclusion(); return; } } } if (isHolding) { int index = find_index_for_single_fact(FKEY, eventcode, 0); // PRE-CONDITION: // The eventcode must be bind to a single key fact AND // the eventcode must be != the current active holding // command's eventcode! if (index >= 0 && holdEventCode != eventcode) { IEAction* action = m_ieActions.at(index); broadcast_action(action, isAutoRepeat); } return; } if (!isPressEventLocked) { if (pressEventCounter < 2) { pressEventCounter++; push_event(PRESS_EVENT, eventcode); press_checker(); if (!catcher.holdTimer.isActive()) catcher.holdTimer.start( assumeHoldTime); // single shot timer } else { isPressEventLocked = true; } } } void InputEngine::process_release_event(int eventcode) { if (is_modifier_keyfact(eventcode)) { m_activeModifierKeys.removeAll(eventcode); return; } if (isHolding) { if (eventcode != holdEventCode) { PMESG("release event during hold action, but NOT for holdaction itself!!"); return; } else { PMESG("release event for hold action detected!"); holdEventCode = -100; } } if ((!is_fake(eventcode)) && (stackIndex != 0)) { push_event(RELEASE_EVENT, eventcode); release_checker(); } } // This pushes an event to the stack void InputEngine::push_event( int pType, int pCode ) { PENTER3; if (stackIndex < STACK_SIZE) { eventType[stackIndex] = pType; eventStack[stackIndex] = pCode; QTime currTime = QTime::currentTime(); long ts=currTime.msec() + (currTime.second() * 1000) + (currTime.minute() * 1000 * 60); eventTime[stackIndex] = ts; PMESG3("Pushing EVENT %d (%s) key=%d at %ld",stackIndex,( pType==PRESS_EVENT ? "PRESS" : "RELEASE" ),pCode,ts); stackIndex++; for (int j=0; jK>K action // where user typed too fast, so the release of 1st P happend AFTER the // 2nd press. In this case, I have to assume this is a >K>K // action, and dispatch TWO facts. // Now forcing prematurally a 2 facts by splitting and syncronizing // these events into 2 different facts. Probably this is a >K>K // of course, this >K>K assumption mentioned above can be made ONLY if it is the first fact. if (isFirstFact) { PMESG("Inital double key too slow. It must be a premature >K>K. Dispatching 2 individual facts."); int f1_k1=eventStack[0]; int f2_k1=eventStack[1]; push_fact (f1_k1,0); push_fact (f2_k1,0); } } } // ----------------------------- JMB ENGINE : PRESS LEVEL HANDLING ------------------------- void InputEngine::push_fact(int k1,int k2) { PENTER3; PMESG3("Pushing FACT : k1=%d k2=%d",k1,k2); catcher.holdTimer.stop(); // quit the holding check.. if (isFirstFact) { // this is the first fact PMESG3("First fact detected !"); // first try to find some action like k1k2 fact1_k1 = k1; fact1_k2 = k2; int mapIndex = identify_first_fact(); if (mapIndex < 0) { PMESG3("First fact alone does not match anything in the map. Waiting for a second fact..."); // Action not identified. Maybe is part of a double fact action. so... give_a_chance_for_second_fact(); return; } PMESG3("First fact matches map in position %d",mapIndex); // there is a single-fact action which matches this !! now must check if is not an immediate action if (!m_ieActions.at(mapIndex)->isInstantaneous) { PMESG3("Although this could be an SINGLE PRESS Action, it is not protected, so..."); // action is not an immediate action, so... give_a_chance_for_second_fact(); return; } // Action exists AND it is a immediate action. So // forces it to be a single fact action PMESG3("This is protected (immediate) action. It'll be treated as "); dispatch_action(mapIndex); conclusion(); } else // ok . We are in the second fact. { catcher.secondChanceTimer.stop(); fact2_k1 = k1; fact2_k2 = k2; if (fact2_k1!=0) { // this is the second press PMESG3("Second fact detected !"); } // try to complement the first press. wholeMapIndex = identify_first_and_second_facts_together(); if (wholeMapIndex >= 0) { PMESG3("First and second facts together matches with action %d !! Dispatching it...",wholeMapIndex ); dispatch_action(wholeMapIndex); } else { PMESG3("Apparently, first and second facts together do not match any action. Sorry :-("); } conclusion(); } } int InputEngine::identify_first_fact() { PENTER3; fact1Type = 0; // First we need to know the first fact type. if (fact1_k2==0) // or [K] { if (!isHolding) { PMESG3("Detected "); fact1Type = FKEY; } else { PMESG3("Detected [K]"); fact1Type = HOLDKEY; holdEventCode = fact1_k1; } } else // or [KK] { if (!isHolding) { PMESG3("Detected "); fact1Type = FKEY2; } else { PMESG3("Detected [KK]"); fact1Type = HKEY2; holdEventCode = fact1_k2; } } // Fact 1 Type identified . int index = find_index_for_single_fact(fact1Type, fact1_k1, fact1_k2); if (index >= 0) { return index; } PMESG3("No single fact candidate action found. Keep going, since a 2nd fact might come soon"); give_a_chance_for_second_fact(); return -1; } // Only return a valid index if there is an FKEY defined for key, and there are no // other conflicting keyfacts (HOLDKEY, FKEY2, etc) int InputEngine::find_index_for_instant_fkey( int key ) { int fkey_index = find_index_for_single_fact(FKEY, key, 0); if (fkey_index < 0) { return -1; } foreach(IEAction* action, m_ieActions) { if (action->type == FKEY) continue; if (action->fact1_key1==key || action->fact1_key2==key) { PMESG3("Found a conflict (%s) for instantaneous keyfact key=%d", action->keySequence.data(), key); return -1; } } return fkey_index; } // Only return a valid index if there is an FKEY2 defined for key1, key2, and there are no // other conflicting keyfacts (HOLDKEY2, etc) int InputEngine::find_index_for_instant_fkey2( int key1, int key2 ) { int fkey2_index = find_index_for_single_fact(FKEY2, key1, key2); if (fkey2_index < 0) { return -1; } foreach(IEAction* action, m_ieActions) { if (action->type == D_FKEY2 || action->type == HKEY2) { if ( (action->fact1_key1==key1 && action->fact1_key2==key2) || (action->fact1_key1==key2 && action->fact1_key2==key1) ) { PMESG3("Found a conflict (%s) for instantaneous keyfact keys=%d,%d", action->keySequence.data(), key1, key2); return -1; } } } return fkey2_index; } int InputEngine::find_index_for_single_fact( int type, int key1, int key2 ) { foreach(IEAction* action, m_ieActions) { if (action->type != type ) continue; if ( ( ((action->fact1_key1==key1) && ( action->fact1_key2==key2)) || ((action->fact1_key1==key2) && ( action->fact1_key2==key1)) ) && ( action->fact2_key1 == 0 ) && ( action->fact2_key2 == 0 ) ) { // 'i' is a candidate for first press PMESG3("Found a match in map position %d, keyfact %s", m_ieActions.indexOf(action), action->keySequence.data()); return m_ieActions.indexOf(action); } } return -1; } // This is called whenever a second fact happens right after the first int InputEngine::identify_first_and_second_facts_together() { PENTER3; PMESG3("Adding a 2nd fact %d,%d to the 1st one %d,%d",fact2_k1,fact2_k2,fact1_k1,fact1_k2); if (fact2_k1!=0) { if (!isHolding) { if (fact1_k2==0) // first press is (I know that its not [K] because if it was I'd never reach identify_first_and_second_facts_together()) { if (fact2_k2==0) if (fact1_k1 == fact2_k1) { PMESG3("Whole action is a <>"); wholeActionType = D_FKEY; // <> } else { PMESG3("Whole action is a >K>K"); wholeActionType = S_FKEY_FKEY; // >K>K } else { PMESG3("Whole action is a >K>KK"); wholeActionType = S_FKEY_FKEY2; // >K>KK } } else { if (fact2_k2==0) { PMESG3("Whole action is a >KK>K"); wholeActionType = S_FKEY2_FKEY; // >KK>K } else { if ( ((fact1_k1==fact2_k1) && (fact1_k2==fact2_k2)) || ((fact1_k1==fact2_k2) && (fact1_k2==fact2_k1)) ) { PMESG3("Whole action is a <>"); wholeActionType = D_FKEY2; } else { PMESG3("Whole action is a >KK>KK"); wholeActionType = S_FKEY2_FKEY2; } } } } else { if (fact1_k2==0) // first press is (I know that its not [K] because if it was I'd never reach identify_first_and_second_facts_together()) { if (fact2_k2==0) if (fact1_k1 == fact2_k1) { PMESG3("Whole action is a <[K]>"); wholeActionType = FHKEY; } else { PMESG3("Whole action is a >K[K]"); wholeActionType = S_FKEY_HKEY; } else { PMESG3("Whole action is a >K[KK]"); wholeActionType = S_FKEY_HKEY2; } } else { if (fact2_k2==0) { PMESG3("Whole action is a KK[K]"); wholeActionType = S_FKEY2_HKEY; } else { PMESG3("Whole action is a >KK[KK]"); wholeActionType = S_FKEY2_HKEY2; } } } } else { PMESG3("Second fact is null (0,0). Assuming wholeActionType is %d", fact1Type); wholeActionType = fact1Type; } // whole action type identified . PMESG3("Searching for a %d action that matches %d,%d,%d,%d ", wholeActionType, fact1_k1, fact1_k2, fact2_k1, fact2_k2); foreach(IEAction* action, m_ieActions) { if ( action->type != wholeActionType ) continue; int ap1k1 = action->fact1_key1; int ap1k2 = action->fact1_key2; int ap2k1 = action->fact2_key1; int ap2k2 = action->fact2_key2; PMESG4("COMPARING %d,%d,%d,%d \tWITH %d,%d,%d,%d",ap1k1,ap1k2,ap2k1,ap2k2,fact1_k1,fact1_k2,fact2_k1,fact2_k2); if ( ( ((ap1k1==fact1_k1) && (ap1k2==fact1_k2)) || ((ap1k1==fact1_k2) && (ap1k2==fact1_k1)) ) && ( ((ap2k1==fact2_k1) && (ap2k2==fact2_k2)) || ((ap2k1==fact2_k2) && (ap2k2==fact2_k1)) ) ) { // 'i' is a candidate the whole action PMESG3("Found a match : action %s", action->keySequence.data()); return m_ieActions.indexOf(action); } } PMESG3("No candidates found :-("); return -1; } void InputEngine::give_a_chance_for_second_fact() { PENTER3; PMESG3("Waiting %d ms for second fact ...",doubleFactWaitTime ); catcher.secondChanceTimer.start( doubleFactWaitTime ); isFirstFact=false; isHolding = false; isPressEventLocked = false; stackIndex = 0; pressEventCounter = 0; fact2_k1 = 0; fact2_k2 = 0; wholeMapIndex = -1; for (int i=0; i < STACK_SIZE; i++) { eventType[i] = 0; eventStack[i] = 0; eventTime[i] = 0; } } // ----------------------------- JMB ENGINE : ACTION LEVEL HANDLING ------------------------- void InputEngine::dispatch_action(int mapIndex) { PENTER2; broadcast_action(m_ieActions.at(mapIndex)); } // This is called by void InputEngine::dispatch_hold() { PENTER2; catcher.clearOutputTimer.stop(); isHoldingOutput=false; wholeMapIndex = -1; if (isFirstFact) { fact1_k1 = eventStack[0]; fact1_k2 = eventStack[1]; wholeMapIndex = identify_first_fact(); // I can consider first press the last because there is nothing after a [] } else { fact2_k1 = eventStack[0]; fact2_k2 = eventStack[1]; wholeMapIndex = identify_first_and_second_facts_together(); } if (wholeMapIndex>=0) { broadcast_action(m_ieActions.at(wholeMapIndex)); } stop_collecting(); // note that we dont call conclusion() here :-) } void InputEngine::finish_hold() { PENTER3; PMESG("Finishing hold action %d",wholeMapIndex); isHolding = false; if (m_cancelHold) { PMESG("Canceling this hold command"); if (holdingCommand) { holdingCommand->cancel_action(); delete holdingCommand; holdingCommand = 0; } cpointer().reset_cursor(); } else if (holdingCommand) { cpointer().reset_cursor(); int holdFinish = holdingCommand->finish_hold(); int holdprepare = -1; if (holdFinish > 0) { holdprepare = holdingCommand->prepare_actions(); if (holdprepare > 0) { PMESG("holdingCommand->prepare_actions() returned succes!"); holdingCommand->set_valid(true); } else { PMESG("holdingCommand->prepare_actions() returned <= 0, so either it failed, or nothing happened!"); holdingCommand->set_valid( false ); } } else { PMESG("holdingCommand->finish_hold() returned <= 0, so either it failed, or nothing happened!"); holdingCommand->set_valid( false ); } if (holdingCommand->push_to_history_stack() < 0) { if (holdprepare == 1) { holdingCommand->do_action(); } delete holdingCommand; } holdingCommand = 0; } set_jogging(false); conclusion(); } void InputEngine::conclusion() { PENTER3; reset(); hold_output(); } void InputEngine::hold_output() { PENTER3; if (!isHoldingOutput) { catcher.clearOutputTimer.start(clearTime); isHoldingOutput=true; } } int InputEngine::init_map(const QString& keymap) { PENTER; QString filename = ":/keymaps/" + keymap + ".xml"; if ( ! QFile::exists(filename)) { filename = QDir::homePath() + "/.traverso/keymaps/" + keymap + ".xml"; } QDomDocument doc("keymap"); QFile file(filename); if (!file.open(QIODevice::ReadOnly)) return -1; if (!doc.setContent(&file)) { file.close(); return -1; } file.close(); PMESG("Using keymap: %s", QS_C(keymap)); foreach(IEAction* action, m_ieActions) { delete action; } m_ieActions.clear(); m_modifierKeys.clear(); m_modes.clear(); QDomElement root = doc.documentElement(); QDomNode modifierKeysNode = root.firstChildElement("ModifierKeys"); QDomNode modifierKeyNode = modifierKeysNode.firstChild(); int keycode; QString key; while( !modifierKeyNode.isNull() ) { QDomElement e = modifierKeyNode.toElement(); key = e.attribute( "key", ""); set_hexcode(keycode, key); m_modifierKeys.append(keycode); modifierKeyNode = modifierKeyNode.nextSibling(); } QDomNode modesNode = root.firstChildElement("Modes"); QDomNode modeNode = modesNode.firstChild(); int id; QString modename; while( !modeNode.isNull() ) { QDomElement e = modeNode.toElement(); modename = e.attribute("name", ""); id = e.attribute("id", "-1").toInt(); m_modes.insert(modename, id); modeNode = modeNode.nextSibling(); } QDomNode keyfactsNode = root.firstChildElement("Keyfacts"); QDomNode keyfactNode = keyfactsNode.firstChild(); QString keyFactType; QString key1, key2, key3, key4, mouseHint, modifierKeys; IEAction::Data* data; while( !keyfactNode.isNull() ) { QDomElement e = keyfactNode.toElement(); if( e.isNull() ) { continue; } if( ! (e.tagName() == "keyfact" ) ) { PERROR("Detected wrong tagname, misspelled: keyfact !!"); continue; } IEAction* action = new IEAction(); keyFactType = e.attribute( "type", "" ); key1 = e.attribute( "key1", ""); key2 = e.attribute( "key2", "" ); if (keyFactType == "FKEY") action->type = FKEY; else if (keyFactType == "FKEY2") action->type = FKEY2; else if (keyFactType == "HKEY") action->type = HOLDKEY; else if (keyFactType == "HKEY2") action->type = HKEY2; else if (keyFactType == "D_FKEY") action->type = D_FKEY; else if (keyFactType == "D_FKEY2") action->type = D_FKEY2; else if (keyFactType == "S_FKEY_FKEY") action->type = S_FKEY_FKEY; else { PWARN("keyFactType not supported!"); } set_hexcode(action->fact1_key1, key1); set_hexcode(action->fact1_key2, key2); set_hexcode(action->fact2_key1, key3); set_hexcode(action->fact2_key2, key4); // Fix the keyCode positions if (( action->type == D_FKEY ) || ( action->type == FHKEY )) { action->fact2_key1=action->fact1_key1; } else if (( action->type == D_FKEY2 ) || ( action->type == FHKEY )) { action->fact2_key1=action->fact1_key1; action->fact2_key2=action->fact1_key2; } else if (( action->type == S_FKEY_FKEY ) || ( action->type == S_FKEY_HKEY )) { action->fact2_key1=action->fact1_key2; action->fact1_key2=0; } QDomElement objectsNode = e.firstChildElement("Objects"); QDomNode objectNode = objectsNode.firstChild(); while(!objectNode.isNull()) { data = new IEAction::Data; QDomElement e = objectNode.toElement(); QString objectname = e.attribute("objectname", ""); data->slotsignature = e.attribute("slotsignature", ""); data->modes = e.attribute("modes", "").split(";"); data->pluginname = e.attribute( "pluginname", ""); data->commandname = e.attribute( "commandname", ""); data->submenu = e.attribute("submenu", ""); data->sortorder = e.attribute( "sortorder", "0").toInt(); mouseHint = e.attribute( "mousehint", "" ); QString args = e.attribute("arguments", ""); modifierKeys = e.attribute("modifierkeys", ""); if ( ! args.isEmpty() ) { QStringList arglist = args.split(";"); for (int i=0; iarguments.append(arglist.at(i)); } } if (! modifierKeys.isEmpty()) { QStringList modifierlist = modifierKeys.split(";"); for (int i=0; imodifierkeys.append(keycode); } } data->useX = data->useY = false; if (mouseHint == "LR") { data->useX = true; } if (mouseHint == "UD") { data->useY = true; } if (mouseHint == "LRUD") { data->useX = data->useY = true; } if (QString(objectname) == "") { PERROR("no objectname given in keyaction %s", QS_C(keyFactType)); } if (data->slotsignature.isEmpty() && data->pluginname.isEmpty()) { PERROR("no slotsignature given in keyaction %s, object %s", QS_C(keyFactType), QS_C(objectname)); } if (QString(data->modes.join(";")) == "") { PERROR("no modes given in keyaction %s, object %s", QS_C(keyFactType), QS_C(objectname)); } if (modifierKeys.isEmpty()) { action->objects.insert(objectname, data); } else { action->objectUsingModifierKeys.insert(objectname, data); } objectNode = objectNode.nextSibling(); } action->isInstantaneous = false; action->render_key_sequence(key1, key2); bool exists = false; for (int i=0; ifact1_key1 == existingaction->fact1_key1) && (action->fact1_key2 == existingaction->fact1_key2) && (action->fact2_key1 == existingaction->fact2_key1) && (action->fact2_key2 == existingaction->fact2_key2) && (action->type == existingaction->type) ) { exists = true; QString errorstring = QString("InputEngine:: keyfact with: type=%1, key1='%2', key2='%3' already exists!\n" "You should only define keyfact types one time!!\n").arg(keyFactType).arg(key1).arg(key2); printf(QS_C(errorstring)); info().warning(errorstring); break; } } if (!exists) { m_ieActions.append(action); PMESG2("ADDED action: type=%d keys=%d,%d,%d,%d useX=%d useY=%d, slot=%s", action->type, action->fact1_key1,action->fact1_key2,action->fact2_key1,action->fact2_key2,data->useX,data->useY, QS_C(data->slotsignature)); } keyfactNode = keyfactNode.nextSibling(); } PMESG2("Optimizing map for best performance ..."); int optimizedActions=0; foreach(IEAction* action, m_ieActions) { int c1A = action->fact1_key1; int c2A = action->fact1_key2; if ( (action->type == FKEY) ) { bool alone = true; foreach(IEAction* aloneAction, m_ieActions) { if (action == aloneAction) continue; int tt = aloneAction->type; int t1A = aloneAction->fact1_key1; if ( (t1A==c1A) && ( (tt==D_FKEY) || (tt==FHKEY) || (tt==S_FKEY_FKEY) || (tt==S_FKEY_FKEY2) || (tt==S_FKEY_HKEY) || (tt==S_FKEY_HKEY2) ) ) alone=false; } if (alone) { PMESG3("Setting fact (slot=%s) as protected (Instantaneous response)", action->keySequence.data()); action->isInstantaneous = true; optimizedActions++; } else action->isInstantaneous = false; } else if ((action->type == FKEY2)) { bool alone = true; foreach(IEAction* aloneAction, m_ieActions) { if (action == aloneAction) continue; int tt = aloneAction->type; int t1A = aloneAction->fact1_key1; int t2A = aloneAction->fact1_key2; if ( ((t1A==c1A) && (t2A==c2A)) && ( (tt==HOLDKEY) || (tt==D_FKEY2) || (tt==S_FKEY2_FKEY) || (tt==S_FKEY2_FKEY2)|| (tt==S_FKEY2_HKEY) || (tt==S_FKEY2_HKEY2) ) ) alone=false; } if (alone) { PMESG3("Setting fact (slot=%s) for instantaneous response", action->keySequence.data()); action->isInstantaneous = true; optimizedActions++; } else action->isInstantaneous = false; } } PMESG2("Keymap initialized! %d actions registered ( %d instantanious) .", m_ieActions.size(), optimizedActions); return 1; } void InputEngine::set_clear_time(int time) { clearTime = time; } void InputEngine::set_hold_sensitiveness(int htime) { assumeHoldTime=htime; } void InputEngine::set_double_fact_interval(int time) { doubleFactWaitTime = time; } // Number colector bool InputEngine::check_number_collection(int eventcode) { if (((eventcode >= Qt::Key_0) && (eventcode <= Qt::Key_9)) || (eventcode == Qt::Key_Comma) || (eventcode == Qt::Key_Period)) { sCollectedNumber.append( QChar(eventcode) ); // it had a ",1" complement after fact1_k1... why? PMESG("Collected %s so far...", QS_C(sCollectedNumber) ) ; QString sn = "NUMBER " + sCollectedNumber; collectedNumber = sCollectedNumber.toInt(); if (holdingCommand) { holdingCommand->set_collected_number(sCollectedNumber); } return true; } if (eventcode == Qt::Key_Backspace) { if (sCollectedNumber.size() > 0) { sCollectedNumber = sCollectedNumber.left(sCollectedNumber.size() - 1); if (holdingCommand) { holdingCommand->set_collected_number(sCollectedNumber); } } return true; } if (eventcode == Qt::Key_Minus) { if (sCollectedNumber.contains("-")) { sCollectedNumber = sCollectedNumber.remove("-"); } else { sCollectedNumber.prepend("-"); } if (holdingCommand) { holdingCommand->set_collected_number(sCollectedNumber); } } return false; } void InputEngine::stop_collecting() { PENTER3; collectedNumber = sCollectedNumber.toInt(); sCollectedNumber = ""; } int InputEngine::collected_number( ) { int n = collectedNumber; sCollectedNumber = "-1"; // collectedNumber has a life of only one get. return n; } bool InputEngine::is_holding( ) { return isHolding; } Command * InputEngine::get_holding_command() const { return holdingCommand; } void InputEngine::create_menudata_for_metaobject(const QMetaObject * mo, QList< MenuData > & list) const { const char* classname = mo->className(); for (int i=0; i datalist; datalist.append(ieaction->objects.value(classname)); datalist.append(ieaction->objectUsingModifierKeys.value(classname)); foreach(IEAction::Data* iedata, datalist) { if ( ! iedata ) { continue; } MenuData menudata; if ( ! iedata->pluginname.isEmpty() ) { CommandPlugin* plug = m_commandplugins.value(iedata->pluginname); if ( ! plug) { continue; } int classInfoIndex = plug->metaObject()->indexOfClassInfo(QS_C(iedata->commandname)); if (classInfoIndex >= 0) { QMetaClassInfo classInfo = plug->metaObject()->classInfo(classInfoIndex); // Set the translated string! menudata.description = QCoreApplication::translate(classname, classInfo.value()); } else { menudata.description = QString("Add a Q_CLASSINFO() in CommandPlug %1.h, Command %2 please") .arg(iedata->pluginname).arg(iedata->commandname); PWARN("%s", QS_C(menudata.description)); } } else { int classInfoIndex = mo->indexOfClassInfo(QS_C(iedata->slotsignature)); int methodIndex = -1; for (int i=0; i < mo->methodCount(); i++) { if ( ! (mo->method(i).methodType() == QMetaMethod::Slot) ) { continue; } QString slotsignature = mo->method(i).signature(); slotsignature = slotsignature.left(slotsignature.indexOf("(")); if (iedata->slotsignature == slotsignature) { methodIndex = i; break; } } if (classInfoIndex >= 0 && methodIndex >= 0) { QMetaClassInfo classInfo = mo->classInfo(classInfoIndex); // Set the translated string! menudata.description = QCoreApplication::translate(classname, classInfo.value()); } else { if (methodIndex >= 0) { menudata.description = QString("Add a Q_CLASSINFO() for %1::%2 please") .arg(classname).arg(iedata->slotsignature); PWARN("%s", QS_C(menudata.description)); } else { continue; } } } menudata.keysequence = ieaction->keySequence; menudata.iedata = ieaction->keySequence; menudata.sortorder = iedata->sortorder; menudata.submenu = iedata->submenu; menudata.modifierkeys = iedata->modifierkeys; if (menudata.modifierkeys.size()) { menudata.iedata.prepend("++"); } list.append(menudata); } } } QList< MenuData > InputEngine::create_menudata_for(QObject* item) { QList list; ContextItem* contextitem; do { const QMetaObject* mo = item->metaObject(); create_menudata_for_metaobject(mo, list); contextitem = qobject_cast(item); } while (contextitem && (item = contextitem->get_context()) ); return list; } //---------- EVENT CATCHER ------------- EventCatcher::EventCatcher() { holdTimer.setSingleShot(true); connect( &holdTimer, SIGNAL(timeout()), this, SLOT(assume_hold())); connect( &secondChanceTimer, SIGNAL(timeout()), this, SLOT(quit_second_chance())); connect( &clearOutputTimer, SIGNAL(timeout()), this, SLOT(clear_output())); } void EventCatcher::assume_hold() // no release so far ? so consider it a hold... { PENTER3; PMESG3("No release so far (waited %d ms). Assuming this is a hold and dispatching it",ie().assumeHoldTime); holdTimer.stop(); // quit the holding check.. ie().isHolding = true; ie().dispatch_hold(); } void EventCatcher::clear_output() { PENTER3; if ((ie().isHoldingOutput)) { clearOutputTimer.stop(); ie().isHoldingOutput=false; } } void EventCatcher::quit_second_chance() { PENTER3; secondChanceTimer.stop(); if (!ie().isHolding) // if it is holding, there is no need to push a new fact { PMESG3("No second fact (waited %d ms) ... Forcing a null second fact",ie().doubleFactWaitTime); ie().push_fact(0,0); // no second press performed, so I am adding a pair of Zeros as second press and keep going... } } void IEAction::render_key_sequence(const QString& key1, const QString& key2) { switch(type) { case FKEY: keySequence = QString("< " + key1 + " >").toAscii().data(); break; case FKEY2: keySequence = QString("< " + key1 + " " + key2 + " >").toAscii().data(); break; case HOLDKEY: keySequence = QString("[ " + key1 + " ]").toAscii().data(); break; case HKEY2: keySequence = QString("[ " + key1 + " " + key2 + " ]").toAscii().data(); break; case D_FKEY: keySequence = QString("<< " + key1 + " >>").toAscii().data(); break; case D_FKEY2: keySequence = QString("<< " + key1 + " " + key2 + " >>").toAscii().data(); break; case S_FKEY_FKEY: keySequence = QString("> " + key1 + " > " + key2).toAscii().data(); break; default : keySequence = "Unknown Key Sequence"; } } IEAction::~ IEAction() { foreach(Data* data, objects) { delete data; } foreach(Data* data, objectUsingModifierKeys) { delete data; } } traverso-0.49.4/src/core/AudioClip.cpp000755 001750 001750 00000062607 11427545517 020104 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2008 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include #include #include "ContextItem.h" #include "ReadSource.h" #include "AudioClip.h" #include "AudioSource.h" #include "WriteSource.h" #include "Sheet.h" #include "SnapList.h" #include "Track.h" #include "AudioChannel.h" #include #include #include "Mixer.h" #include "DiskIO.h" #include "Export.h" #include "AudioClipManager.h" #include "ResourcesManager.h" #include "Curve.h" #include "FadeCurve.h" #include "Tsar.h" #include "ProjectManager.h" #include "Peak.h" #include "ContextPointer.h" #include "Project.h" #include "Utils.h" #include "Information.h" #include #include "PluginChain.h" #include "GainEnvelope.h" #include "InputEngine.h" #include "AbstractAudioReader.h" #include // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" /** * \class AudioClip \brief Represents (part of) an audiofile. */ AudioClip::AudioClip(const QString& name) : Snappable() , m_name(name) { PENTERCONS; m_isMuted=false; m_id = create_id(); m_readSourceId = m_sheetId = 0; init(); } AudioClip::AudioClip(const QDomNode& node) : Snappable() , m_track(0) , m_sheet(0) , m_readSource(0) { PENTERCONS; QDomNode clipNode = node.firstChild(); // It makes sense to set these values at this time allready // they are for example used by the ResourcesManager! QDomElement e = node.toElement(); m_id = e.attribute("id", "").toLongLong(); m_readSourceId = e.attribute("source", "").toLongLong(); m_sheetId = e.attribute("sheet", "0").toLongLong(); m_name = e.attribute( "clipname", "" ) ; m_isMuted = e.attribute( "mute", "" ).toInt(); // FIXME!!!!!!! bool ok; m_length = TimeRef(e.attribute( "length", "0" ).toLongLong(&ok)); m_sourceStartLocation = TimeRef(e.attribute( "sourcestart", "" ).toLongLong(&ok)); m_sourceEndLocation = m_sourceStartLocation + m_length; TimeRef location(e.attribute( "trackstart", "" ).toLongLong(&ok)); set_track_start_location(location); m_domNode = node.cloneNode(); init(); } AudioClip::~AudioClip() { PENTERDES; if (m_readSource) { m_sheet->get_diskio()->unregister_read_source(m_readSource); delete m_readSource; } if (m_peak) { m_peak->close(); } } void AudioClip::init() { QObject::tr("AudioClip"); m_sheet = 0; m_track = 0; m_readSource = 0; m_peak = 0; m_recordingStatus = NO_RECORDING; m_isReadSourceValid = m_isMoving = false; m_isLocked = config().get_property("AudioClip", "LockByDefault", false).toBool(); fadeIn = 0; fadeOut = 0; m_pluginChain = new PluginChain(this); m_fader = m_pluginChain->get_fader(); m_fader->automate_port(0, true); m_fader->set_gain(1.0); } int AudioClip::set_state(const QDomNode& node) { PENTER; Q_ASSERT(m_sheet); QDomElement e = node.toElement(); m_isTake = e.attribute( "take", "").toInt(); set_gain( e.attribute( "gain", "" ).toFloat() ); m_isLocked = e.attribute( "locked", "0" ).toInt(); m_readSourceId = e.attribute("source", "").toLongLong(); m_sheetId = e.attribute("sheet", "0").toLongLong(); m_isMuted = e.attribute( "mute", "" ).toInt(); bool ok; m_sourceStartLocation = TimeRef(e.attribute( "sourcestart", "" ).toLongLong(&ok)); m_length = TimeRef(e.attribute( "length", "0" ).toLongLong(&ok)); m_sourceEndLocation = m_sourceStartLocation + m_length; TimeRef location(e.attribute( "trackstart", "" ).toLongLong(&ok)); set_track_start_location(location); emit stateChanged(); QDomElement fadeInNode = node.firstChildElement("FadeIn"); if (!fadeInNode.isNull()) { if (!fadeIn) { fadeIn = new FadeCurve(this, m_sheet, "FadeIn"); fadeIn->set_history_stack(get_history_stack()); private_add_fade(fadeIn); } fadeIn->set_state( fadeInNode ); } QDomElement fadeOutNode = node.firstChildElement("FadeOut"); if (!fadeOutNode.isNull()) { if (!fadeOut) { fadeOut = new FadeCurve(this, m_sheet, "FadeOut"); fadeOut->set_history_stack(get_history_stack()); private_add_fade(fadeOut); } fadeOut->set_state( fadeOutNode ); } QDomNode pluginChainNode = node.firstChildElement("PluginChain"); if (!pluginChainNode.isNull()) { m_pluginChain->set_state(pluginChainNode); } return 1; } QDomNode AudioClip::get_state( QDomDocument doc ) { QDomElement node = doc.createElement("Clip"); node.setAttribute("trackstart", m_trackStartLocation.universal_frame()); node.setAttribute("sourcestart", m_sourceStartLocation.universal_frame()); node.setAttribute("length", m_length.universal_frame()); node.setAttribute("mute", m_isMuted); node.setAttribute("take", m_isTake); node.setAttribute("clipname", m_name ); node.setAttribute("id", m_id ); node.setAttribute("sheet", m_sheetId ); node.setAttribute("locked", m_isLocked); node.setAttribute("source", m_readSourceId); if (fadeIn) { node.appendChild(fadeIn->get_state(doc)); } if (fadeOut) { node.appendChild(fadeOut->get_state(doc)); } QDomNode pluginChainNode = doc.createElement("PluginChain"); pluginChainNode.appendChild(m_pluginChain->get_state(doc)); node.appendChild(pluginChainNode); return node; } void AudioClip::toggle_mute() { PENTER; m_isMuted=!m_isMuted; set_sources_active_state(); emit muteChanged(); } void AudioClip::toggle_lock() { m_isLocked = !m_isLocked; emit lockChanged(); } void AudioClip::track_audible_state_changed() { set_sources_active_state(); } void AudioClip::set_sources_active_state() { if (! m_track) { return; } if (! m_readSource) { return; } bool syncDuringDrag = config().get_property("AudioClip", "SyncDuringDrag", false).toBool(); bool stopSyncDueMove; if (m_isMoving && syncDuringDrag) { stopSyncDueMove = false; } else if (m_isMoving && !syncDuringDrag){ stopSyncDueMove = true; } else { stopSyncDueMove = false; } if ( m_track->is_muted() || m_track->is_muted_by_solo() || is_muted() || stopSyncDueMove) { m_readSource->set_active(false); } else { m_readSource->set_active(true); } } void AudioClip::set_left_edge(TimeRef newLeftLocation) { if (newLeftLocation < qint64(0)) { newLeftLocation = TimeRef(); } if (newLeftLocation < m_trackStartLocation) { TimeRef availableTimeLeft = m_sourceStartLocation; TimeRef movingToLeft = m_trackStartLocation - newLeftLocation; if (movingToLeft > availableTimeLeft) { movingToLeft = availableTimeLeft; } set_source_start_location( m_sourceStartLocation - movingToLeft ); set_track_start_location(m_trackStartLocation - movingToLeft); } else if (newLeftLocation > m_trackStartLocation) { TimeRef availableTimeRight = m_length; TimeRef movingToRight = newLeftLocation - m_trackStartLocation; if (movingToRight > (availableTimeRight - TimeRef(nframes_t(4), get_rate())) ) { movingToRight = (availableTimeRight - TimeRef(nframes_t(4), get_rate())); } set_source_start_location( m_sourceStartLocation + movingToRight ); set_track_start_location(m_trackStartLocation + movingToRight); } } void AudioClip::set_right_edge(TimeRef newRightLocation) { if (newRightLocation < TimeRef()) { newRightLocation = TimeRef(); } if (newRightLocation > m_trackEndLocation) { TimeRef availableTimeRight = m_sourceLength - m_sourceEndLocation; TimeRef movingToRight = newRightLocation - m_trackEndLocation; if (movingToRight > availableTimeRight) { movingToRight = availableTimeRight; } set_source_end_location( m_sourceEndLocation + movingToRight ); set_track_end_location( m_trackEndLocation + movingToRight ); } else if (newRightLocation < m_trackEndLocation) { TimeRef availableTimeLeft = m_length; TimeRef movingToLeft = m_trackEndLocation - newRightLocation; if (movingToLeft > availableTimeLeft - TimeRef(nframes_t(4), get_rate())) { movingToLeft = availableTimeLeft - TimeRef(nframes_t(4), get_rate()); } set_source_end_location( m_sourceEndLocation - movingToLeft); set_track_end_location( m_trackEndLocation - movingToLeft ); } } void AudioClip::set_source_start_location(const TimeRef& location) { m_sourceStartLocation = location; m_length = m_sourceEndLocation - m_sourceStartLocation; } void AudioClip::set_source_end_location(const TimeRef& location) { m_sourceEndLocation = location; m_length = m_sourceEndLocation - m_sourceStartLocation; } void AudioClip::set_track_start_location(const TimeRef& location) { PENTER2; m_trackStartLocation = location; // set_track_end_location will emit positionChanged(), so we // don't emit it in this function to avoid emitting it twice // (although it seems more logical to emit it here, there are // accasions where only set_track_end_location() is called, and // then we also want to emit positionChanged()) set_track_end_location(m_trackStartLocation + m_length); } void AudioClip::set_track_end_location(const TimeRef& location) { // PWARN("m_trackEndLocation is %d", endFrame); m_trackEndLocation = location; if (!is_moving()) { // TODO find out if we also have to call this even during moving? // And somehow Track itself should manage this, and not from here! // The purpose of this call is to keep the AudioClip list in track // sorted on the clips track start location. if (m_track) { THREAD_SAVE_INVOKE(m_track, this, clip_position_changed(AudioClip*)); } if (m_sheet) { m_sheet->get_snap_list()->mark_dirty(); } } emit positionChanged(); } void AudioClip::set_fade_in(double range) { if (!fadeIn) { create_fade_in(); } fadeIn->set_range(range); } void AudioClip::set_fade_out(double range) { if (!fadeOut) { create_fade_out(); } fadeOut->set_range(range); } void AudioClip::set_gain(float gain) { PENTER3; if (gain < 0.0) gain = 0.0; if (gain > 32.0) gain = 32.0; m_fader->set_gain(gain); emit stateChanged(); } void AudioClip::set_selected(bool selected) { emit stateChanged(); } // // Function called in RealTime AudioThread processing path // int AudioClip::process(nframes_t nframes) { Q_ASSERT(m_sheet); // Handle silence clips if (get_channels() == 0) { return 0; } if (m_recordingStatus == RECORDING) { process_capture(nframes); return 0; } if (!m_isReadSourceValid) { return -1; } if (m_isMuted || (get_gain() == 0.0f) ) { return 0; } Q_ASSERT(m_readSource); AudioBus* bus = m_sheet->get_clip_render_bus(); bus->silence_buffers(nframes); TimeRef mix_pos; int channelcount = get_channels(); audio_sample_t* mixdown[channelcount]; uint framesToProcess = nframes; int outputRate = m_readSource->get_output_rate(); TimeRef transportLocation = m_sheet->get_transport_location(); TimeRef upperRange = transportLocation + TimeRef(framesToProcess, outputRate); if ( (m_trackStartLocation < upperRange) && (m_trackEndLocation > transportLocation) ) { if (transportLocation < m_trackStartLocation) { // Using to_frame() for both the m_trackStartLocation and transportLocation seems to round // better then using (m_trackStartLocation - transportLocation).to_frame() // TODO : find out why! uint offset = (m_trackStartLocation).to_frame(outputRate) - transportLocation.to_frame(outputRate); mix_pos = m_sourceStartLocation; // printf("offset %d\n", offset); for (int chan=0; changet_channel_count(); ++chan) { audio_sample_t* buf = bus->get_buffer(chan, framesToProcess); mixdown[chan] = buf + offset; } framesToProcess = framesToProcess - offset; } else { mix_pos = (transportLocation - m_trackStartLocation + m_sourceStartLocation); // printf("else: Setting mix pos to start location %d\n", mix_pos.to_frame(96000)); for (int chan=0; changet_channel_count(); ++chan) { mixdown[chan] = bus->get_buffer(chan, framesToProcess); } } if (m_trackEndLocation < upperRange) { // Using to_frame() for both the upperRange and m_trackEndLocation seems to round // better then using (upperRange - m_trackEndLocation).to_frame() // TODO : find out why! framesToProcess -= upperRange.to_frame(outputRate) - m_trackEndLocation.to_frame(outputRate); // printf("if (m_trackEndLocation < upperRange): framesToProcess %d\n", framesToProcess); } } else { return 0; } uint read_frames = 0; if (m_sheet->realtime_path()) { read_frames = m_readSource->rb_read(mixdown, mix_pos, framesToProcess); } else { read_frames = m_readSource->file_read(m_sheet->renderDecodeBuffer, mix_pos, framesToProcess); if (read_frames > 0) { for (int chan=0; chanrenderDecodeBuffer->destination[chan], read_frames * sizeof(audio_sample_t)); } } } if (read_frames <= 0) { // printf("read_frames == 0\n"); return 0; } if (read_frames != framesToProcess) { printf("read_frames, framesToProcess %d, %d\n", read_frames, framesToProcess); } apill_foreach(FadeCurve* fade, FadeCurve, m_fades) { fade->process(bus, nframes); } TimeRef endlocation = mix_pos + TimeRef(read_frames, get_rate()); m_fader->process_gain(mixdown, mix_pos, endlocation, read_frames, channelcount); AudioBus* sendbus = m_sheet->get_render_bus(); // NEVER EVER FORGET that the mixing should be done on the WHOLE buffer, not just part of it // so use an unmodified nframes variable!!!!!!!!!!!!!!!!!!!!!!!!!!!1 if (channelcount == 1) { Mixer::mix_buffers_no_gain(sendbus->get_buffer(0, nframes), bus->get_buffer(0, nframes), nframes); Mixer::mix_buffers_no_gain(sendbus->get_buffer(1, nframes), bus->get_buffer(0, nframes), nframes); } else if (channelcount == 2) { Mixer::mix_buffers_no_gain(sendbus->get_buffer(0, nframes), bus->get_buffer(0, nframes), nframes); Mixer::mix_buffers_no_gain(sendbus->get_buffer(1, nframes), bus->get_buffer(1, nframes), nframes); } return 1; } // // Function called in RealTime AudioThread processing path // void AudioClip::process_capture(nframes_t nframes) { if (!m_captureBus) { return; } m_length.add_frames(nframes, get_rate()); nframes_t written = 0; if (m_track->capture_left_channel() && m_track->capture_right_channel()) { audio_sample_t* buffer[2]; buffer[0] = m_captureBus->get_buffer(0, nframes); buffer[1] = m_captureBus->get_buffer(1, nframes); written = m_recorder->rb_write(buffer, nframes); } else if (m_track->capture_left_channel()) { audio_sample_t* buffer[1]; buffer[0] = m_captureBus->get_buffer(0, nframes); written = m_recorder->rb_write(buffer, nframes); } else if (m_track->capture_right_channel()) { audio_sample_t* buffer[1]; buffer[0] = m_captureBus->get_buffer(1, nframes); written = m_recorder->rb_write(buffer, nframes); } if (written != nframes) { printf("couldn't write nframes %d to recording buffer for channel 0, only %d\n", nframes, written); } } int AudioClip::init_recording( QByteArray name ) { Q_ASSERT(m_sheet); Q_ASSERT(m_track); m_captureBusName = name; get_capture_bus(); if (!m_captureBus) { info().critical(tr("Unable to Record to Track")); info().warning(tr("AudioDevice doesn't have this Capture Bus: %1 (Track %2)"). arg(name.data()).arg(m_track->get_id()) ); return -1; } m_sourceStartLocation = TimeRef(); m_isTake = 1; m_recordingStatus = RECORDING; int channelcount; if (m_track->capture_left_channel() && m_track->capture_right_channel()) { channelcount = 2; } else { channelcount = 1; } ReadSource* rs = resources_manager()->create_recording_source( pm().get_project()->get_root_dir() + "/audiosources/", m_name, channelcount, m_sheet->get_id()); resources_manager()->set_source_for_clip(this, rs); QString sourceid = QString::number(rs->get_id()); ExportSpecification* spec = new ExportSpecification; spec->exportdir = pm().get_project()->get_root_dir() + "/audiosources/"; QString recordFormat = config().get_property("Recording", "FileFormat", "wav").toString(); if (recordFormat == "wavpack") { spec->writerType = "wavpack"; QString compression = config().get_property("Recording", "WavpackCompressionType", "fast").toString(); QString skipwvx = config().get_property("Recording", "WavpackSkipWVX", "false").toString(); spec->extraFormat["quality"] = compression; spec->extraFormat["skip_wvx"] = skipwvx; } else if (recordFormat == "w64") { spec->writerType = "sndfile"; spec->extraFormat["filetype"] = "w64"; } else { spec->writerType = "sndfile"; spec->extraFormat["filetype"] = "wav"; } spec->data_width = 1; // 1 means float spec->channels = channelcount; spec->sample_rate = audiodevice().get_sample_rate(); spec->src_quality = SRC_SINC_MEDIUM_QUALITY; spec->isRecording = true; spec->startLocation = TimeRef(); spec->endLocation = TimeRef(); spec->totalTime = TimeRef(); spec->blocksize = audiodevice().get_buffer_size(); spec->name = m_name + "-" + sourceid; spec->dataF = m_captureBus->get_buffer(0, audiodevice().get_buffer_size()); m_recorder = new WriteSource(spec); if (m_recorder->prepare_export() == -1) { delete m_recorder; delete spec; spec = 0; return -1; } m_recorder->set_process_peaks( true ); m_recorder->set_recording( true ); m_sheet->get_diskio()->register_write_source(m_recorder); connect(m_recorder, SIGNAL(exportFinished()), this, SLOT(finish_write_source())); connect(m_sheet, SIGNAL(transportStopped()), this, SLOT(finish_recording())); connect(&audiodevice(), SIGNAL(driverParamsChanged()), this, SLOT(get_capture_bus())); return 1; } Command* AudioClip::mute() { PCommand* cmd = new PCommand(this, "toggle_mute", tr("Toggle Mute")); cmd->set_historable(false); return cmd; } Command* AudioClip::lock() { PCommand* cmd = new PCommand(this, "toggle_lock", tr("Toggle Lock")); cmd->set_historable(false); return cmd; } Command* AudioClip::reset_fade_in() { if (fadeIn) { return new FadeRange(this, fadeIn, 1.0); } return 0; } Command* AudioClip::reset_fade_out() { if (fadeOut) { return new FadeRange(this, fadeOut, 1.0); } return 0; } Command* AudioClip::reset_fade_both() { if (!fadeOut && !fadeIn) { return 0; } CommandGroup* group = new CommandGroup(this, tr("Remove Fades")); if (fadeIn) { group->add_command(reset_fade_in()); } if (fadeOut) { group->add_command(reset_fade_out()); } return group; } AudioClip* AudioClip::create_copy( ) { PENTER; Q_ASSERT(m_sheet); Q_ASSERT(m_track); QDomDocument doc("AudioClip"); QDomNode clipState = get_state(doc); AudioClip* clip = new AudioClip(m_name); clip->set_sheet(m_sheet); clip->set_track(m_track); clip->set_state(clipState); return clip; } void AudioClip::set_audio_source(ReadSource* rs) { PENTER; if (!rs) { m_isReadSourceValid = false; return; } if (rs->get_error() < 0) { m_isReadSourceValid = false; } else { m_isReadSourceValid = true; } m_readSource = rs; m_readSourceId = rs->get_id(); m_sourceLength = rs->get_length(); // If m_length isn't set yet, it means we are importing stuff instead of reloading from project file. // it's a bit weak this way, hopefull I'll get up something better in the future. // The positioning-length-offset and such stuff is still a bit weak :( // NOTE: don't change, audio recording (finish_writesource()) assumes there is checked for length == 0 !!! if (m_length == TimeRef()) { m_sourceEndLocation = rs->get_length(); m_length = m_sourceEndLocation; } set_sources_active_state(); rs->set_audio_clip(this); if (m_recordingStatus == NO_RECORDING) { if (m_peak) { m_peak->close(); } if (m_isReadSourceValid) { m_peak = new Peak(rs); } } // This will also emit positionChanged() which is more or less what we want. set_track_end_location(m_trackStartLocation + m_sourceLength - m_sourceStartLocation); } void AudioClip::finish_write_source() { PENTER; Q_ASSERT(m_readSource); if (m_readSource->set_file(m_recorder->get_filename()) < 0) { PERROR("Setting file for ReadSource failed after finishing recording"); } else { m_sheet->get_diskio()->register_read_source(m_readSource); // re-inits the lenght from the audiofile due calling rsm->set_source_for_clip() m_length = TimeRef(); } delete m_recorder; m_recorder = 0; m_recordingStatus = NO_RECORDING; resources_manager()->set_source_for_clip(this, m_readSource); emit recordingFinished(this); } void AudioClip::finish_recording() { PENTER; m_recordingStatus = FINISHING_RECORDING; m_recorder->set_recording(false); disconnect(m_sheet, SIGNAL(transportStopped()), this, SLOT(finish_recording())); disconnect(&audiodevice(), SIGNAL(driverParamsChanged()), this, SLOT(get_capture_bus())); } int AudioClip::get_channels( ) const { if (m_readSource) { return m_readSource->get_channel_count(); } else { if (m_recorder) { return m_recorder->get_channel_count(); } } return 0; } Sheet* AudioClip::get_sheet( ) const { Q_ASSERT(m_sheet); return m_sheet; } Track* AudioClip::get_track( ) const { Q_ASSERT(m_track); return m_track; } void AudioClip::set_sheet( Sheet * sheet ) { m_sheet = sheet; if (m_readSource && m_isReadSourceValid) { m_sheet->get_diskio()->register_read_source( m_readSource ); } else { PWARN("AudioClip::set_sheet() : Setting Sheet, but no ReadSource available!!"); } m_sheetId = sheet->get_id(); set_history_stack(m_sheet->get_history_stack()); m_pluginChain->set_sheet(m_sheet); set_snap_list(m_sheet->get_snap_list()); } void AudioClip::set_track( Track * track ) { if (m_track) { disconnect(m_track, SIGNAL(audibleStateChanged()), this, SLOT(track_audible_state_changed())); } m_track = track; connect(m_track, SIGNAL(audibleStateChanged()), this, SLOT(track_audible_state_changed())); set_sources_active_state(); } void AudioClip::set_name( const QString& name ) { m_name = name; emit stateChanged(); } bool AudioClip::is_selected( ) { Q_ASSERT(m_sheet); return m_sheet->get_audioclip_manager()->is_clip_in_selection(this); } bool AudioClip::is_take( ) const { return m_isTake; } QString AudioClip::get_name( ) const { return m_name; } int AudioClip::get_bitdepth( ) const { if (m_readSource) { return m_readSource->get_bit_depth(); } return audiodevice().get_bit_depth(); } int AudioClip::get_rate( ) const { if (m_readSource) { return m_readSource->get_rate(); } return audiodevice().get_sample_rate(); } TimeRef AudioClip::get_source_length( ) const { return m_sourceLength; } int AudioClip::recording_state( ) const { return m_recordingStatus; } Command * AudioClip::normalize( ) { bool ok; float normfactor; double d = QInputDialog::getDouble(0, tr("Normalization"), tr("Set Normalization level:"), 0.0, -120, 0, 1, &ok); if (ok) { normfactor = calculate_normalization_factor(d); } if (!ok || (normfactor == get_gain())) { return ie().failure(); } return new PCommand(this, "set_gain", normfactor, get_gain(), tr("AudioClip: Normalize")); } float AudioClip::calculate_normalization_factor(float targetdB) { float target = dB_to_scale_factor (targetdB); if (target == 1.0f) { /* do not normalize to precisely 1.0 (0 dBFS), to avoid making it appear that we may have clipped. */ target -= FLT_EPSILON; } double maxamp = m_peak->get_max_amplitude(m_sourceStartLocation, m_sourceEndLocation); if (maxamp == 0.0f) { printf("AudioClip::normalization: max amplitude == 0\n"); /* don't even try */ return get_gain(); } if (maxamp == target) { printf("AudioClip::normalization: max amplitude == target amplitude\n"); /* we can't do anything useful */ return get_gain(); } /* compute scale factor */ return float(target/maxamp); } FadeCurve * AudioClip::get_fade_in( ) const { return fadeIn; } FadeCurve * AudioClip::get_fade_out( ) const { return fadeOut; } void AudioClip::private_add_fade( FadeCurve* fade ) { m_fades.append(fade); if (fade->get_fade_type() == FadeCurve::FadeIn) { fadeIn = fade; } else if (fade->get_fade_type() == FadeCurve::FadeOut) { fadeOut = fade; } } void AudioClip::private_remove_fade( FadeCurve * fade ) { if (fade == fadeIn) { fadeIn = 0; } else if (fade == fadeOut) { fadeOut = 0; } m_fades.remove(fade); } void AudioClip::create_fade_in( ) { fadeIn = new FadeCurve(this, m_sheet, "FadeIn"); fadeIn->set_shape("Fast"); fadeIn->set_history_stack(get_history_stack()); THREAD_SAVE_INVOKE_AND_EMIT_SIGNAL(this, fadeIn, private_add_fade(FadeCurve*), fadeAdded(FadeCurve*)); } void AudioClip::create_fade_out( ) { fadeOut = new FadeCurve(this, m_sheet, "FadeOut"); fadeOut->set_shape("Fast"); fadeOut->set_history_stack(get_history_stack()); THREAD_SAVE_INVOKE_AND_EMIT_SIGNAL(this, fadeOut, private_add_fade(FadeCurve*), fadeAdded(FadeCurve*)); } QDomNode AudioClip::get_dom_node() const { return m_domNode; } bool AudioClip::has_sheet() const { if (m_sheet) { return true; } return false; } ReadSource * AudioClip::get_readsource() const { return m_readSource; } void AudioClip::get_capture_bus() { m_captureBus = audiodevice().get_capture_bus(m_captureBusName); } void AudioClip::set_as_moving(bool moving) { m_isMoving = moving; set_snappable(!m_isMoving); set_sources_active_state(); } traverso-0.49.4/src/plugins/000755 001750 001750 00000000000 12360571561 016235 5ustar00remonremon000000 000000 traverso-0.49.4/src/plugins/Plugin.cpp000644 001750 001750 00000012714 12357215674 020212 0ustar00remonremon000000 000000 /* Copyright (C) 2006-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "Plugin.h" #include "AddRemove.h" #include "Curve.h" #include "Sheet.h" #include "Debugger.h" Plugin::Plugin(Sheet* sheet) : m_slave(0) , m_sheet(sheet) { m_bypass = false; } QDomNode Plugin::get_state(QDomDocument doc) { QDomElement node = doc.createElement("Plugin"); node.setAttribute("bypassed", is_bypassed()); QDomNode controlPortsNode = doc.createElement("ControlPorts"); foreach(PluginControlPort* port, m_controlPorts) { controlPortsNode.appendChild(port->get_state(doc)); } if (m_audioInputPorts.size() > 0) { QDomNode audioInputPortsNode = doc.createElement("AudioInputPorts"); foreach(AudioInputPort* port, m_audioInputPorts) { audioInputPortsNode.appendChild(port->get_state(doc)); } node.appendChild(audioInputPortsNode); } if (m_audioOutputPorts.size() > 0) { QDomNode audioOutputPortsNode = doc.createElement("AudioOutputPorts"); foreach(AudioOutputPort* port, m_audioOutputPorts) { audioOutputPortsNode.appendChild(port->get_state(doc)); } node.appendChild(audioOutputPortsNode); } node.appendChild(controlPortsNode); return node; } int Plugin::set_state(const QDomNode & node) { QDomElement e = node.toElement(); m_bypass = e.attribute( "bypassed", "0").toInt(); return 1; } Command* Plugin::toggle_bypass( ) { m_bypass = ! m_bypass; emit bypassChanged(); return (Command*) 0; } PluginControlPort* Plugin::get_control_port_by_index(int index) const { foreach(PluginControlPort* port, m_controlPorts) { if (port->get_index() == index) { return port; } } return 0; } void Plugin::automate_port(int index, bool automate) { PluginControlPort* port = get_control_port_by_index(index); if (!port) { PERROR("ControlPort with index %d does not exist", index); return; } port->set_use_automation(automate); } QDomNode PluginPort::get_state( QDomDocument doc ) { QDomElement node = doc.createElement("ControlPort"); node.setAttribute("index", (int) m_index); return node; } int PluginPort::set_state( const QDomNode & node ) { Q_UNUSED(node); return 1; } AudioInputPort::AudioInputPort(QObject* parent, int index) : PluginPort(parent, index) { } QDomNode AudioInputPort::get_state( QDomDocument doc ) { QDomElement node = doc.createElement("AudioInputPort"); node.setAttribute("index", m_index); return node; } int AudioInputPort::set_state( const QDomNode & node ) { QDomElement e = node.toElement(); m_index = e.attribute( "index", "-1").toInt(); return 1; } AudioOutputPort::AudioOutputPort(QObject* parent, int index) : PluginPort(parent, index) { } QDomNode AudioOutputPort::get_state( QDomDocument doc ) { QDomElement node = doc.createElement("AudioOutputPort"); node.setAttribute("index", (int) m_index); return node; } int AudioOutputPort::set_state( const QDomNode & node ) { QDomElement e = node.toElement(); m_index = e.attribute( "index", "-1").toInt(); return 1; } PluginControlPort::PluginControlPort(Plugin* parent, int index, float value) : PluginPort(parent, index) , m_curve(0) , m_plugin(parent) , m_value(value) , m_automation(false) { } PluginControlPort::PluginControlPort(Plugin* parent, const QDomNode node) : PluginPort(parent) , m_curve(0) , m_plugin(parent) , m_automation(false) { set_state(node); } QDomNode PluginControlPort::get_state(QDomDocument doc) { QDomElement node = PluginPort::get_state(doc).toElement(); node.setAttribute("value", m_value); node.setAttribute("automation", m_automation); if (m_curve) { node.appendChild(m_curve->get_state(doc, "PortAutomation")); } return node; } int PluginControlPort::set_state(const QDomNode & node) { QDomElement e = node.toElement(); m_index = e.attribute("index", "-1").toInt(); m_value = e.attribute("value", "nan").toFloat(); m_automation = e.attribute("automation", "0").toInt(); QDomElement curveNode = node.firstChildElement("PortAutomation"); if (!curveNode.isNull()) { m_curve = new Curve(m_plugin, curveNode); m_curve->set_sheet(m_plugin->get_sheet()); } return 1; } QString PluginControlPort::get_description() { return m_description; } QString PluginControlPort::get_symbol() { return ""; } void PluginControlPort::set_control_value(float value) { m_value = value; } void PluginControlPort::set_use_automation(bool automation) { m_automation = automation; if (!m_curve) { m_curve = new Curve(m_plugin); // Add the first default node: CurveNode* node = new CurveNode(m_curve, 0.0, 1.0); AddRemove* cmd = (AddRemove*)m_curve->add_node(node, false); cmd->set_instantanious(true); Command::process_command(cmd); if (m_plugin->get_sheet()) { m_curve->set_sheet(m_plugin->get_sheet()); } } } bool PluginControlPort::use_automation() { return m_automation; } traverso-0.49.4/src/plugins/CMakeLists.txt000644 001750 001750 00000002157 12360571561 021002 0ustar00remonremon000000 000000 INCLUDE_DIRECTORIES( ${CMAKE_SOURCE_DIR}/src/common ${CMAKE_SOURCE_DIR}/src/core ${CMAKE_SOURCE_DIR}/src/engine ${CMAKE_SOURCE_DIR}/src/commands ${CMAKE_SOURCE_DIR}/src/plugins/native ${CMAKE_SOURCE_DIR}/src/plugins/LV2 ${QT_QTXML_INCLUDE_DIR} ) SET(TRAVERSO_PLUGINS_SOURCES PluginChain.cpp Plugin.cpp PluginManager.cpp PluginSlider.cpp native/CorrelationMeter.cpp native/SpectralMeter.cpp native/GainEnvelope.cpp PluginPropertiesDialog.cpp ) SET(TRAVERSO_PLUGINS_MOC_CLASSES Plugin.h PluginChain.h PluginPropertiesDialog.h PluginSlider.h native/CorrelationMeter.h native/GainEnvelope.h native/SpectralMeter.h ) IF(HAVE_LILV) SET(TRAVERSO_PLUGINS_SOURCES ${TRAVERSO_PLUGINS_SOURCES} LV2/LV2Plugin.cpp ) SET(TRAVERSO_PLUGINS_MOC_CLASSES ${TRAVERSO_PLUGINS_MOC_CLASSES} LV2/LV2Plugin.h ) ENDIF(HAVE_LILV) QT4_WRAP_CPP(TRAVERSO_PLUGINS_MOC_SOURCES ${TRAVERSO_PLUGINS_MOC_CLASSES}) SET(TRAVERSO_PLUGINS_LIBRARY "traversoplugins") ADD_LIBRARY(${TRAVERSO_PLUGINS_LIBRARY} STATIC ${TRAVERSO_PLUGINS_SOURCES} ${TRAVERSO_PLUGINS_MOC_SOURCES}) IF(USE_PCH) ADD_DEPENDENCIES(traversoplugins precompiled_headers) ENDIF(USE_PCH) traverso-0.49.4/src/plugins/PluginChain.cpp000644 001750 001750 00000006751 12357215350 021150 0ustar00remonremon000000 000000 /* Copyright (C) 2006 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "PluginChain.h" #include "Plugin.h" #include "PluginManager.h" #include #include #include #include "AudioBus.h" #include "GainEnvelope.h" #include "Curve.h" #include "Mixer.h" // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" PluginChain::PluginChain(ContextItem * parent) : ContextItem(parent) { m_fader = new GainEnvelope(0); } PluginChain::PluginChain(ContextItem* parent, Sheet* sheet) : ContextItem(parent) { m_fader = new GainEnvelope(sheet); set_sheet(sheet); } PluginChain::~ PluginChain() { PENTERDES; foreach(Plugin* plugin, m_pluginList) { delete plugin; } delete m_fader; } QDomNode PluginChain::get_state(QDomDocument doc) { QDomNode pluginsNode = doc.createElement("Plugins"); foreach(Plugin* plugin, m_pluginList) { pluginsNode.appendChild(plugin->get_state(doc)); } pluginsNode.appendChild(m_fader->get_state(doc)); return pluginsNode; } int PluginChain::set_state( const QDomNode & node ) { QDomNode pluginsNode = node.firstChildElement("Plugins"); QDomNode pluginNode = pluginsNode.firstChild(); while(!pluginNode.isNull()) { if (pluginNode.toElement().attribute( "type", "") == "GainEnvelope") { m_fader->set_state(pluginNode); } else { Plugin* plugin = PluginManager::instance()->get_plugin(pluginNode); if (!plugin) { pluginNode = pluginNode.nextSibling(); continue; } plugin->set_history_stack(get_history_stack()); private_add_plugin(plugin); } pluginNode = pluginNode.nextSibling(); } return 1; } Command* PluginChain::add_plugin(Plugin * plugin, bool historable) { plugin->set_history_stack(get_history_stack()); return new AddRemove( this, plugin, historable, m_sheet, "private_add_plugin(Plugin*)", "pluginAdded(Plugin*)", "private_remove_plugin(Plugin*)", "pluginRemoved(Plugin*)", tr("Add Plugin (%1)").arg(plugin->get_name())); } Command* PluginChain::remove_plugin(Plugin* plugin, bool historable) { return new AddRemove( this, plugin, historable, m_sheet, "private_remove_plugin(Plugin*)", "pluginRemoved(Plugin*)", "private_add_plugin(Plugin*)", "pluginAdded(Plugin*)", tr("Remove Plugin (%1)").arg(plugin->get_name())); } void PluginChain::private_add_plugin( Plugin * plugin ) { m_pluginList.append(plugin); } void PluginChain::private_remove_plugin( Plugin * plugin ) { int index = m_pluginList.indexOf(plugin); if (index >=0 ) { m_pluginList.removeAt(index); } else { PERROR("Plugin not found in list, this is invalid plugin remove!!!!!"); } } void PluginChain::set_sheet(Sheet * sheet) { m_sheet = sheet; set_history_stack(m_sheet->get_history_stack()); m_fader->set_sheet(sheet); } traverso-0.49.4/src/plugins/PluginChain.h000644 001750 001750 00000005011 12357215233 020601 0ustar00remonremon000000 000000 /* Copyright (C) 2006 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef PLUGIN_CHAIN_H #define PLUGIN_CHAIN_H #include #include #include #include "Plugin.h" #include "GainEnvelope.h" class Sheet; class AudioBus; class PluginChain : public ContextItem { Q_OBJECT public: PluginChain(ContextItem* parent); PluginChain(ContextItem* parent, Sheet* sheet); ~PluginChain(); QDomNode get_state(QDomDocument doc); int set_state(const QDomNode & node ); Command* add_plugin(Plugin* plugin, bool historable=true); Command* remove_plugin(Plugin* plugin, bool historable=true); void process_pre_fader(AudioBus* bus, unsigned long nframes); int process_post_fader(AudioBus* bus, unsigned long nframes); // void process_fader(audio_sample_t* buffer, nframes_t pos, nframes_t nframes) {m_fader->process_gain(buffer, pos, nframes);} void set_sheet(Sheet* sheet); QList get_plugin_list() {return m_pluginList;} GainEnvelope* get_fader() const {return m_fader;} private: QList m_pluginList; GainEnvelope* m_fader; Sheet* m_sheet; signals: void pluginAdded(Plugin* plugin); void pluginRemoved(Plugin* plugin); private slots: void private_add_plugin(Plugin* plugin); void private_remove_plugin(Plugin* plugin); }; inline void PluginChain::process_pre_fader(AudioBus * bus, unsigned long nframes) { return; for (int i=0; iprocess(bus, nframes); } } inline int PluginChain::process_post_fader(AudioBus * bus, unsigned long nframes) { if (!m_pluginList.size()) { return 0; } for (int i=0; iprocess(bus, nframes); } return 1; } #endif //eof traverso-0.49.4/src/plugins/PluginManager.h000644 001750 001750 00000002561 12356231673 021145 0ustar00remonremon000000 000000 /* Copyright (C) 2006-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef PLUGIN_MANAGER_H #define PLUGIN_MANAGER_H #if defined (LV2_SUPPORT) #include #endif #include class Plugin; class PluginManager { public: ~PluginManager(); static PluginManager* instance(); Plugin* get_plugin(const QDomNode node); #if defined (LV2_SUPPORT) const LilvPlugins* get_lilv_plugins(); LilvWorld* get_lilv_world() {return m_lilvWorld;} Plugin* create_lv2_plugin(const QString& uri); #endif private: PluginManager(); static PluginManager* m_instance; #if defined (LV2_SUPPORT) LilvWorld* m_lilvWorld; const LilvPlugins* m_lilvPlugins; #endif void init(); }; #endif //eof traverso-0.49.4/src/plugins/native/000755 001750 001750 00000000000 11163362200 017507 5ustar00remonremon000000 000000 traverso-0.49.4/src/plugins/native/CorrelationMeter.cpp000644 001750 001750 00000021543 11163362147 023510 0ustar00remonremon000000 000000 /*Copyright (C) 2006 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: CorrelationMeter.cpp,v 1.6 2008/02/10 23:47:06 n_doebelin Exp $ */ #include "CorrelationMeter.h" #include #include #include #include #include // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" #define BUFFER_READOUT_TOLERANCE 2 // recommended: 1-10 #define RINGBUFFER_SIZE 150 #define METER_COLLAPSE_SPEED 0.05 CorrelationMeter::CorrelationMeter() : Plugin() { // constructs a ringbuffer that can hold 150 CorrelationMeterData structs m_databuffer = new RingBufferNPT(RINGBUFFER_SIZE); // Initialize member variables, that need to be initialized calculate_fract(); // With memset, we're able to very efficIf there is no new data in the ringbuffer, fill it with default values, // otherwise the meter will stop working between clipsiently set all bytes of an array // or struct to zero memset(&m_history, 0, sizeof(CorrelationMeterData)); m_bufferreadouts = 0; connect(&audiodevice(), SIGNAL(driverParamsChanged()), this, SLOT(calculate_fract())); } CorrelationMeter::~CorrelationMeter() { delete m_databuffer; } QDomNode CorrelationMeter::get_state( QDomDocument doc ) { QDomElement node = doc.createElement("Plugin"); node.setAttribute("type", "CorrelationMeterPlugin"); node.setAttribute("bypassed", is_bypassed()); return node; } int CorrelationMeter::set_state(const QDomNode & node ) { QDomElement e = node.toElement(); m_bypass = e.attribute( "bypassed", "0").toInt(); return 1; } int CorrelationMeter::init() { return 1; } void CorrelationMeter::process(AudioBus* bus, unsigned long nframes) { if ( is_bypassed() ) { return; } // check if audiobus is stereo (2 channels) // if not, do nothing if (bus->get_channel_count() != 2) return; // The nframes is the amount of samples there are in the buffers // we have to process. No need to get the buffersize, we _have_ to // use the nframes variable ! audio_sample_t* bufferLeft = bus->get_buffer(0, nframes); audio_sample_t* bufferRight = bus->get_buffer(1, nframes); // Variables we need to calculate the correlation and avarages/levels float a1, a2, a1a2 = 0, a1sq = 0, a2sq = 0, r, levelLeft = 0, levelRight = 0; // calculate coefficient for (uint i = 0; i < nframes; ++i) { a1 = bufferLeft[i]; a2 = bufferRight[i]; a1a2 += a1 * a2; a1sq += a1 * a1; a2sq += a2 * a2; levelLeft += a1sq; levelRight += a2sq; } // We have all data to calculate the correlation coefficient // for the processed buffer (but check for division by 0 first) if ((a1sq == 0.0) || (a2sq == 0.0)) { r = 1.0; } else { r = a1a2 / (sqrtf(a1sq) * sqrtf(a2sq)); } // calculate RMS of the levels levelLeft = sqrtf(levelLeft / nframes); levelRight = sqrtf(levelRight / nframes); // And we store this in a CorrelationMeterData struct // and write this struct into the data ringbuffer, // to be processed later in get_data() // levelLeft and levelRight are also needed to calculate the // correct direction in get_data(), so we store that too! CorrelationMeterData data; data.r = r; data.levelLeft = levelLeft; data.levelRight = levelRight; // The ringbuffer::write function acts like it's appending the data // to the end of the buffer. // The amount of CorrelationMeterData structs we want to write is 1, and // we have to provide a pointer to the data we want to write, which // is done by dereferencing (the & in front of) data. // // This would also have worked (since it's essentially the same): // CorrelationMeterData* datatowrite = &data; // m_databuffer->write(datatowrite, 1); // // If we want to write more then 1 CorrelationMeterData struct, we have to // place them into an array, but well, there's only one now :-) m_databuffer->write(&data, 1); } /** * Compute the correlation coefficient of the stereo master output data * of the active sheet, and the direction. When there is new data, the new * data will be assigned to the \a r and \a direction variables, else no * data will be assigned to those variables * * r: linear correlation coefficient (1.0: complete positive correlation, * 0.0: uncorrelated, -1.0: complete negative correlation). * * @returns 0 if no new data was available, > 0 when new data was available * The new data will be assigned to \a r and \a direction **/ int CorrelationMeter::get_data(float& r, float& direction) { // RingBuffer::read_space() tells us how many data // of type T (CorrelationMeterData in this case) has been written // to the buffer since last time we checked. int readcount = m_databuffer->read_space(); // Create an empty CorrelationMeterData struct data, CorrelationMeterData data; // We need to know the 'history' of these variables to get a smooth // and consistent (independend of buffersizes) stereometer behaviour. // So we get it from our history struct. r = m_history.r; float levelLeft = m_history.levelLeft; float levelRight = m_history.levelRight; // If there is no new data in the buffer, this may have 2 reasons: // // 1) too fast readout, buffer is not ready again // 2) no data available because no data is played back (e.g. between clips) // // We want to distinguish the two cases, because the behavour of the meter // should be different. In case 1) we just ignore the update and do nothing, // the next cycle will probably have data available again. In case 2) we // want to use dummy values instead, because that's what the meter should // display if silence is played. The trick to achieve this is to ignore a // certain number of buffer readouts (defined in BUFFER_READOUT_TOLERANCE). // If more readouts occur in a row, we assume that silence is played back, // and start collapsing the meter to r = 1.0 in the center. if (readcount <= 0) { // add another 'if' to avoid unlimited growth of the variable if (m_bufferreadouts < RINGBUFFER_SIZE) { m_bufferreadouts++; } // check if dummy values should be stored in the buffer, or // if the readout should be ignored if (m_bufferreadouts >= BUFFER_READOUT_TOLERANCE) { // set the return value to > 0 to trigger widget update readcount = 1; data.r = 1.0; // must be != 0, otherwise the direction does not drift to the center data.levelLeft = METER_COLLAPSE_SPEED; data.levelRight = METER_COLLAPSE_SPEED; // This is ugly, there shouldn't be a loop here. Maybe it is possible without. // The loop makes sure that the collapse speed is independent of the buffer size for (int i = 0; i < METER_COLLAPSE_SPEED / m_fract; ++i) { r = data.r * m_fract + r * (1.0 - m_fract); levelLeft = data.levelLeft * m_fract + levelLeft * (1.0 - m_fract); levelRight = data.levelRight * m_fract + levelRight * (1.0 - m_fract); } } else { // no new data, return 0 to suppress widget update return 0; } } else { m_bufferreadouts = 0; for (int i=0; iread(&data, 1); // Calculate the new correlation variable, and merge the old one. // Assign it to r itself, this spares a temp. variable for r ;-) r = data.r * m_fract + r * (1.0 - m_fract); // Same for levelLeft/Right levelLeft = data.levelLeft * m_fract + levelLeft * (1.0 - m_fract); levelRight = data.levelRight * m_fract + levelRight * (1.0 - m_fract); } } // Now that we truely have taken into account all the levelLeft/Right data // for all buffers that have been processed since last call to get_data() // we now can calculate the direction variable. if (levelLeft + levelRight == 0.0) { direction = 0.0; } else { float vl = levelLeft / (levelLeft + levelRight); float vr = levelRight / (levelLeft + levelRight); direction = vr - vl; } // Store the calculated variables in the history struct, to be used on // next call of this function m_history.r = r; m_history.levelLeft = levelLeft; m_history.levelRight = levelRight; return readcount; } void CorrelationMeter::calculate_fract( ) { m_fract = ((float) audiodevice().get_buffer_size()) / (audiodevice().get_sample_rate()); } QString CorrelationMeter::get_name( ) { return QString(tr("Correlation Meter")); } traverso-0.49.4/src/plugins/native/SpectralMeter.h000644 001750 001750 00000004222 11163362147 022444 0ustar00remonremon000000 000000 /* Copyright (C) 2006 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: SpectralMeter.h,v 1.5 2008/02/07 12:52:57 n_doebelin Exp $ */ #ifndef SPECTRAL_METER_H #define SPECTRAL_METER_H #include "Plugin.h" #include "defines.h" #include #include #include class AudioBus; struct SpectralMeterData { audio_sample_t* bufferLeft; audio_sample_t* bufferRight; }; class SpectralMeter : public Plugin { Q_OBJECT public: SpectralMeter(); ~SpectralMeter(); int init(); QDomNode get_state(QDomDocument doc); int set_state(const QDomNode & node ); void process(AudioBus* bus, unsigned long nframes); QString get_name(); int get_fr_size(); void set_fr_size(int); int get_windowing_function(); void set_windowing_function(int); int get_data(QVector& specl, QVector& specr); private: int m_frlen; int m_windowingFunction; int m_bufferreadouts; // FFTW globals fftw_plan pfegl, pfegr; fftw_complex *fftspecl,*fftspecr; double *fftsigl,*fftsigr,*win; RingBufferNPT* m_databufferL; RingBufferNPT* m_databufferR; float *NFArray(int size){ float *p; p = (float *)calloc(size,sizeof(*p)); return p; } double *NDArray(int size){ double *p; p = (double *)calloc(size,sizeof(*p)); return p; } int *NIArray(int size){ int *p; p = (int *)calloc(size,sizeof(*p)); return p; } fftw_complex *NFFTWArray(int size){ fftw_complex *p; p = (fftw_complex *)fftw_malloc(size*sizeof(*p)); return p; } }; #endif traverso-0.49.4/src/plugins/native/SpectralMeter.cpp000644 001750 001750 00000013675 11163362147 023013 0ustar00remonremon000000 000000 /*Copyright (C) 2006 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: SpectralMeter.cpp,v 1.9 2008/02/15 15:58:57 n_doebelin Exp $ */ #include "SpectralMeter.h" #include #include #include #include // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" #define PI 3.141592653589 #define BUFFER_READOUT_TOLERANCE 2 // recommended: 1-10 SpectralMeter::SpectralMeter() : Plugin() { m_frlen = 2048; m_windowingFunction = 1; m_bufferreadouts = 0; (int) init(); // constructs a ringbuffer that can hold 16384 samples m_databufferL = new RingBufferNPT(16384); m_databufferR = new RingBufferNPT(16384); } SpectralMeter::~SpectralMeter() { delete m_databufferL; delete m_databufferR; } QDomNode SpectralMeter::get_state( QDomDocument doc ) { QDomElement node = doc.createElement("Plugin"); node.setAttribute("type", "SpectralMeterPlugin"); node.setAttribute("bypassed", is_bypassed()); return node; } int SpectralMeter::set_state(const QDomNode & node ) { QDomElement e = node.toElement(); m_bypass = e.attribute( "bypassed", "0").toInt(); return 1; } int SpectralMeter::init() { fftsigl = NDArray(m_frlen); // array of input values (windowed samples) fftsigr = NDArray(m_frlen); // array of input values (windowed samples) fftspecl = NFFTWArray(m_frlen/2 + 1); // array of output values (complex numbers) fftspecr = NFFTWArray(m_frlen/2 + 1); // array of output values (complex numbers) pfegl = fftw_plan_dft_r2c_1d(m_frlen, fftsigl, fftspecl, FFTW_ESTIMATE); pfegr = fftw_plan_dft_r2c_1d(m_frlen, fftsigr, fftspecr, FFTW_ESTIMATE); win = NDArray(m_frlen); switch (m_windowingFunction) { case 0: // rectangle for (int i = 0; i < m_frlen; ++i) { win[i] = 1.0; } break; case 1: // hanning for (int i = 0; i < m_frlen; ++i) { win[i] = 0.5 - 0.5 * cos(2.0 * i * PI / m_frlen); } break; case 2: // hamming for (int i = 0; i < m_frlen; ++i) { win[i] = 0.54 - 0.46 * cos(2.0 * i * PI / m_frlen); } break; case 3: // blackman for (int i = 0; i < m_frlen; ++i) { win[i] = 0.42 - 0.5 * cos(2.0 * PI * i / m_frlen) + 0.08 * cos(4.0 * PI * i / m_frlen); } break; } // calculates the Hanning window (?) /* for (int i = 0; i < m_frlen; ++i) { win[i] = pow(sin(PI * i / m_frlen), 2); } */ return 1; } int SpectralMeter::get_fr_size() { return m_frlen; } void SpectralMeter::set_fr_size(int i) { m_frlen = i; } void SpectralMeter::set_windowing_function(int i) { m_windowingFunction = i; } int SpectralMeter::get_windowing_function() { return m_windowingFunction; } void SpectralMeter::process(AudioBus* bus, unsigned long nframes) { if ( is_bypassed() ) { return; } // The nframes is the amount of samples there are in the buffers // we have to process. No need to get the buffersize, we _have_ to // use the nframes variable ! m_databufferL->write(bus->get_buffer(0, nframes), nframes); m_databufferR->write(bus->get_buffer(1, nframes), nframes); } QString SpectralMeter::get_name( ) { return QString(tr("SpectralMeter Meter")); } // writes the fft output into two qvector (left and right channel). int SpectralMeter::get_data(QVector &specl, QVector &specr) { int readcount = m_databufferL->read_space(); // If there is not enough new data for an FFT window in the ringbuffer, // decide if the cycle should be ignored or if the fft spectrum should // be filled with 0. Ignore it as long as the number of readouts is // below the BUFFER_READOUT_TOLERANCE. if (readcount < m_frlen) { // add another 'if' to avoid unlimited growth of the variable if (m_bufferreadouts <= BUFFER_READOUT_TOLERANCE) { m_bufferreadouts++; } if (m_bufferreadouts >= BUFFER_READOUT_TOLERANCE) { // return spectra filled with 0 specl.clear(); specr.clear(); for (int i = 1; i < m_frlen/2 + 1; ++i) { specl.push_back(0.0); specr.push_back(0.0); } return -1; // return -1 to inform the receiver about silence } else { return 0; } } else { m_bufferreadouts = 0; } specl.clear(); specr.clear(); // Create an empty SpectralMeterData struct data, float left = 0.0; float right = 0.0; // read samples (in chunks of buffer_size) from the ringbuffer until the FFT window is filled m_databufferL->read(&left, 1); m_databufferR->read(&right, 1); for (int i = 0; i < m_frlen; ++i) { m_databufferL->read(&left, 1); m_databufferR->read(&right, 1); fftsigl[i] = (double)left * win[i]; fftsigr[i] = (double)right * win[i]; } // do the FFT calculations for the left and right channel fftw_execute(pfegl); fftw_execute(pfegr); float tmp; bool isNullL = true, isNullR = true; // send the fft spectrum to the caller for (int i = 1; i < m_frlen/2 + 1; ++i) { tmp = pow((float)fftspecl[i][0],2.0f) + pow((float)fftspecl[i][1],2.0f); specl.push_back(tmp); if (tmp != 0.0) { isNullL = false; } tmp = pow((float)fftspecr[i][0],2.0f) + pow((float)fftspecr[i][1],2.0f); specr.push_back(tmp); if (tmp != 0.0) { isNullR = false; } } if (isNullL && isNullR) { return 1; } // if one of the spectra only contains 0.0, we switch to mono by copying the other one if (isNullL) { specl = specr; } if (isNullR) { specr = specl; } return 1; } traverso-0.49.4/src/plugins/native/CorrelationMeter.h000644 001750 001750 00000003050 11163362147 023146 0ustar00remonremon000000 000000 /* Copyright (C) 2006 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: CorrelationMeter.h,v 1.2 2008/02/07 11:46:09 n_doebelin Exp $ */ #ifndef CORRELATION_METER_H #define CORRELATION_METER_H #include "Plugin.h" #include "defines.h" #include #include class AudioBus; struct CorrelationMeterData { float r; float levelLeft; float levelRight; }; class CorrelationMeter : public Plugin { Q_OBJECT public: CorrelationMeter(); ~CorrelationMeter(); int init(); QDomNode get_state(QDomDocument doc); int set_state(const QDomNode & node ); void process(AudioBus* bus, unsigned long nframes); QString get_name(); int get_data(float& r, float& direction); private: RingBufferNPT* m_databuffer; CorrelationMeterData m_history; float m_fract; int m_bufferreadouts; private slots: void calculate_fract(); }; #endif traverso-0.49.4/src/plugins/native/GainEnvelope.h000644 001750 001750 00000003573 11163362147 022256 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef GAIN_ENVELOPE_H #define GAIN_ENVELOPE_H #include "Plugin.h" #include "Curve.h" #include "Mixer.h" class Sheet; class GainEnvelope : public Plugin { Q_OBJECT public: GainEnvelope(Sheet* sheet); ~GainEnvelope(){}; QDomNode get_state(QDomDocument doc); int set_state(const QDomNode & node ); void process(AudioBus* bus, unsigned long nframes); void process_gain(audio_sample_t** buffer, const TimeRef& startlocation, const TimeRef& endlocation, nframes_t nframes, uint channels); void set_sheet(Sheet* sheet); void set_gain(float gain) {m_gain = gain;} float get_gain() const {return m_gain;} Curve* get_curve() const; QString get_name(); private: float m_gain; }; inline void GainEnvelope::process_gain(audio_sample_t** buffer, const TimeRef& startlocation, const TimeRef& endlocation, nframes_t nframes, uint channels) { PluginControlPort* port = m_controlPorts.at(0); if (port->use_automation()) { port->get_curve()->process(buffer, startlocation, endlocation, nframes, channels, m_gain); } else { for (uint chan=0; chanset_index(0); m_controlPorts.append(port); if (sheet) { set_sheet(sheet); } } QDomNode GainEnvelope::get_state(QDomDocument doc) { QDomElement node = Plugin::get_state(doc).toElement(); node.setAttribute("type", "GainEnvelope"); node.setAttribute("gain", m_gain); return node; } int GainEnvelope::set_state(const QDomNode & node) { foreach(PluginControlPort* port, m_controlPorts) { delete port; } m_controlPorts.clear(); Plugin::set_state(node); QDomElement controlPortsNode = node.firstChildElement("ControlPorts"); if (!controlPortsNode.isNull()) { QDomNode portNode = controlPortsNode.firstChild(); while (!portNode.isNull()) { PluginControlPort* port = new PluginControlPort(this, portNode); m_controlPorts.append(port); portNode = portNode.nextSibling(); } } QDomElement e = node.toElement(); m_gain = e.attribute("gain", "1.0").toFloat(); return 1; } QString GainEnvelope::get_name() { return "Gain Envelope"; } void GainEnvelope::set_sheet(Sheet * sheet) { m_sheet = sheet; set_history_stack(m_sheet->get_history_stack()); if (get_curve()) { get_curve()->set_sheet(sheet); } } void GainEnvelope::process(AudioBus * bus, unsigned long nframes) { Q_UNUSED(bus) Q_UNUSED(nframes) } Curve * GainEnvelope::get_curve() const { return m_controlPorts.at(0)->get_curve(); } traverso-0.49.4/src/plugins/PluginPropertiesDialog.h000644 001750 001750 00000002342 11222345236 023034 0ustar00remonremon000000 000000 /* Copyright (C) 2006-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef LV2_PLUGIN_PROPERTIES_DIALOG_H #define LV2_PLUGIN_PROPERTIES_DIALOG_H #include class Plugin; class PluginSlider; class QPushButton; class PluginPropertiesDialog : public QDialog { Q_OBJECT public: PluginPropertiesDialog(QWidget* parent, Plugin* plugin); ~PluginPropertiesDialog(){}; private: Plugin* m_plugin; QList m_sliders; QPushButton* m_bypassButton; private slots: void bypass_button_clicked(); void reset_button_clicked(); }; #endif //eof traverso-0.49.4/src/plugins/PluginSlider.h000644 001750 001750 00000003145 11222345236 021004 0ustar00remonremon000000 000000 /* Copyright (C) 2006-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef PLUGIN_SLIDER_H #define PLUGIN_SLIDER_H #include #include #include class PluginControlPort; class PluginSlider : public QWidget { Q_OBJECT public: PluginSlider(PluginControlPort* port); ~PluginSlider(){}; void paint(QPainter *); void reset_default_value(); void update_slider_position(); protected: void paintEvent(QPaintEvent *); void mousePressEvent(QMouseEvent *e); void mouseMoveEvent(QMouseEvent *e); void mouseReleaseEvent(QMouseEvent *e); void leaveEvent( QEvent* ); void enterEvent( QEvent* ); void wheelEvent(QWheelEvent* e ); private: PluginControlPort* m_port; float m_max; float m_min; float m_value; float m_stepvalue; int m_xpos; bool highlight; bool dragging; void calculate_new_value(float mouseX); signals: void sliderValueChanged(float value); }; #endif //eof traverso-0.49.4/src/plugins/Plugin.h000644 001750 001750 00000010570 12357215560 017647 0ustar00remonremon000000 000000 /* Copyright (C) 2006-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef PLUGIN_H #define PLUGIN_H #include "ContextItem.h" #include #include #include "defines.h" class AudioBus; class PluginChain; class PluginControlPort; class AudioInputPort; class AudioOutputPort; class Curve; class Sheet; struct PluginInfo { PluginInfo() { audioPortInCount = 0; audioPortOutCount = 0; } int audioPortInCount; int audioPortOutCount; QString type; QString name; QString uri; }; class Plugin : public ContextItem { Q_OBJECT public: Plugin(Sheet* session = 0); virtual ~Plugin(){} virtual int init() {return 1;} virtual QDomNode get_state(QDomDocument doc); virtual int set_state(const QDomNode & node ); virtual void process(AudioBus* bus, unsigned long nframes) = 0; virtual QString get_name() = 0; PluginControlPort* get_control_port_by_index(int index) const; QList get_control_ports() const { return m_controlPorts; } Plugin* get_slave() const {return m_slave;} Sheet* get_sheet() const {return m_sheet;} bool is_bypassed() const {return m_bypass;} void automate_port(int index, bool automate); protected: Plugin* m_slave; Sheet* m_sheet; QList m_controlPorts; QList m_audioInputPorts; QList m_audioOutputPorts; bool m_bypass; signals: void bypassChanged(); public slots: Command* toggle_bypass(); }; class PluginPort : public QObject { public: PluginPort(QObject* parent, int index) : QObject(parent), m_index(index), m_hint(FLOAT_CONTROL) {} PluginPort(QObject* parent) : QObject(parent), m_hint(FLOAT_CONTROL) {} virtual ~PluginPort(){} virtual QDomNode get_state(QDomDocument doc); virtual int set_state( const QDomNode & node ) = 0; enum PortHint { FLOAT_CONTROL, INT_CONTROL, LOG_CONTROL }; int get_index() const {return m_index;} int get_hint() const {return m_hint;} void set_index(int index) {m_index = index;} protected: int m_index; int m_hint; }; class PluginControlPort : public PluginPort { Q_OBJECT public: PluginControlPort(Plugin* parent, int index, float value); PluginControlPort(Plugin* parent, const QDomNode node); virtual ~PluginControlPort(){} virtual float get_control_value() {return m_value; } virtual float get_min_control_value() {return m_min;} virtual float get_max_control_value() {return m_max;} virtual float get_default_value() {return m_default;} void set_min(float min) {m_min = min;} void set_max(float max) {m_max = max;} void set_default(float def) {m_default = def;} void set_use_automation(bool automation); bool use_automation(); Curve* get_curve() const {return m_curve;} virtual QDomNode get_state(QDomDocument doc); virtual QString get_description(); virtual QString get_symbol(); protected: Curve* m_curve; Plugin* m_plugin; float m_value; float m_default; float m_min; float m_max; bool m_automation; QString m_description; virtual int set_state( const QDomNode & node ); public slots: void set_control_value(float value); }; class AudioInputPort : public PluginPort { public: AudioInputPort(QObject* parent, int index); AudioInputPort(QObject* parent) : PluginPort(parent) {}; virtual ~AudioInputPort(){}; QDomNode get_state(QDomDocument doc); int set_state( const QDomNode & node ); }; class AudioOutputPort : public PluginPort { public: AudioOutputPort(QObject* parent, int index); AudioOutputPort(QObject* parent) : PluginPort(parent) {} virtual ~AudioOutputPort(){} QDomNode get_state(QDomDocument doc); int set_state( const QDomNode & node ); }; #endif //eof traverso-0.49.4/src/plugins/PluginManager.cpp000644 001750 001750 00000005630 12357216113 021471 0ustar00remonremon000000 000000 /*Copyright (C) 2006-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "ProjectManager.h" #include "Project.h" #include "Sheet.h" #include "PluginManager.h" #include "Plugin.h" #include "CorrelationMeter.h" #include "SpectralMeter.h" #include "Utils.h" #include "Information.h" #if defined (LV2_SUPPORT) #include #endif #include "Debugger.h" PluginManager* PluginManager::m_instance = 0; PluginManager::PluginManager() { init(); } PluginManager::~PluginManager() { #if defined (LV2_SUPPORT) lilv_world_free(m_lilvWorld); #endif } PluginManager* PluginManager::instance() { if (m_instance == 0) { m_instance = new PluginManager; } return m_instance; } void PluginManager::init() { #if defined (LV2_SUPPORT) // LV2 part: m_lilvWorld = lilv_world_new(); lilv_world_load_all(m_lilvWorld); m_lilvPlugins = lilv_world_get_all_plugins(m_lilvWorld); #endif } Plugin* PluginManager::get_plugin(const QDomNode node ) { QDomElement e = node.toElement(); QString type = e.attribute( "type", ""); Plugin* plugin = 0; Sheet* sheet = pm().get_project()->get_current_sheet(); #if defined (LV2_SUPPORT) if (type == "LV2Plugin") { plugin = new LV2Plugin(sheet); } #endif // Well, this looks a little ehm, ugly hehe // I'll investigate sometime in the future to make // a Plugin a _real_ plugin, by using the Qt Plugin // framework. (loading it as a shared library object...) if (type == "CorrelationMeterPlugin") { plugin = new CorrelationMeter(); } if (type == "SpectralMeterPlugin") { plugin = new SpectralMeter(); } if (plugin) { if (plugin->set_state(node) > 0) { return plugin; } else { delete plugin; plugin = 0; } } else { PERROR("PluginManager couldn't create Plugin ???? (%s)", QS_C(type)); } return plugin; } #if defined (LV2_SUPPORT) const LilvPlugins* PluginManager::get_lilv_plugins() { return m_lilvPlugins; } Plugin* PluginManager::create_lv2_plugin(const QString& uri) { Sheet* sheet = pm().get_project()->get_current_sheet(); LV2Plugin* plugin = new LV2Plugin(sheet, QS_C(uri)); if (plugin->init() < 0) { info().warning(QObject::tr("Plugin %1 initialization failed!").arg(uri)); delete plugin; plugin = 0; } return plugin; } #endif //eof traverso-0.49.4/src/plugins/LV2/000755 001750 001750 00000000000 12357216213 016634 5ustar00remonremon000000 000000 traverso-0.49.4/src/plugins/LV2/LV2Plugin.cpp000644 001750 001750 00000031250 12357216213 021123 0ustar00remonremon000000 000000 /*Copyright (C) 2006-2009 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "LV2Plugin.h" #include #include #include #include #if defined Q_WS_MAC #include extern "C" int isnan(double); #endif #include #define UC_(x) (const unsigned char* ) x.toAscii().data() enum PortDirection { INPUT, OUTPUT }; enum PortType { CONTROL, AUDIO, EVENT, UNKNOWN }; LV2Plugin::LV2Plugin(Sheet* sheet, bool slave) : Plugin(sheet) , m_plugin(0) { m_isSlave = slave; } LV2Plugin::LV2Plugin(Sheet* sheet, char* pluginUri) : Plugin(sheet) , m_pluginUri((char*) pluginUri) , m_plugin(0) , m_isSlave(false) { } LV2Plugin::~LV2Plugin() { /* Deactivate and free plugin instance */ if (m_instance) { lilv_instance_deactivate(m_instance); lilv_instance_free(m_instance); } } QDomNode LV2Plugin::get_state( QDomDocument doc ) { QDomElement node = Plugin::get_state(doc).toElement(); node.setAttribute("type", "LV2Plugin"); node.setAttribute("uri", m_pluginUri); return node; } int LV2Plugin::set_state(const QDomNode & node ) { Plugin::set_state(node); QDomElement e = node.toElement(); m_pluginUri = e.attribute( "uri", ""); if (create_instance() < 0) { return -1; } /* Create control ports */ QDomElement controlPortsNode = node.firstChildElement("ControlPorts"); if (!controlPortsNode.isNull()) { QDomNode portNode = controlPortsNode.firstChild(); while (!portNode.isNull()) { LV2ControlPort* port = new LV2ControlPort(this, portNode); m_controlPorts.append(port); portNode = portNode.nextSibling(); } } // Create audio input ports QDomElement audioInputPortsNode = node.firstChildElement("AudioInputPorts"); if (!audioInputPortsNode.isNull()) { QDomNode portNode = audioInputPortsNode.firstChild(); while (!portNode.isNull()) { AudioInputPort* port = new AudioInputPort(this); port->set_state(portNode); m_audioInputPorts.append(port); portNode = portNode.nextSibling(); } } // Create audio ouput ports QDomElement audioOutputPortsNode = node.firstChildElement("AudioOutputPorts"); if (!audioOutputPortsNode.isNull()) { QDomNode portNode = audioOutputPortsNode.firstChild(); while (!portNode.isNull()) { AudioOutputPort* port = new AudioOutputPort(this); port->set_state(portNode); m_audioOutputPorts.append(port); portNode = portNode.nextSibling(); } } /* Activate the plugin instance */ lilv_instance_activate(m_instance); // The default is 2 channels in - out, if there is only 1 in - out, duplicate // this plugin, and use it on the second channel if (!m_isSlave && m_audioInputPorts.size() == 1 && m_audioOutputPorts.size() == 1) { m_slave = create_copy(); } return 1; } int LV2Plugin::init() { m_num_ports = 0; m_ports = NULL; LilvWorld* world = PluginManager::instance()->get_lilv_world(); /* Set up the port classes this app supports */ m_input_class = lilv_new_uri(world, LILV_URI_INPUT_PORT); m_output_class = lilv_new_uri(world, LILV_URI_OUTPUT_PORT); m_control_class = lilv_new_uri(world, LILV_URI_CONTROL_PORT); m_audio_class = lilv_new_uri(world, LILV_URI_AUDIO_PORT); m_event_class = lilv_new_uri(world, LILV_URI_EVENT_PORT); if (create_instance() < 0) { return -1; } /* Create ports */ m_num_ports = lilv_plugin_get_num_ports(m_plugin); // float* default_values = new float(slv2_plugin_get_num_ports(m_plugin) * sizeof(float)); float* default_values = (float*)calloc(lilv_plugin_get_num_ports(m_plugin), sizeof(float)); lilv_plugin_get_port_ranges_float(m_plugin, NULL, NULL, default_values); for (uint i=0; i < m_num_ports; ++i) { LV2ControlPort* port = create_port(i, default_values[i]); if (port) { m_controlPorts.append(port); } else { // Not an audio port, or unrecognized port type } } free(default_values); /* Activate the plugin instance */ lilv_instance_activate(m_instance); if (m_audioInputPorts.size() == 0) { PERROR("Plugin %s has no audio input ports set!!", QS_C(get_name())); return -1; } if (m_audioOutputPorts.size() == 0) { PERROR("Plugin %s has no audio output ports set!!", QS_C(get_name())); return -1; } // The default is 2 channels in - out, if there is only 1 in - out, duplicate // this plugin, and use it on the second channel if (!m_isSlave && m_audioInputPorts.size() == 1 && m_audioOutputPorts.size() == 1) { m_slave = create_copy(); } return 1; } int LV2Plugin::create_instance() { // printf("URI:\t%s\n", QS_C(m_pluginUri)); LilvNode* plugin_uri = lilv_new_uri(PluginManager::instance()->get_lilv_world(), QS_C(m_pluginUri)); m_plugin = lilv_plugins_get_by_uri(PluginManager::instance()->get_lilv_plugins(), plugin_uri); lilv_node_free(plugin_uri); if (! m_plugin) { fprintf(stderr, "Failed to find plugin %s.\n", QS_C(m_pluginUri)); return -1; } /* Instantiate the plugin */ int samplerate = audiodevice().get_sample_rate(); m_instance = lilv_plugin_instantiate(m_plugin, samplerate, NULL); if (! m_instance) { printf("Failed to instantiate plugin.\n"); return -1; } else { // printf("Succesfully instantiated plugin.\n\n"); } return 1; } void LV2Plugin::process(AudioBus* bus, unsigned long nframes) { if ( is_bypassed() ) { return; } for (int i=0; iget_index(); // If we are a slave, then we are meant to operate on the second channel of the Bus! if (m_isSlave) i = 1; lilv_instance_connect_port(m_instance, index, bus->get_buffer(i, (nframes_t)nframes)); } for (int i=0; iget_index(); // If we are a slave, then we are meant to operate on the second channel of the Bus! if (m_isSlave) i = 1; lilv_instance_connect_port(m_instance, index, bus->get_buffer(i, (nframes_t)nframes)); } /* Run plugin for this cycle */ lilv_instance_run(m_instance, nframes); // If we have a slave, and the bus has 2 channels, process the slave too! if (m_slave && bus->get_channel_count() == 2) { m_slave->process(bus, nframes); } } LV2ControlPort* LV2Plugin::create_port(int portIndex, float defaultValue) { LV2ControlPort* ctrlport = (LV2ControlPort*) 0; const LilvPort* slv2_port = lilv_plugin_get_port_by_index(m_plugin, portIndex); PortDirection direction; PortType type = UNKNOWN; if (lilv_port_is_a(m_plugin, slv2_port, m_input_class)) { direction = INPUT; } else if (lilv_port_is_a(m_plugin, slv2_port, m_output_class)) { direction = OUTPUT; /* } else if (slv2_port_has_property(m_plugin, slv2_port, m_optional)) { slv2_instance_connect_port(m_instance, port_index, NULL);*/ } else { PERROR("Mandatory port has unknown type (neither input or output)"); return ctrlport; } /* Set control values */ if (lilv_port_is_a(m_plugin, slv2_port, m_control_class)) { type = CONTROL; } else if (lilv_port_is_a(m_plugin, slv2_port, m_audio_class)) { type = AUDIO; }/* else if (slv2_port_is_a(m_plugin, slv2_port, m_event_class)) { port->type = EVENT; }*/ /* Create the port based on it's direction and type */ switch (type) { case CONTROL: switch (direction) { case INPUT: defaultValue = isnan(defaultValue) ? 0.0 : defaultValue; ctrlport = new LV2ControlPort(this, portIndex, defaultValue); break; case OUTPUT: ctrlport = new LV2ControlPort(this, portIndex, 0); break; } break; case AUDIO: switch (direction) { case INPUT: m_audioInputPorts.append(new AudioInputPort(this, portIndex)); break; case OUTPUT: m_audioOutputPorts.append(new AudioOutputPort(this, portIndex)); break; } break; default: PERROR("ERROR: Unknown port data type!"); } return ctrlport; } QString LV2Plugin::get_name( ) { return QString(lilv_node_as_string(lilv_plugin_get_name(m_plugin))); } /*********************************************************/ /* LV2 Control Port */ /*********************************************************/ LV2ControlPort::LV2ControlPort(LV2Plugin* plugin, int index, float value) : PluginControlPort(plugin, index, value) , m_lv2plugin(plugin) { lilv_instance_connect_port(m_lv2plugin->get_instance(), m_index, &m_value); init(); } LV2ControlPort::LV2ControlPort( LV2Plugin * plugin, const QDomNode node ) : PluginControlPort(plugin, node) , m_lv2plugin(plugin) { lilv_instance_connect_port(m_lv2plugin->get_instance(), m_index, &m_value); init(); } void LV2ControlPort::init() { foreach(const QString &string, get_hints()) { if (string == "http://lv2plug.in/ns/lv2core#logarithmic") { m_hint = LOG_CONTROL; } else if (string == "http://lv2plug.in/ns/lv2core#integer") { m_hint = INT_CONTROL; } } } QDomNode LV2ControlPort::get_state( QDomDocument doc ) { return PluginControlPort::get_state(doc); } float LV2ControlPort::get_min_control_value() { const LilvPort* port = lilv_plugin_get_port_by_index(m_lv2plugin->get_slv2_plugin(), m_index); LilvNode* minval; lilv_port_get_range(m_lv2plugin->get_slv2_plugin(), port, NULL, &minval, NULL); float val = lilv_node_as_float(minval); if (minval == NULL) { return -1.0e6; } lilv_node_free(minval); return val; } float LV2ControlPort::get_max_control_value() { const LilvPort* port = lilv_plugin_get_port_by_index(m_lv2plugin->get_slv2_plugin(), m_index); LilvNode* maxval; lilv_port_get_range(m_lv2plugin->get_slv2_plugin(), port, NULL, NULL, &maxval); if (maxval == NULL) { return 1.0e6; } float val = lilv_node_as_float(maxval); lilv_node_free(maxval); return val; } float LV2ControlPort::get_default_value() { const LilvPort* port = lilv_plugin_get_port_by_index(m_lv2plugin->get_slv2_plugin(), m_index); LilvNode* defval; lilv_port_get_range(m_lv2plugin->get_slv2_plugin(), port, &defval, NULL, NULL); if (defval == NULL) { return this->get_min_control_value(); } float val = lilv_node_as_float(defval); lilv_node_free(defval); return val; } QString LV2ControlPort::get_description() { const LilvPort* port = lilv_plugin_get_port_by_index(m_lv2plugin->get_slv2_plugin(), m_index); return QString(lilv_node_as_string(lilv_port_get_name(m_lv2plugin->get_slv2_plugin(), port))); } QString LV2ControlPort::get_symbol() { const LilvPort* port = lilv_plugin_get_port_by_index(m_lv2plugin->get_slv2_plugin(), m_index); return QString(lilv_node_as_string(lilv_port_get_symbol(m_lv2plugin->get_slv2_plugin(), port))); } QStringList LV2ControlPort::get_hints() { const LilvPort* port = lilv_plugin_get_port_by_index(m_lv2plugin->get_slv2_plugin(), m_index); LilvNodes* values = lilv_port_get_properties(m_lv2plugin->get_slv2_plugin(), port); QStringList qslist; for (unsigned i=0; i < lilv_nodes_size(values); ++i) { // qslist << QString(lilv_node_as_string(lilv_nodes_get_at(values, i))); } return qslist; } LV2Plugin * LV2Plugin::create_copy() { QDomDocument doc("LV2Plugin"); QDomNode pluginState = get_state(doc); LV2Plugin* plug = new LV2Plugin(m_sheet, true); plug->set_state(pluginState); return plug; } Command * LV2Plugin::toggle_bypass() { Plugin::toggle_bypass(); if (m_slave) { m_slave->toggle_bypass(); } return 0; } PluginInfo LV2Plugin::get_plugin_info(const LilvPlugin* plugin) { PluginInfo info; info.name = lilv_node_as_string(lilv_plugin_get_name(plugin)); info.uri = lilv_node_as_string(lilv_plugin_get_uri(plugin)); LilvWorld* world = PluginManager::instance()->get_lilv_world(); LilvNode* input = lilv_new_uri(world, LILV_URI_INPUT_PORT); LilvNode* output = lilv_new_uri(world, LILV_URI_OUTPUT_PORT); LilvNode* audio = lilv_new_uri(world, LILV_URI_AUDIO_PORT); info.audioPortInCount = lilv_plugin_get_num_ports_of_class(plugin, input, audio, NULL); info.audioPortOutCount = lilv_plugin_get_num_ports_of_class(plugin, output, audio, NULL); info.type = lilv_node_as_string(lilv_plugin_class_get_label(lilv_plugin_get_class(plugin))); lilv_node_free(input); lilv_node_free(output); lilv_node_free(audio); return info; } //eof traverso-0.49.4/src/plugins/LV2/LV2Plugin.h000644 001750 001750 00000005602 12357215773 020604 0ustar00remonremon000000 000000 /* Copyright (C) 2006-2009 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef LV2_PLUGIN_H #define LV2_PLUGIN_H #include #include #include #include #include #include "Plugin.h" class AudioBus; class LV2ControlPort; class AudioInputPort; class AudioOutputPort; class Sheet; class LV2Plugin : public Plugin { Q_OBJECT public: LV2Plugin(Sheet* sheet, bool slave=false); LV2Plugin(Sheet* sheet, char* pluginUri); ~LV2Plugin(); void process(AudioBus* bus, unsigned long nframes); LilvInstance* get_instance() const {return m_instance; } const LilvPlugin* get_slv2_plugin() const {return m_plugin; } LV2Plugin* create_copy(); QDomNode get_state(QDomDocument doc); QString get_name(); int init(); int set_state(const QDomNode & node ); static PluginInfo get_plugin_info(const LilvPlugin* plugin); private: QString m_pluginUri; const LilvPlugin* m_plugin; /**< Plugin "class" (actually just a few strings) */ LilvInstance* m_instance; /**< Plugin "instance" (loaded shared lib) */ uint32_t m_num_ports; /**< Size of the two following arrays: */ struct Port* m_ports; /**< Port array of size num_ports */ LilvNode* m_input_class; /**< Input port class (URI) */ LilvNode* m_output_class; /**< Output port class (URI) */ LilvNode* m_control_class; /**< Control port class (URI) */ LilvNode* m_audio_class; /**< Audio port class (URI) */ LilvNode* m_event_class; /**< Event port class (URI) */ LilvNode* optional; /**< lv2:connectionOptional port property */ bool m_isSlave; LV2ControlPort* create_port(int portIndex, float defaultValue); int create_instance(); public slots: Command* toggle_bypass(); }; class LV2ControlPort : public PluginControlPort { public: LV2ControlPort(LV2Plugin* plugin, int index, float value); LV2ControlPort(LV2Plugin* plugin, const QDomNode node); ~LV2ControlPort(){}; float get_min_control_value(); float get_max_control_value(); float get_default_value(); QDomNode get_state(QDomDocument doc); QString get_description(); QString get_symbol(); private: LV2Plugin* m_lv2plugin; void init(); QStringList get_hints(); }; #endif traverso-0.49.4/src/plugins/PluginSlider.cpp000644 001750 001750 00000007151 11365034431 021340 0ustar00remonremon000000 000000 /* Copyright (C) 2006-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "PluginSlider.h" #include #include "Plugin.h" PluginSlider::PluginSlider(PluginControlPort* port) : QWidget() , m_port(port) { setMaximumHeight(18); setFixedWidth(200); highlight = dragging = false; m_min = m_port->get_min_control_value(); m_max = m_port->get_max_control_value(); m_value = m_port->get_control_value(); if (m_port->get_hint() == PluginPort::INT_CONTROL) { m_stepvalue = 1; } else { m_stepvalue = (m_max - m_min) / 16; } } void PluginSlider::paintEvent(QPaintEvent *) { QPainter painter(this); QColor color = themer()->get_color("PluginSlider:value"); QColor background = themer()->get_color("PluginSlider:background"); if (highlight) { color = color.light(110); background = background.light(105); } // avoid painting at 0, it looks bad... if (m_xpos <= 1) m_xpos = 2; painter.setBrush(background); painter.setPen(themer()->get_color("PluginSlider:text")); QRectF rect(0.0, 0.0, width() - 0.5, height() - 0.5); painter.drawRect(rect); painter.fillRect(1, 1, m_xpos - 2, height() - 2, QBrush(color)); if (m_port->get_hint() == PluginPort::INT_CONTROL) { painter.drawText(0, 0, width(), height(), Qt::AlignCenter, QString::number((int)m_value)); } else { painter.drawText(0, 0, width(), height(), Qt::AlignCenter, QString::number(m_value, 'f', 2)); } } void PluginSlider::mousePressEvent( QMouseEvent * e ) { dragging = true; calculate_new_value(e->x()); } void PluginSlider::mouseMoveEvent( QMouseEvent * e ) { calculate_new_value(e->x()); } void PluginSlider::mouseReleaseEvent( QMouseEvent * e ) { dragging = false; calculate_new_value(e->x()); } void PluginSlider::calculate_new_value(float mouseX) { if (mouseX < 0) mouseX = 0; if (mouseX > width()) mouseX = width(); m_xpos = (int)mouseX; float relativePos = ((float) mouseX) / width(); float range = m_max - m_min; m_value = (relativePos * range) + m_min; // in case of INT_CONTROL, round float to nearest int value. if (m_port->get_hint() == PluginPort::INT_CONTROL) { m_value = float(int(0.5 + m_value)); } emit sliderValueChanged(m_value); update(); } void PluginSlider::leaveEvent( QEvent * ) { highlight = false; update(); } void PluginSlider::enterEvent( QEvent * ) { highlight = true; update(); } void PluginSlider::wheelEvent( QWheelEvent* e ) { if (e->orientation() == Qt::Vertical) { if (e->delta() > 0) { m_value += m_stepvalue; if (m_value > m_max) { m_value = m_max; } } if (e->delta() < 0) { m_value -= m_stepvalue; if (m_value < m_min) { m_value = m_min; } } update_slider_position(); } } void PluginSlider::update_slider_position( ) { float range = m_max - m_min; float mouseX = ((float)width() / range) * (m_value - m_min); calculate_new_value(mouseX); } void PluginSlider::reset_default_value() { m_value = m_port->get_default_value(); update_slider_position(); } traverso-0.49.4/src/plugins/PluginPropertiesDialog.cpp000644 001750 001750 00000007472 12357216137 023407 0ustar00remonremon000000 000000 /* Copyright (C) 2006-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "PluginPropertiesDialog.h" #include "Plugin.h" #include #include #include #include #include #include #include #include "Command.h" PluginPropertiesDialog::PluginPropertiesDialog(QWidget* parent, Plugin* plugin) : QDialog(parent) , m_plugin(plugin) { QWidget* sliderWidget = new QWidget(this); QVBoxLayout* sliderWidgetLayout = new QVBoxLayout; sliderWidget->setLayout(sliderWidgetLayout); QWidget* optionsWidget = new QWidget(this); QHBoxLayout* optionsLayout = new QHBoxLayout; optionsWidget->setLayout(optionsLayout); m_bypassButton = new QPushButton(tr("Bypass"), optionsWidget); m_bypassButton->setCheckable(true); m_bypassButton->setChecked(plugin->is_bypassed()); QPushButton* closeButton = new QPushButton(tr("Close"), optionsWidget); QPushButton* resetButton = new QPushButton(tr("Reset"), optionsWidget); optionsLayout->addWidget(m_bypassButton); optionsLayout->addWidget(resetButton); optionsLayout->addStretch(10); optionsLayout->addWidget(closeButton); QVBoxLayout* dialogLayout = new QVBoxLayout; dialogLayout->addWidget(sliderWidget); dialogLayout->addWidget(optionsWidget); dialogLayout->setMargin(0); setLayout(dialogLayout); foreach(PluginControlPort* port, m_plugin->get_control_ports()) { if (port->get_symbol() == "latency") { continue; } QWidget* widget = new QWidget(sliderWidget); widget->setMaximumHeight(22); QHBoxLayout* lay = new QHBoxLayout(); lay->setSpacing(12); lay->setMargin(3); PluginSlider* slider = new PluginSlider(port); slider->update_slider_position(); m_sliders.append(slider); connect(slider, SIGNAL(sliderValueChanged(float)), port, SLOT(set_control_value(float))); // in case the plugin has a slave 'map' the signal to the slave port control slot too! if (m_plugin->get_slave()) { connect(slider, SIGNAL(sliderValueChanged(float)), m_plugin->get_slave()->get_control_port_by_index(port->get_index()), SLOT(set_control_value(float))); } QLabel* minvalue = new QLabel(); minvalue->setNum(port->get_min_control_value()); minvalue->setFixedWidth(35); minvalue->setAlignment(Qt::AlignRight); QLabel* maxvalue = new QLabel(); maxvalue->setNum(port->get_max_control_value()); maxvalue->setFixedWidth(35); maxvalue->setAlignment(Qt::AlignRight); QLabel* controlname = new QLabel(port->get_description()); lay->addWidget(controlname); lay->addStretch(1); lay->addWidget(minvalue); lay->addWidget(slider); lay->addWidget(maxvalue); widget->setLayout(lay); sliderWidgetLayout->addWidget(widget); } connect(closeButton, SIGNAL(clicked()), this, SLOT(close())); connect(resetButton, SIGNAL(clicked()), this, SLOT(reset_button_clicked())); connect(m_bypassButton, SIGNAL(clicked()), this, SLOT(bypass_button_clicked())); } void PluginPropertiesDialog::bypass_button_clicked() { m_plugin->toggle_bypass(); m_bypassButton->setChecked(m_plugin->is_bypassed()); } void PluginPropertiesDialog::reset_button_clicked() { foreach(PluginSlider* slider, m_sliders) { slider->reset_default_value(); } } traverso-0.49.4/src/engine/000755 001750 001750 00000000000 12417543112 016013 5ustar00remonremon000000 000000 traverso-0.49.4/src/engine/TAudioDeviceClient.h000664 001750 001750 00000002543 12417543077 021650 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: Client.h,v 1.7 2007/11/19 11:18:54 r_sijrier Exp $ */ #ifndef CLIENT_H #define CLIENT_H #include #include #include "APILinkedList.h" #include "defines.h" class TAudioDeviceClient : public QObject, public APILinkedListNode { Q_OBJECT public: TAudioDeviceClient(const QString& name); ~TAudioDeviceClient(); void set_process_callback(ProcessCallback call); void set_transport_control_callback(TransportControlCallback call); bool is_smaller_then(APILinkedListNode* ) {return false;} ProcessCallback process; TransportControlCallback transport_control; QString m_name; }; #endif //eof traverso-0.49.4/src/engine/CMakeLists.txt000644 001750 001750 00000002357 12417543030 020561 0ustar00remonremon000000 000000 INCLUDE_DIRECTORIES( ${QT_QTGUI_INCLUDE_DIR} ) SET(TRAVERSO_ENGINE_MOC_CLASSES AudioBus.h AudioDevice.h TAudioDeviceClient.h ) SET(TRAVERSO_ENGINE_SOURCES AudioBus.cpp AudioChannel.cpp AudioDevice.cpp AudioDeviceThread.cpp TAudioDeviceClient.cpp Driver.cpp memops.cpp ) IF(HAVE_ALSA) SET(TRAVERSO_ENGINE_SOURCES AlsaDriver.cpp ${TRAVERSO_ENGINE_SOURCES} ) ENDIF(HAVE_ALSA) IF(HAVE_JACK) SET(TRAVERSO_ENGINE_SOURCES JackDriver.cpp ${TRAVERSO_ENGINE_SOURCES} ) SET(TRAVERSO_ENGINE_MOC_CLASSES JackDriver.h ${TRAVERSO_ENGINE_MOC_CLASSES} ) ENDIF(HAVE_JACK) IF(HAVE_PORTAUDIO) SET(TRAVERSO_ENGINE_SOURCES PADriver.cpp ${TRAVERSO_ENGINE_SOURCES} ) ENDIF(HAVE_PORTAUDIO) IF(HAVE_PULSEAUDIO) SET(TRAVERSO_ENGINE_SOURCES PulseAudioDriver.cpp ${TRAVERSO_ENGINE_SOURCES} ) ENDIF(HAVE_PULSEAUDIO) IF(HAVE_COREAUDIO) SET(TRAVERSO_ENGINE_SOURCES CoreAudioDriver.cpp ${TRAVERSO_ENGINE_SOURCES} ) ENDIF(HAVE_COREAUDIO) SET(TRAVERSO_ENGINE_LIBRARY "traversoaudiobackend") QT4_WRAP_CPP(TRAVERSO_ENGINE_MOC_SOURCES ${TRAVERSO_ENGINE_MOC_CLASSES}) ADD_LIBRARY(${TRAVERSO_ENGINE_LIBRARY} STATIC ${TRAVERSO_ENGINE_SOURCES} ${TRAVERSO_ENGINE_MOC_SOURCES}) IF(USE_PCH) ADD_DEPENDENCIES(traversoaudiobackend precompiled_headers) ENDIF(USE_PCH) traverso-0.49.4/src/engine/CoreAudioDriver.cpp000644 001750 001750 00000047210 11163362147 021555 0ustar00remonremon000000 000000 /* Copyright (C) 2008 Remon Sijrier Copyright (C) Grame, 2003. Copyright (C) Johnny Petrantoni, 2003. This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. Grame Research Laboratory, 9, rue du Garet 69001 Lyon - France grame@rd.grame.fr Johnny Petrantoni, johnny@lato-b.com - Italy, Rome. Jan 30, 2004: Johnny Petrantoni: first code of the coreaudio driver, based on portaudio driver by Stephane Letz. Feb 02, 2004: Johnny Petrantoni: fixed null cycle, removed double copy of buffers in AudioRender, the driver works fine (tested with Built-in Audio and Hammerfall RME), but no cpu load is displayed. Feb 03, 2004: Johnny Petrantoni: some little fix. Feb 03, 2004: Stephane Letz: some fix in AudioRender.cpp code. Feb 03, 2004: Johnny Petrantoni: removed the default device stuff (useless, in jackosx, because JackPilot manages this behavior), the device must be specified. and all parameter must be correct. Feb 04, 2004: Johnny Petrantoni: now the driver supports interfaces with multiple interleaved streams (such as the MOTU 828). Nov 05, 2004: S.Letz: correct management of -I option for use with JackPilot. Nov 15, 2004: S.Letz: Set a default value for deviceID. Nov 30, 2004: S.Letz: In coreaudio_driver_write : clear to avoid playing dirty buffers when the client does not produce output anymore. Dec 05, 2004: S.Letz: XRun detection Dec 09, 2004: S.Letz: Dynamic buffer size change Dec 23, 2004: S.Letz: Correct bug in dynamic buffer size change : update period_usecs Jan 20, 2005: S.Letz: Almost complete rewrite using AUHAL. May 20, 2005: S.Letz: Add "systemic" latencies management. Jun 06, 2005: S.Letz: Remove the "-I" parameter, change the semantic of "-n" parameter : -n (driver name) now correctly uses the PropertyDeviceUID (persistent accross reboot...) as the identifier for the used coreaudio driver. Jun 14, 2005: S.Letz: Since the "-I" parameter is not used anymore, rename the "systemic" latencies management parametes "-I" and "-O" like for the ALSA driver. Aug 16, 2005: S.Letz: Remove get_device_id_from_num, use get_default_device instead. If the -n option is not used or the device name cannot be found, the default device is used. Note: the default device can be used only if both default input and default output are the same. Dec 19, 2005: S.Letz: Add -d option (display_device_names). Apri 7, 2006: S.Letz: Synchronization with the jackdmp coreaudio driver version: improve half-duplex management. May 17, 2006: S.Letz: Minor fix in driver_initialize. May 18, 2006: S.Letz: Document sample rate default value. May 31, 2006: S.Letz: Apply Rui patch for more consistent driver parameter naming. Dec 04, 2007: S.Letz: Fix a bug in sample rate management (occuring in particular with "aggregate" devices). Dec 05, 2007: S.Letz: Correct sample_rate management in Open. Better handling in sample_rate change listener. Nov 11, 2008: Remon Sijrier: Ported to C++ for Traverso */ /* CoreAudio driver based on jack-audio-connection-kit-0.xxx.x coreaudio_driver.c */ #include "CoreAudioDriver.h" #include "AudioChannel.h" #include "AudioDevice.h" #include #include #include #include "Debugger.h" //#define PRINTDEBUG 1 CoreAudioDriver::CoreAudioDriver(AudioDevice * dev, int rate, nframes_t bufferSize) : Driver(dev, rate, bufferSize) { PENTERCONS; } CoreAudioDriver::~ CoreAudioDriver() { PENTERDES; } void JCALog(char *fmt, ...) { #ifdef PRINTDEBUG va_list ap; va_start(ap, fmt); fprintf(stderr, "JCA: "); vfprintf(stderr, fmt, ap); va_end(ap); #endif } void printError(OSStatus err) { #ifdef DEBUG switch (err) { case kAudioHardwareNoError: JCALog("error code : kAudioHardwareNoError\n"); break; case kAudioHardwareNotRunningError: JCALog("error code : kAudioHardwareNotRunningError\n"); break; case kAudioHardwareUnspecifiedError: JCALog("error code : kAudioHardwareUnspecifiedError\n"); break; case kAudioHardwareUnknownPropertyError: JCALog("error code : kAudioHardwareUnknownPropertyError\n"); break; case kAudioHardwareBadPropertySizeError: JCALog("error code : kAudioHardwareBadPropertySizeError\n"); break; case kAudioHardwareIllegalOperationError: JCALog("error code : kAudioHardwareIllegalOperationError\n"); break; case kAudioHardwareBadDeviceError: JCALog("error code : kAudioHardwareBadDeviceError\n"); break; case kAudioHardwareBadStreamError: JCALog("error code : kAudioHardwareBadStreamError\n"); break; case kAudioDeviceUnsupportedFormatError: JCALog("error code : kAudioDeviceUnsupportedFormatError\n"); break; case kAudioDevicePermissionsError: JCALog("error code : kAudioDevicePermissionsError\n"); break; default: JCALog("error code : unknown %ld\n", err); break; } #endif } OSStatus get_device_name_from_id(AudioDeviceID id, char name[256]) { UInt32 size = sizeof(char) * 256; OSStatus res = AudioDeviceGetProperty(id, 0, false, kAudioDevicePropertyDeviceName, &size, &name[0]); return res; } OSStatus get_device_id_from_uid(char* UID, AudioDeviceID* id) { UInt32 size = sizeof(AudioValueTranslation); CFStringRef inIUD = CFStringCreateWithCString(NULL, UID, CFStringGetSystemEncoding()); AudioValueTranslation value = { &inIUD, sizeof(CFStringRef), id, sizeof(AudioDeviceID) }; if (inIUD == NULL) { return kAudioHardwareUnspecifiedError; } else { OSStatus res = AudioHardwareGetProperty(kAudioHardwarePropertyDeviceForUID, &size, &value); CFRelease(inIUD); JCALog("get_device_id_from_uid %s %ld \n", UID, *id); return (*id == kAudioDeviceUnknown) ? kAudioHardwareBadDeviceError : res; } } OSStatus get_default_device(AudioDeviceID * id) { OSStatus res; UInt32 theSize = sizeof(UInt32); AudioDeviceID inDefault; AudioDeviceID outDefault; if ((res = AudioHardwareGetProperty(kAudioHardwarePropertyDefaultInputDevice, &theSize, &inDefault)) != noErr) return res; if ((res = AudioHardwareGetProperty(kAudioHardwarePropertyDefaultOutputDevice, &theSize, &outDefault)) != noErr) return res; JCALog("get_default_device: input %ld output %ld\n", inDefault, outDefault); // Get the device only if default input and ouput are the same if (inDefault == outDefault) { *id = inDefault; return noErr; } else { PERROR("CoreAudioDriver:: Default input and output devices are not the same !!"); return kAudioHardwareBadDeviceError; } } OSStatus get_default_input_device(AudioDeviceID* id) { OSStatus res; UInt32 theSize = sizeof(UInt32); AudioDeviceID inDefault; if ((res = AudioHardwareGetProperty(kAudioHardwarePropertyDefaultInputDevice, &theSize, &inDefault)) != noErr) return res; JCALog("get_default_input_device: input = %ld \n", inDefault); *id = inDefault; return noErr; } OSStatus get_default_output_device(AudioDeviceID* id) { OSStatus res; UInt32 theSize = sizeof(UInt32); AudioDeviceID outDefault; if ((res = AudioHardwareGetProperty(kAudioHardwarePropertyDefaultOutputDevice, &theSize, &outDefault)) != noErr) return res; JCALog("get_default_output_device: output = %ld\n", outDefault); *id = outDefault; return noErr; } OSStatus get_total_channels(AudioDeviceID device, int* channelCount, bool isInput) { OSStatus err = noErr; UInt32 outSize; Boolean outWritable; AudioBufferList* bufferList = 0; AudioStreamID* streamList = 0; int i, numStream; err = AudioDeviceGetPropertyInfo(device, 0, isInput, kAudioDevicePropertyStreams, &outSize, &outWritable); if (err == noErr) { streamList = (AudioStreamID*)malloc(outSize); numStream = outSize/sizeof(AudioStreamID); JCALog("get_total_channels device stream number = %ld numStream = %ld\n", device, numStream); err = AudioDeviceGetProperty(device, 0, isInput, kAudioDevicePropertyStreams, &outSize, streamList); if (err == noErr) { AudioStreamBasicDescription streamDesc; outSize = sizeof(AudioStreamBasicDescription); for (i = 0; i < numStream; i++) { err = AudioStreamGetProperty(streamList[i], 0, kAudioDevicePropertyStreamFormat, &outSize, &streamDesc); JCALog("get_total_channels streamDesc mFormatFlags = %ld mChannelsPerFrame = %ld\n", streamDesc.mFormatFlags, streamDesc.mChannelsPerFrame); } } } *channelCount = 0; err = AudioDeviceGetPropertyInfo(device, 0, isInput, kAudioDevicePropertyStreamConfiguration, &outSize, &outWritable); if (err == noErr) { bufferList = (AudioBufferList*)malloc(outSize); err = AudioDeviceGetProperty(device, 0, isInput, kAudioDevicePropertyStreamConfiguration, &outSize, bufferList); if (err == noErr) { for (i = 0; i < bufferList->mNumberBuffers; i++) *channelCount += bufferList->mBuffers[i].mNumberChannels; } } if (streamList) free(streamList); if (bufferList) free(bufferList); return err; } OSStatus display_device_names() { UInt32 size; Boolean isWritable; int i, deviceNum; OSStatus err; CFStringRef UIname; err = AudioHardwareGetPropertyInfo(kAudioHardwarePropertyDevices, &size, &isWritable); if (err != noErr) return err; deviceNum = size/sizeof(AudioDeviceID); AudioDeviceID devices[deviceNum]; err = AudioHardwareGetProperty(kAudioHardwarePropertyDevices, &size, devices); if (err != noErr) return err; for (i = 0; i < deviceNum; i++) { char device_name[256]; char internal_name[256]; size = sizeof(CFStringRef); UIname = NULL; err = AudioDeviceGetProperty(devices[i], 0, false, kAudioDevicePropertyDeviceUID, &size, &UIname); if (err == noErr) { CFStringGetCString(UIname, internal_name, 256, CFStringGetSystemEncoding()); } else { goto error; } size = 256; err = AudioDeviceGetProperty(devices[i], 0, false, kAudioDevicePropertyDeviceName, &size, device_name); if (err != noErr) return err; printf("ICI\n"); printf("Device name = \'%s\', internal_name = \'%s\' (to be used as -d parameter)\n", device_name, internal_name); } return noErr; error: if (UIname != NULL) CFRelease(UIname); return err; } OSStatus CoreAudioDriver::render(AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList *ioData) { int res, i; AudioUnitRender(au_hal, ioActionFlags, inTimeStamp, 1, inNumberFrames, input_list); if (xrun_detected > 0) { /* XRun was detected */ trav_time_t current_time = get_microseconds (); device->delay(current_time - (last_wait_ust + period_usecs)); last_wait_ust = current_time; xrun_detected = 0; return 0; } else { last_wait_ust = get_microseconds(); device->transport_cycle_start(get_microseconds()); res = device->run_cycle(inNumberFrames, 0); } if (null_cycle_occured) { null_cycle_occured = 0; for (i = 0; i < playback_nchannels; i++) { memset((float*)ioData->mBuffers[i].mData, 0, sizeof(float) * inNumberFrames); } } else { // TODO find out if ioData->mBuffers[i] correspond with the playbackChannels indices audio_sample_t* buf; for (int i=0; ihas_data()) { continue; } buf = channel->get_data(); memcpy((float*)ioData->mBuffers[i].mData, buf, sizeof(float) * inNumberFrames); // Not sure if this is needed? I think so though channel->silence_buffer(inNumberFrames); } } return res; } OSStatus CoreAudioDriver::render_input( AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList *ioData) { AudioUnitRender(au_hal, ioActionFlags, inTimeStamp, 1, inNumberFrames, input_list); if (xrun_detected > 0) { /* XRun was detected */ trav_time_t current_time = get_microseconds(); device->delay(current_time - (last_wait_ust + period_usecs)); last_wait_ust = current_time; xrun_detected = 0; return 0; } else { last_wait_ust = get_microseconds(); device->transport_cycle_start(get_microseconds()); return device->run_cycle(inNumberFrames, 0); } } OSStatus CoreAudioDriver::sr_notification(AudioDeviceID inDevice, UInt32 inChannel, Boolean isInput, AudioDevicePropertyID inPropertyID) { switch (inPropertyID) { case kAudioDevicePropertyNominalSampleRate: { JCALog("JackCoreAudioDriver::SRNotificationCallback kAudioDevicePropertyNominalSampleRate \n"); state = 1; break; } } return noErr; } OSStatus CoreAudioDriver::notification(AudioDeviceID inDevice, UInt32 inChannel, Boolean isInput, AudioDevicePropertyID inPropertyID) { switch (inPropertyID) { case kAudioDeviceProcessorOverload: xrun_detected = 1; break; case kAudioDevicePropertyNominalSampleRate: { UInt32 outSize = sizeof(Float64); Float64 sampleRate; AudioStreamBasicDescription srcFormat, dstFormat; // FIXME kAudioDeviceSectionGlobal not declared compile error ? OSStatus err; /* OSStatus err = AudioDeviceGetProperty(device_id, 0, kAudioDeviceSectionGlobal, kAudioDevicePropertyNominalSampleRate, &outSize, &sampleRate); if (err != noErr) { PERROR("Cannot get current sample rate"); return kAudioHardwareUnsupportedOperationError; }*/ JCALog("JackCoreAudioDriver::NotificationCallback kAudioDevicePropertyNominalSampleRate %ld\n", (long)sampleRate); outSize = sizeof(AudioStreamBasicDescription); // Update SR for input err = AudioUnitGetProperty(au_hal, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &srcFormat, &outSize); if (err != noErr) { PERROR("Error calling AudioUnitSetProperty - kAudioUnitProperty_StreamFormat kAudioUnitScope_Input"); } srcFormat.mSampleRate = sampleRate; err = AudioUnitSetProperty(au_hal, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &srcFormat, outSize); if (err != noErr) { PERROR("Error calling AudioUnitSetProperty - kAudioUnitProperty_StreamFormat kAudioUnitScope_Input"); } // Update SR for output err = AudioUnitGetProperty(au_hal, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 1, &dstFormat, &outSize); if (err != noErr) { PERROR("Error calling AudioUnitSetProperty - kAudioUnitProperty_StreamFormat kAudioUnitScope_Output"); } dstFormat.mSampleRate = sampleRate; err = AudioUnitSetProperty(au_hal, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 1, &dstFormat, outSize); if (err != noErr) { PERROR("Error calling AudioUnitSetProperty - kAudioUnitProperty_StreamFormat kAudioUnitScope_Output"); } break; } } return noErr; } int CoreAudioDriver::attach() { int port_flags; channel_t chn; AudioChannel* chan; char buf[32]; char channel_name[64]; OSStatus err; UInt32 size; UInt32 value1,value2; Boolean isWritable; device->set_buffer_size (frames_per_cycle); device->set_sample_rate (frame_rate); port_flags = PortIsOutput|PortIsPhysical|PortIsTerminal; for (chn = 0; chn < capture_nchannels; chn++) { err = AudioDeviceGetPropertyInfo(device_id, chn + 1, true, kAudioDevicePropertyChannelName, &size, &isWritable); if (err == noErr && size > 0) { err = AudioDeviceGetProperty(device_id, chn + 1, true, kAudioDevicePropertyChannelName, &size, channel_name); if (err != noErr) JCALog("AudioDeviceGetProperty kAudioDevicePropertyChannelName error \n"); snprintf(buf, sizeof(buf) - 1, "%s:out_%s%lu", capture_driver_name, channel_name, chn + 1); } else { snprintf(buf, sizeof(buf) - 1, "%s:out%lu", capture_driver_name, chn + 1); } chan = device->register_capture_channel(buf, "32 bit float audio", port_flags, frames_per_cycle, chn); chan->set_latency( frames_per_cycle + capture_frame_latency ); captureChannels.append(chan); size = sizeof(UInt32); value1 = value2 = 0; err = AudioDeviceGetProperty(device_id, 0, true, kAudioDevicePropertyLatency, &size, &value1); if (err != noErr) JCALog("AudioDeviceGetProperty kAudioDevicePropertyLatency error \n"); err = AudioDeviceGetProperty(device_id, 0, true, kAudioDevicePropertySafetyOffset, &size, &value2); if (err != noErr) JCALog("AudioDeviceGetProperty kAudioDevicePropertySafetyOffset error \n"); } port_flags = PortIsInput|PortIsPhysical|PortIsTerminal; for (chn = 0; chn < playback_nchannels; chn++) { err = AudioDeviceGetPropertyInfo(device_id, chn + 1, false, kAudioDevicePropertyChannelName, &size, &isWritable); if (err == noErr && size > 0) { err = AudioDeviceGetProperty(device_id, chn + 1, false, kAudioDevicePropertyChannelName, &size, channel_name); if (err != noErr) JCALog("AudioDeviceGetProperty kAudioDevicePropertyChannelName error \n"); snprintf(buf, sizeof(buf) - 1, "%s:in_%s%lu", playback_driver_name, channel_name, chn + 1); } else { snprintf(buf, sizeof(buf) - 1, "%s:in%lu", playback_driver_name, chn + 1); } chan = device->register_playback_channel(buf, "32 bit float audio", port_flags, frames_per_cycle, chn); chan->set_latency( frames_per_cycle + capture_frame_latency ); playbackChannels.append(chan); size = sizeof(UInt32); value1 = value2 = 0; err = AudioDeviceGetProperty(device_id, 0, false, kAudioDevicePropertyLatency, &size, &value1); if (err != noErr) JCALog("AudioDeviceGetProperty kAudioDevicePropertyLatency error \n"); err = AudioDeviceGetProperty(device_id, 0, false, kAudioDevicePropertySafetyOffset, &size, &value2); if (err != noErr) JCALog("AudioDeviceGetProperty kAudioDevicePropertySafetyOffset error \n"); } // Input buffers do no change : prepare them only once for (chn = 0; chn < capture_nchannels; chn++) { input_list->mBuffers[chn].mData = (audio_sample_t*)(captureChannels.at(chn)->get_buffer(frames_per_cycle)); } return 1; } int CoreAudioDriver::setup(bool capture, bool playback, const QString & cardDevice) { return -1; } static OSStatus _render(void * inRefCon, AudioUnitRenderActionFlags * ioActionFlags, const AudioTimeStamp * inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList * ioData) { CoreAudioDriver* driver = (CoreAudioDriver*)inRefCon; return driver->render(ioActionFlags, inTimeStamp, inBusNumber, inNumberFrames, ioData); } static OSStatus _render_input(void * inRefCon, AudioUnitRenderActionFlags * ioActionFlags, const AudioTimeStamp * inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList * ioData) { CoreAudioDriver* driver = (CoreAudioDriver*)inRefCon; return driver->render_input(ioActionFlags, inTimeStamp, inBusNumber, inNumberFrames, ioData); } static OSStatus _sr_notification(AudioDeviceID inDevice, UInt32 inChannel, Boolean isInput, AudioDevicePropertyID inPropertyID, void * inClientData) { CoreAudioDriver* driver = (CoreAudioDriver*)inClientData; return driver->sr_notification(inDevice, inChannel, isInput, inPropertyID); } static OSStatus _notification(AudioDeviceID inDevice, UInt32 inChannel, Boolean isInput, AudioDevicePropertyID inPropertyID, void * inClientData) { CoreAudioDriver* driver = (CoreAudioDriver*)inClientData; return driver->notification(inDevice, inChannel, isInput, inPropertyID); } traverso-0.49.4/src/engine/precompile.h000644 001750 001750 00000000335 11163362147 020330 0ustar00remonremon000000 000000 #include #include // All moc genereated code has this include #include #include #include #include #include #include traverso-0.49.4/src/engine/Driver.h000644 001750 001750 00000004410 11163362147 017422 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2006 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: Driver.h,v 1.5 2007/03/19 11:18:57 r_sijrier Exp $ */ #ifndef DRIVER_H #define DRIVER_H #include "defines.h" #include #define DEFAULTDRIVERBUFFERSIZE 1024 #include #include #include class AudioDevice; class AudioChannel; class Driver : public QObject { public: Driver(AudioDevice* dev, int rate, nframes_t bufferSize); virtual ~Driver(); virtual int _run_cycle(); virtual int _read(nframes_t nframes); virtual int _write(nframes_t nframes); virtual int _null_cycle(nframes_t nframes); virtual int setup(bool capture=true, bool playback=true, const QString& cardDevice="none"); virtual int attach(); virtual int detach(); virtual int start(); virtual int stop(); virtual QString get_device_name(); virtual QString get_device_longname(); ProcessCallback read; ProcessCallback write; RunCycleCallback run_cycle; protected: AudioDevice* device; QList captureChannels; QList playbackChannels; int dither; dither_state_t* dither_state; trav_time_t period_usecs; trav_time_t last_wait_ust; nframes_t frame_rate; nframes_t frames_per_cycle; nframes_t capture_frame_latency; nframes_t playback_frame_latency; }; #endif //eof traverso-0.49.4/src/engine/libtraverso.h000644 001750 001750 00000000111 11163362147 020515 0ustar00remonremon000000 000000 #include "AudioDevice.h" #include "AudioBus.h" #include "AudioChannel.h" traverso-0.49.4/src/engine/memops.h000644 001750 001750 00000016351 11163362147 017476 0ustar00remonremon000000 000000 /* Copyright (C) 1999-2000 Paul Davis This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: memops.h,v 1.2 2008/01/15 19:51:49 r_sijrier Exp $ */ #ifndef __jack_memops_h__ #define __jack_memops_h__ #include #include "defines.h" typedef enum { None, Rectangular, Triangular, Shaped } DitherAlgorithm; #define DITHER_BUF_SIZE 8 #define DITHER_BUF_MASK 7 typedef struct { unsigned int depth; float rm1; unsigned int idx; float e[DITHER_BUF_SIZE]; } dither_state_t; void sample_move_d32u24_sSs (char *dst, audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state); void sample_move_d32u24_sS (char *dst, audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state); void sample_move_d24_sS (char *dst, audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state); void sample_move_d24_sSs (char *dst, audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state); void sample_move_d16_sS (char *dst, audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state); void sample_move_d16_sSs (char *dst, audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state); void sample_move_dither_rect_d32u24_sSs (char *dst, audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state); void sample_move_dither_rect_d32u24_sS (char *dst, audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state); void sample_move_dither_tri_d32u24_sSs (char *dst, audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state); void sample_move_dither_tri_d32u24_sS (char *dst, audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state); void sample_move_dither_shaped_d32u24_sSs (char *dst, audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state); void sample_move_dither_shaped_d32u24_sS (char *dst, audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state); void sample_move_dither_rect_d24_sS (char *dst, audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state); void sample_move_dither_rect_d24_sSs (char *dst, audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state); void sample_move_dither_tri_d24_sS (char *dst, audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state); void sample_move_dither_tri_d24_sSs (char *dst, audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state); void sample_move_dither_shaped_d24_sSs (char *dst, audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state); void sample_move_dither_shaped_d24_sS (char *dst, audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state); void sample_move_dither_rect_d16_sS (char *dst, audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state); void sample_move_dither_rect_d16_sSs (char *dst, audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state); void sample_move_dither_tri_d16_sS (char *dst, audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state); void sample_move_dither_tri_d16_sSs (char *dst, audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state); void sample_move_dither_shaped_d16_sS (char *dst, audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state); void sample_move_dither_shaped_d16_sSs (char *dst, audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state); void sample_move_dS_s32u24s (audio_sample_t *dst, char *src, unsigned long nsamples, unsigned long src_skip); void sample_move_dS_s32u24 (audio_sample_t *dst, char *src, unsigned long nsamples, unsigned long src_skip); void sample_move_dS_s24 (audio_sample_t *dst, char *src, unsigned long nsamples, unsigned long src_skip); void sample_move_dS_s24s (audio_sample_t *dst, char *src, unsigned long nsamples, unsigned long src_skip); void sample_move_dS_s16 (audio_sample_t *dst, char *src, unsigned long nsamples, unsigned long src_skip); void sample_move_dS_s16s (audio_sample_t *dst, char *src, unsigned long nsamples, unsigned long src_skip); void sample_merge_d16_sS (char *dst, audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state); void sample_merge_d32u24_sS (char *dst, audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state); static __inline__ void sample_merge (audio_sample_t *dst, audio_sample_t *src, unsigned long cnt) { while (cnt--) { *dst += *src; dst++; src++; } } static __inline__ void sample_memcpy (audio_sample_t *dst, audio_sample_t *src, unsigned long cnt) { memcpy (dst, src, cnt * sizeof (audio_sample_t)); } void memset_interleave (char *dst, char val, unsigned long bytes, unsigned long unit_bytes, unsigned long skip_bytes); void memcpy_fake (char *dst, char *src, unsigned long src_bytes, unsigned long foo, unsigned long bar); void memcpy_interleave_d16_s16 (char *dst, char *src, unsigned long src_bytes, unsigned long dst_skip_bytes, unsigned long src_skip_bytes); void memcpy_interleave_d24_s24 (char *dst, char *src, unsigned long src_bytes, unsigned long dst_skip_bytes, unsigned long src_skip_bytes); void memcpy_interleave_d32_s32 (char *dst, char *src, unsigned long src_bytes, unsigned long dst_skip_bytes, unsigned long src_skip_bytes); void merge_memcpy_interleave_d16_s16 (char *dst, char *src, unsigned long src_bytes, unsigned long dst_skip_bytes, unsigned long src_skip_bytes); void merge_memcpy_interleave_d24_s24 (char *dst, char *src, unsigned long src_bytes, unsigned long dst_skip_bytes, unsigned long src_skip_bytes); void merge_memcpy_interleave_d32_s32 (char *dst, char *src, unsigned long src_bytes, unsigned long dst_skip_bytes, unsigned long src_skip_bytes); void merge_memcpy_d16_s16 (char *dst, char *src, unsigned long src_bytes, unsigned long foo, unsigned long bar); void merge_memcpy_d32_s32 (char *dst, char *src, unsigned long src_bytes, unsigned long foo, unsigned long bar); #endif /* __jack_memops_h__ */ traverso-0.49.4/src/engine/Driver.cpp000644 001750 001750 00000006203 11163362147 017757 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2006 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: Driver.cpp,v 1.6 2007/03/19 11:18:57 r_sijrier Exp $ */ #include "Driver.h" #include "AudioDevice.h" #include "AudioChannel.h" // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" Driver::Driver( AudioDevice* dev , int rate, nframes_t bufferSize) { device = dev; frame_rate = rate; frames_per_cycle = bufferSize; read = MakeDelegate(this, &Driver::_read); write = MakeDelegate(this, &Driver::_write); run_cycle = RunCycleCallback(this, &Driver::_run_cycle); } Driver::~ Driver( ) { PENTERDES; } int Driver::_run_cycle( ) { // * 1000, we want it in millisecond // / 2, 2 bytes (16 bit) device->transport_cycle_end (get_microseconds()); device->mili_sleep(23); device->transport_cycle_start (get_microseconds()); return device->run_cycle( frames_per_cycle, 0); } int Driver::_read( nframes_t ) { return 1; } int Driver::_write( nframes_t nframes ) { foreach(AudioChannel* chan, playbackChannels) { chan->get_data(); chan->silence_buffer(nframes); } return 1; } int Driver::_null_cycle( nframes_t ) { return 1; } int Driver::setup(bool capture, bool playback, const QString& cardDevice) { Q_UNUSED(capture); Q_UNUSED(playback); Q_UNUSED(cardDevice); return 1; } int Driver::attach( ) { int port_flags; char buf[32]; AudioChannel* chan; device->set_buffer_size (frames_per_cycle); device->set_sample_rate (frame_rate); port_flags = PortIsOutput|PortIsPhysical|PortIsTerminal; // Create 2 fake capture channels for (uint chn=0; chn<2; chn++) { snprintf (buf, sizeof(buf) - 1, "capture_%d", chn+1); chan = device->register_capture_channel(buf, JACK_DEFAULT_AUDIO_TYPE, port_flags, frames_per_cycle, chn); chan->set_latency( frames_per_cycle + capture_frame_latency ); captureChannels.append(chan); } // Create 2 fake playback channels for (uint chn=0; chn<2; chn++) { snprintf (buf, sizeof(buf) - 1, "playback_%d", chn+1); chan = device->register_playback_channel(buf, JACK_DEFAULT_AUDIO_TYPE, port_flags, frames_per_cycle, chn); chan->set_latency( frames_per_cycle + capture_frame_latency ); playbackChannels.append(chan); } return 1; } int Driver::detach( ) { return 0; } int Driver::start( ) { return 1; } int Driver::stop( ) { return 1; } QString Driver::get_device_name( ) { return "Null Audio Device"; } QString Driver::get_device_longname( ) { return "Null Audio Device"; } //eof traverso-0.49.4/src/engine/memops.cpp000644 001750 001750 00000066260 11163362147 020035 0ustar00remonremon000000 000000 /* Copyright (C) 2000 Paul Davis This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: memops.cpp,v 1.2 2008/01/15 19:51:49 r_sijrier Exp $ */ #define _ISOC9X_SOURCE 1 #define _ISOC99_SOURCE 1 #define __USE_ISOC9X 1 #define __USE_ISOC99 1 #include #include #include #include #include #include #include #define SAMPLE_MAX_24BIT 8388608.0f #define SAMPLE_MAX_16BIT 32768.0f #define f_round(f) lrintf(f) inline unsigned int fast_rand() { static unsigned int seed = 22222; seed = (seed * 96314165) + 907633515; return seed; } void sample_move_d32u24_sSs (char *dst, audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state) { long long y; int z; while (nsamples--) { y = (long long)(*src * SAMPLE_MAX_24BIT) << 8; if (y > INT_MAX) { z = INT_MAX; } else if (y < INT_MIN) { z = INT_MIN; } else { z = (int)y; } #if __BYTE_ORDER == __LITTLE_ENDIAN dst[0]=(char)(z>>24); dst[1]=(char)(z>>16); dst[2]=(char)(z>>8); dst[3]=(char)(z); #elif __BYTE_ORDER == __BIG_ENDIAN dst[0]=(char)(z); dst[1]=(char)(z>>8); dst[2]=(char)(z>>16); dst[3]=(char)(z>>24); #endif dst += dst_skip; src++; } } void sample_move_d32u24_sS (char *dst, audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t*) { long long y; while (nsamples--) { y = (long long)(*src * SAMPLE_MAX_24BIT) << 8; if (y > INT_MAX) { *((int *) dst) = INT_MAX; } else if (y < INT_MIN) { *((int *) dst) = INT_MIN; } else { *((int *) dst) = (int)y; } dst += dst_skip; src++; } } void sample_move_dS_s32u24 (audio_sample_t *dst, char *src, unsigned long nsamples, unsigned long src_skip) { /* ALERT: signed sign-extension portability !!! */ while (nsamples--) { *dst = (*((int *) src) >> 8) / SAMPLE_MAX_24BIT; dst++; src += src_skip; } } void sample_move_dither_rect_d32u24_sS (char *dst, audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *) { /* ALERT: signed sign-extension portability !!! */ audio_sample_t x; long long y; while (nsamples--) { x = *src * SAMPLE_MAX_16BIT; x -= (float)fast_rand() / (float)INT_MAX; y = (long long)f_round(x); y <<= 16; if (y > INT_MAX) { *((int *) dst) = INT_MAX; } else if (y < INT_MIN) { *((int *) dst) = INT_MIN; } else { *((int *) dst) = (int)y; } dst += dst_skip; src++; } } void sample_move_dither_tri_d32u24_sS (char *dst, audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state) { audio_sample_t x; float r; float rm1 = state->rm1; long long y; while (nsamples--) { x = *src * (float)SAMPLE_MAX_16BIT; r = 2.0f * (float)fast_rand() / (float)INT_MAX - 1.0f; x += r - rm1; rm1 = r; y = (long long)f_round(x); y <<= 16; if (y > INT_MAX) { *((int *) dst) = INT_MAX; } else if (y < INT_MIN) { *((int *) dst) = INT_MIN; } else { *((int *) dst) = (int)y; } dst += dst_skip; src++; } state->rm1 = rm1; } void sample_move_dS_s32u24s (audio_sample_t *dst, char *src, unsigned long nsamples, unsigned long src_skip) { /* ALERT: signed sign-extension portability !!! */ while (nsamples--) { int x; #if __BYTE_ORDER == __LITTLE_ENDIAN x = (unsigned char)(src[0]); x <<= 8; x |= (unsigned char)(src[1]); x <<= 8; x |= (unsigned char)(src[2]); x <<= 8; x |= (unsigned char)(src[3]); #elif __BYTE_ORDER == __BIG_ENDIAN x = (unsigned char)(src[3]); x <<= 8; x |= (unsigned char)(src[2]); x <<= 8; x |= (unsigned char)(src[1]); x <<= 8; x |= (unsigned char)(src[0]); #endif *dst = (x >> 8) / SAMPLE_MAX_24BIT; dst++; src += src_skip; } } void sample_move_dither_shaped_d32u24_sS (char *dst, audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state) { audio_sample_t x; audio_sample_t xe; /* the innput sample - filtered error */ audio_sample_t xp; /* x' */ float r; float rm1 = state->rm1; unsigned int idx = state->idx; long long y; while (nsamples--) { x = *src * (float)SAMPLE_MAX_16BIT; r = 2.0f * (float)fast_rand() / (float)INT_MAX - 1.0f; /* Filter the error with Lipshitz's minimally audible FIR: [2.033 -2.165 1.959 -1.590 0.6149] */ xe = x - state->e[idx] * 2.033f + state->e[(idx - 1) & DITHER_BUF_MASK] * 2.165f - state->e[(idx - 2) & DITHER_BUF_MASK] * 1.959f + state->e[(idx - 3) & DITHER_BUF_MASK] * 1.590f - state->e[(idx - 4) & DITHER_BUF_MASK] * 0.6149f; xp = xe + r - rm1; rm1 = r; /* This could be some inline asm on x86 */ y = (long long)f_round(xp); /* Intrinsic z^-1 delay */ idx = (idx + 1) & DITHER_BUF_MASK; state->e[idx] = y - xe; y <<= 16; if (y > INT_MAX) { *((int *) dst) = INT_MAX; } else if (y < INT_MIN) { *((int *) dst) = INT_MIN; } else { *((int *) dst) = y; } dst += dst_skip; src++; } state->rm1 = rm1; state->idx = idx; } void sample_move_dither_rect_d32u24_sSs (char *dst, audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state) { /* ALERT: signed sign-extension portability !!! */ audio_sample_t x; long long y; int z; while (nsamples--) { x = *src * SAMPLE_MAX_16BIT; x -= (float)fast_rand() / (float)INT_MAX; y = (long long)f_round(x); y <<= 16; if (y > INT_MAX) { z = INT_MAX; } else if (y < INT_MIN) { z = INT_MIN; } else { z = (int)y; } #if __BYTE_ORDER == __LITTLE_ENDIAN dst[0]=(char)(z>>24); dst[1]=(char)(z>>16); dst[2]=(char)(z>>8); dst[3]=(char)(z); #elif __BYTE_ORDER == __BIG_ENDIAN dst[0]=(char)(z); dst[1]=(char)(z>>8); dst[2]=(char)(z>>16); dst[3]=(char)(z>>24); #endif dst += dst_skip; src++; } } void sample_move_dither_tri_d32u24_sSs (char *dst, audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state) { audio_sample_t x; float r; float rm1 = state->rm1; long long y; int z; while (nsamples--) { x = *src * (float)SAMPLE_MAX_16BIT; r = 2.0f * (float)fast_rand() / (float)INT_MAX - 1.0f; x += r - rm1; rm1 = r; y = (long long)f_round(x); y <<= 16; if (y > INT_MAX) { z = INT_MAX; } else if (y < INT_MIN) { z = INT_MIN; } else { z = (int)y; } #if __BYTE_ORDER == __LITTLE_ENDIAN dst[0]=(char)(z>>24); dst[1]=(char)(z>>16); dst[2]=(char)(z>>8); dst[3]=(char)(z); #elif __BYTE_ORDER == __BIG_ENDIAN dst[0]=(char)(z); dst[1]=(char)(z>>8); dst[2]=(char)(z>>16); dst[3]=(char)(z>>24); #endif dst += dst_skip; src++; } state->rm1 = rm1; } void sample_move_dither_shaped_d32u24_sSs (char *dst, audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state) { audio_sample_t x; audio_sample_t xe; /* the innput sample - filtered error */ audio_sample_t xp; /* x' */ float r; float rm1 = state->rm1; unsigned int idx = state->idx; long long y; int z; while (nsamples--) { x = *src * (float)SAMPLE_MAX_16BIT; r = 2.0f * (float)fast_rand() / (float)INT_MAX - 1.0f; /* Filter the error with Lipshitz's minimally audible FIR: [2.033 -2.165 1.959 -1.590 0.6149] */ xe = x - state->e[idx] * 2.033f + state->e[(idx - 1) & DITHER_BUF_MASK] * 2.165f - state->e[(idx - 2) & DITHER_BUF_MASK] * 1.959f + state->e[(idx - 3) & DITHER_BUF_MASK] * 1.590f - state->e[(idx - 4) & DITHER_BUF_MASK] * 0.6149f; xp = xe + r - rm1; rm1 = r; /* This could be some inline asm on x86 */ y = (long long)f_round(xp); /* Intrinsic z^-1 delay */ idx = (idx + 1) & DITHER_BUF_MASK; state->e[idx] = y - xe; y <<= 16; if (y > INT_MAX) { z = INT_MAX; } else if (y < INT_MIN) { z = INT_MIN; } else { z = (int)y; } #if __BYTE_ORDER == __LITTLE_ENDIAN dst[0]=(char)(z>>24); dst[1]=(char)(z>>16); dst[2]=(char)(z>>8); dst[3]=(char)(z); #elif __BYTE_ORDER == __BIG_ENDIAN dst[0]=(char)(z); dst[1]=(char)(z>>8); dst[2]=(char)(z>>16); dst[3]=(char)(z>>24); #endif dst += dst_skip; src++; } state->rm1 = rm1; state->idx = idx; } void sample_move_d24_sS (char *dst, audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *) { long long y; while (nsamples--) { y = (long long)(*src * SAMPLE_MAX_24BIT); if (y > (INT_MAX >> 8 )) { y = (INT_MAX >> 8); } else if (y < (INT_MIN >> 8 )) { y = (INT_MIN >> 8 ); } #if __BYTE_ORDER == __LITTLE_ENDIAN memcpy (dst, &y, 3); #elif __BYTE_ORDER == __BIG_ENDIAN memcpy (dst, (char *)&y + 5, 3); #endif dst += dst_skip; src++; } } void sample_move_d24_sSs (char *dst, audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state) { long long y; int z; while (nsamples--) { y = (long long)(*src * SAMPLE_MAX_24BIT); if (y > (INT_MAX >> 8 )) { z = (INT_MAX >> 8); } else if (y < (INT_MIN >> 8 )) { z = (INT_MIN >> 8 ); } else { z = (int)y; } #if __BYTE_ORDER == __LITTLE_ENDIAN dst[0]=(char)(z>>16); dst[1]=(char)(z>>8); dst[2]=(char)(z); #elif __BYTE_ORDER == __BIG_ENDIAN dst[0]=(char)(z); dst[1]=(char)(z>>8); dst[2]=(char)(z>>16); #endif dst += dst_skip; src++; } } void sample_move_dS_s24 (audio_sample_t *dst, char *src, unsigned long nsamples, unsigned long src_skip) { /* ALERT: signed sign-extension portability !!! */ while (nsamples--) { int x; #if __BYTE_ORDER == __LITTLE_ENDIAN memcpy((char*)&x + 1, src, 3); #elif __BYTE_ORDER == __BIG_ENDIAN memcpy(&x, src, 3); #endif x >>= 8; *dst = x / SAMPLE_MAX_24BIT; dst++; src += src_skip; } } void sample_move_dither_rect_d24_sS (char *dst, audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *) { /* ALERT: signed sign-extension portability !!! */ audio_sample_t x; long long y; while (nsamples--) { x = *src * SAMPLE_MAX_16BIT; x -= (float)fast_rand() / (float)INT_MAX; y = (long long)f_round(x); y <<= 8; if (y > (INT_MAX >> 8)) { y = (INT_MAX >> 8); } else if (y < (INT_MIN >> 8)) { y = (INT_MIN >> 8); } #if __BYTE_ORDER == __LITTLE_ENDIAN memcpy (dst, &y, 3); #elif __BYTE_ORDER == __BIG_ENDIAN memcpy (dst, (char *)&y + 5, 3); #endif dst += dst_skip; src++; } } void sample_move_dS_s24s (audio_sample_t *dst, char *src, unsigned long nsamples, unsigned long src_skip) { /* ALERT: signed sign-extension portability !!! */ while (nsamples--) { int x; #if __BYTE_ORDER == __LITTLE_ENDIAN x = (unsigned char)(src[0]); x <<= 8; x |= (unsigned char)(src[1]); x <<= 8; x |= (unsigned char)(src[2]); /* correct sign bit and the rest of the top byte */ if (src[0] & 0x80) { x |= 0xff << 24; } #elif __BYTE_ORDER == __BIG_ENDIAN x = (unsigned char)(src[2]); x <<= 8; x |= (unsigned char)(src[1]); x <<= 8; x |= (unsigned char)(src[0]); /* correct sign bit and the rest of the top byte */ if (src[0] & 0x80) { x |= 0xff << 24; } #endif *dst = x / SAMPLE_MAX_24BIT; dst++; src += src_skip; } } void sample_move_dither_rect_d24_sSs (char *dst, audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state) { /* ALERT: signed sign-extension portability !!! */ audio_sample_t x; long long y; int z; while (nsamples--) { x = *src * SAMPLE_MAX_16BIT; x -= (float)fast_rand() / (float)INT_MAX; y = (long long)f_round(x); y <<= 8; if (y > (INT_MAX >> 8)) { z = (INT_MAX >> 8); } else if (y < (INT_MIN >> 8)) { z = (INT_MIN >> 8); } else { z = (int)y; } #if __BYTE_ORDER == __LITTLE_ENDIAN dst[0]=(char)(z>>16); dst[1]=(char)(z>>8); dst[2]=(char)(z); #elif __BYTE_ORDER == __BIG_ENDIAN dst[0]=(char)(z); dst[1]=(char)(z>>8); dst[2]=(char)(z>>16); #endif dst += dst_skip; src++; } } void sample_move_dither_tri_d24_sSs (char *dst, audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state) { audio_sample_t x; float r; float rm1 = state->rm1; long long y; int z; while (nsamples--) { x = *src * (float)SAMPLE_MAX_16BIT; r = 2.0f * (float)fast_rand() / (float)INT_MAX - 1.0f; x += r - rm1; rm1 = r; y = (long long)f_round(x); y <<= 8; if (y > (INT_MAX >> 8)) { z = (INT_MAX >> 8); } else if (y < (INT_MIN >> 8)) { z = (INT_MIN >> 8); } else { z = (int)y; } #if __BYTE_ORDER == __LITTLE_ENDIAN dst[0]=(char)(z>>16); dst[1]=(char)(z>>8); dst[2]=(char)(z); #elif __BYTE_ORDER == __BIG_ENDIAN dst[0]=(char)(z); dst[1]=(char)(z>>8); dst[2]=(char)(z>>16); #endif dst += dst_skip; src++; } state->rm1 = rm1; } void sample_move_dither_tri_d24_sS (char *dst, audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state) { audio_sample_t x; float r; float rm1 = state->rm1; long long y; while (nsamples--) { x = *src * (float)SAMPLE_MAX_16BIT; r = 2.0f * (float)fast_rand() / (float)INT_MAX - 1.0f; x += r - rm1; rm1 = r; y = (long long)f_round(x); y <<= 8; if (y > (INT_MAX >> 8)) { y = (INT_MAX >> 8); } else if (y < (INT_MIN >> 8)) { y = (INT_MIN >> 8); } #if __BYTE_ORDER == __LITTLE_ENDIAN memcpy (dst, &y, 3); #elif __BYTE_ORDER == __BIG_ENDIAN memcpy (dst, (char *)&y + 5, 3); #endif dst += dst_skip; src++; } state->rm1 = rm1; } void sample_move_dither_shaped_d24_sS (char *dst, audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state) { audio_sample_t x; audio_sample_t xe; /* the innput sample - filtered error */ audio_sample_t xp; /* x' */ float r; float rm1 = state->rm1; unsigned int idx = state->idx; long long y; while (nsamples--) { x = *src * (float)SAMPLE_MAX_16BIT; r = 2.0f * (float)fast_rand() / (float)INT_MAX - 1.0f; /* Filter the error with Lipshitz's minimally audible FIR: [2.033 -2.165 1.959 -1.590 0.6149] */ xe = x - state->e[idx] * 2.033f + state->e[(idx - 1) & DITHER_BUF_MASK] * 2.165f - state->e[(idx - 2) & DITHER_BUF_MASK] * 1.959f + state->e[(idx - 3) & DITHER_BUF_MASK] * 1.590f - state->e[(idx - 4) & DITHER_BUF_MASK] * 0.6149f; xp = xe + r - rm1; rm1 = r; /* This could be some inline asm on x86 */ y = (long long)f_round(xp); /* Intrinsic z^-1 delay */ idx = (idx + 1) & DITHER_BUF_MASK; state->e[idx] = y - xe; y <<= 8; if (y > (INT_MAX >> 8)) { y = (INT_MAX >> 8); } else if (y < (INT_MIN >> 8)) { y = (INT_MIN >> 8); } #if __BYTE_ORDER == __LITTLE_ENDIAN memcpy (dst, &y, 3); #elif __BYTE_ORDER == __BIG_ENDIAN memcpy (dst, (char *)&y + 5, 3); #endif dst += dst_skip; src++; } state->rm1 = rm1; state->idx = idx; } void sample_move_dither_shaped_d24_sSs (char *dst, audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state) { audio_sample_t x; audio_sample_t xe; /* the innput sample - filtered error */ audio_sample_t xp; /* x' */ float r; float rm1 = state->rm1; unsigned int idx = state->idx; long long y; int z; while (nsamples--) { x = *src * (float)SAMPLE_MAX_16BIT; r = 2.0f * (float)fast_rand() / (float)INT_MAX - 1.0f; /* Filter the error with Lipshitz's minimally audible FIR: [2.033 -2.165 1.959 -1.590 0.6149] */ xe = x - state->e[idx] * 2.033f + state->e[(idx - 1) & DITHER_BUF_MASK] * 2.165f - state->e[(idx - 2) & DITHER_BUF_MASK] * 1.959f + state->e[(idx - 3) & DITHER_BUF_MASK] * 1.590f - state->e[(idx - 4) & DITHER_BUF_MASK] * 0.6149f; xp = xe + r - rm1; rm1 = r; /* This could be some inline asm on x86 */ y = (long long)f_round(xp); /* Intrinsic z^-1 delay */ idx = (idx + 1) & DITHER_BUF_MASK; state->e[idx] = y - xe; y <<= 8; if (y > (INT_MAX >> 8)) { z = (INT_MAX >> 8); } else if (y < (INT_MIN >> 8)) { z = (INT_MIN >> 8); } else { z = (int)y; } #if __BYTE_ORDER == __LITTLE_ENDIAN dst[0]=(char)(z>>16); dst[1]=(char)(z>>8); dst[2]=(char)(z); #elif __BYTE_ORDER == __BIG_ENDIAN dst[0]=(char)(z); dst[1]=(char)(z>>8); dst[2]=(char)(z>>16); #endif dst += dst_skip; src++; } state->rm1 = rm1; state->idx = idx; } void sample_move_d16_sS (char *dst, audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t* ) { int tmp; /* ALERT: signed sign-extension portability !!! */ while (nsamples--) { tmp = f_round(*src * SAMPLE_MAX_16BIT); if (tmp > SHRT_MAX) { *((short *)dst) = SHRT_MAX; } else if (tmp < SHRT_MIN) { *((short *)dst) = SHRT_MIN; } else { *((short *) dst) = (short) tmp; } dst += dst_skip; src++; } } void sample_move_dither_rect_d16_sSs (char *dst, audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state) { audio_sample_t val; int tmp; while (nsamples--) { val = *src * (float)SAMPLE_MAX_16BIT; val -= (float)fast_rand() / (float)INT_MAX; tmp = f_round(val); if (tmp > SHRT_MAX) { tmp = SHRT_MAX; } else if (tmp < SHRT_MIN) { tmp = SHRT_MIN; } #if __BYTE_ORDER == __LITTLE_ENDIAN dst[0]=(char)(tmp>>8); dst[1]=(char)(tmp); #elif __BYTE_ORDER == __BIG_ENDIAN dst[0]=(char)(tmp); dst[1]=(char)(tmp>>8); #endif dst += dst_skip; src++; } } void sample_move_dither_rect_d16_sS (char *dst, audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t* ) { audio_sample_t val; int tmp; while (nsamples--) { val = *src * (float)SAMPLE_MAX_16BIT; val -= (float)fast_rand() / (float)INT_MAX; tmp = f_round(val); if (tmp > SHRT_MAX) { *((short *)dst) = SHRT_MAX; } else if (tmp < SHRT_MIN) { *((short *)dst) = SHRT_MIN; } else { *((short *) dst) = (short)tmp; } dst += dst_skip; src++; } } void sample_move_dither_tri_d16_sSs (char *dst, audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state) { audio_sample_t x; float r; float rm1 = state->rm1; int y; while (nsamples--) { x = *src * (float)SAMPLE_MAX_16BIT; r = 2.0f * (float)fast_rand() / (float)INT_MAX - 1.0f; x += r - rm1; rm1 = r; y = f_round(x); if (y > SHRT_MAX) { y = SHRT_MAX; } else if (y < SHRT_MIN) { y = SHRT_MIN; } #if __BYTE_ORDER == __LITTLE_ENDIAN dst[0]=(char)(y>>8); dst[1]=(char)(y); #elif __BYTE_ORDER == __BIG_ENDIAN dst[0]=(char)(y); dst[1]=(char)(y>>8); #endif dst += dst_skip; src++; } state->rm1 = rm1; } void sample_move_dither_tri_d16_sS (char *dst, audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state) { audio_sample_t x; float r; float rm1 = state->rm1; int y; while (nsamples--) { x = *src * (float)SAMPLE_MAX_16BIT; r = 2.0f * (float)fast_rand() / (float)INT_MAX - 1.0f; x += r - rm1; rm1 = r; y = f_round(x); if (y > SHRT_MAX) { *((short *)dst) = SHRT_MAX; } else if (y < SHRT_MIN) { *((short *)dst) = SHRT_MIN; } else { *((short *) dst) = (short)y; } dst += dst_skip; src++; } state->rm1 = rm1; } void sample_move_dither_shaped_d16_sSs (char *dst, audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state) { audio_sample_t x; audio_sample_t xe; /* the innput sample - filtered error */ audio_sample_t xp; /* x' */ float r; float rm1 = state->rm1; unsigned int idx = state->idx; int y; while (nsamples--) { x = *src * (float)SAMPLE_MAX_16BIT; r = 2.0f * (float)fast_rand() / (float)INT_MAX - 1.0f; /* Filter the error with Lipshitz's minimally audible FIR: [2.033 -2.165 1.959 -1.590 0.6149] */ xe = x - state->e[idx] * 2.033f + state->e[(idx - 1) & DITHER_BUF_MASK] * 2.165f - state->e[(idx - 2) & DITHER_BUF_MASK] * 1.959f + state->e[(idx - 3) & DITHER_BUF_MASK] * 1.590f - state->e[(idx - 4) & DITHER_BUF_MASK] * 0.6149f; xp = xe + r - rm1; rm1 = r; /* This could be some inline asm on x86 */ y = f_round(xp); /* Intrinsic z^-1 delay */ idx = (idx + 1) & DITHER_BUF_MASK; state->e[idx] = y - xe; if (y > SHRT_MAX) { y = SHRT_MAX; } else if (y < SHRT_MIN) { y = SHRT_MIN; } #if __BYTE_ORDER == __LITTLE_ENDIAN dst[0]=(char)(y>>8); dst[1]=(char)(y); #elif __BYTE_ORDER == __BIG_ENDIAN dst[0]=(char)(y); dst[1]=(char)(y>>8); #endif dst += dst_skip; src++; } state->rm1 = rm1; state->idx = idx; } void sample_move_dS_s16s (audio_sample_t *dst, char *src, unsigned long nsamples, unsigned long src_skip) { short z; /* ALERT: signed sign-extension portability !!! */ while (nsamples--) { #if __BYTE_ORDER == __LITTLE_ENDIAN z = (unsigned char)(src[0]); z <<= 8; z |= (unsigned char)(src[1]); #elif __BYTE_ORDER == __BIG_ENDIAN z = (unsigned char)(src[1]); z <<= 8; z |= (unsigned char)(src[0]); #endif *dst = z / SAMPLE_MAX_16BIT; dst++; src += src_skip; } } void sample_move_d16_sSs (char *dst, audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state) { int tmp; /* ALERT: signed sign-extension portability !!! */ while (nsamples--) { tmp = f_round(*src * SAMPLE_MAX_16BIT); if (tmp > SHRT_MAX) { tmp = SHRT_MAX; } else if (tmp < SHRT_MIN) { tmp = SHRT_MIN; } #if __BYTE_ORDER == __LITTLE_ENDIAN dst[0]=(char)(tmp>>8); dst[1]=(char)(tmp); #elif __BYTE_ORDER == __BIG_ENDIAN dst[0]=(char)(tmp); dst[1]=(char)(tmp>>8); #endif dst += dst_skip; src++; } } void sample_move_dither_shaped_d16_sS (char *dst, audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state) { audio_sample_t x; audio_sample_t xe; /* the innput sample - filtered error */ audio_sample_t xp; /* x' */ float r; float rm1 = state->rm1; unsigned int idx = state->idx; int y; while (nsamples--) { x = *src * (float)SAMPLE_MAX_16BIT; r = 2.0f * (float)fast_rand() / (float)INT_MAX - 1.0f; /* Filter the error with Lipshitz's minimally audible FIR: [2.033 -2.165 1.959 -1.590 0.6149] */ xe = x - state->e[idx] * 2.033f + state->e[(idx - 1) & DITHER_BUF_MASK] * 2.165f - state->e[(idx - 2) & DITHER_BUF_MASK] * 1.959f + state->e[(idx - 3) & DITHER_BUF_MASK] * 1.590f - state->e[(idx - 4) & DITHER_BUF_MASK] * 0.6149f; xp = xe + r - rm1; rm1 = r; /* This could be some inline asm on x86 */ y = f_round(xp); /* Intrinsic z^-1 delay */ idx = (idx + 1) & DITHER_BUF_MASK; state->e[idx] = y - xe; if (y > SHRT_MAX) { *((short *)dst) = SHRT_MAX; } else if (y < SHRT_MIN) { *((short *)dst) = SHRT_MIN; } else { *((short *) dst) = (short)y; } dst += dst_skip; src++; } state->rm1 = rm1; state->idx = idx; } void sample_move_dS_s16 (audio_sample_t *dst, char *src, unsigned long nsamples, unsigned long src_skip) { /* ALERT: signed sign-extension portability !!! */ while (nsamples--) { *dst = (*((short *) src)) / SAMPLE_MAX_16BIT; dst++; src += src_skip; } } void sample_merge_d16_sS (char *dst, audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *) { short val; /* ALERT: signed sign-extension portability !!! */ while (nsamples--) { val = (short) (*src * SAMPLE_MAX_16BIT); if (val > SHRT_MAX - *((short *) dst)) { *((short *)dst) = SHRT_MAX; } else if (val < SHRT_MIN - *((short *) dst)) { *((short *)dst) = SHRT_MIN; } else { *((short *) dst) += val; } dst += dst_skip; src++; } } void sample_merge_d32u24_sS (char *dst, audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *) { /* ALERT: signed sign-extension portability !!! */ while (nsamples--) { *((int *) dst) += (((int) (*src * SAMPLE_MAX_24BIT)) << 8); dst += dst_skip; src++; } } void memset_interleave (char *dst, char val, unsigned long bytes, unsigned long unit_bytes, unsigned long skip_bytes) { switch (unit_bytes) { case 1: while (bytes--) { *dst = val; dst += skip_bytes; } break; case 2: while (bytes) { *((short *) dst) = (short) val; dst += skip_bytes; bytes -= 2; } break; case 4: while (bytes) { *((int *) dst) = (int) val; dst += skip_bytes; bytes -= 4; } break; default: while (bytes) { memset(dst, val, unit_bytes); dst += skip_bytes; bytes -= unit_bytes; } break; } } /* COPY FUNCTIONS: used to move data from an input channel to an output channel. Note that we assume that the skip distance is the same for both channels. This is completely fine unless the input and output were on different audio interfaces that were interleaved differently. We don't try to handle that. */ void memcpy_fake (char *dst, char *src, unsigned long src_bytes, unsigned long , unsigned long ) { memcpy (dst, src, src_bytes); } void merge_memcpy_d16_s16 (char *dst, char *src, unsigned long src_bytes, unsigned long , unsigned long ) { while (src_bytes) { *((short *) dst) += *((short *) src); dst += 2; src += 2; src_bytes -= 2; } } void merge_memcpy_d32_s32 (char *dst, char *src, unsigned long src_bytes, unsigned long , unsigned long ) { while (src_bytes) { *((int *) dst) += *((int *) src); dst += 4; src += 4; src_bytes -= 4; } } void merge_memcpy_interleave_d16_s16 (char *dst, char *src, unsigned long src_bytes, unsigned long dst_skip_bytes, unsigned long src_skip_bytes) { while (src_bytes) { *((short *) dst) += *((short *) src); dst += dst_skip_bytes; src += src_skip_bytes; src_bytes -= 2; } } void merge_memcpy_interleave_d32_s32 (char *dst, char *src, unsigned long src_bytes, unsigned long dst_skip_bytes, unsigned long src_skip_bytes) { while (src_bytes) { *((int *) dst) += *((int *) src); dst += dst_skip_bytes; src += src_skip_bytes; src_bytes -= 4; } } void merge_memcpy_interleave_d24_s24 (char *dst, char *src, unsigned long src_bytes, unsigned long dst_skip_bytes, unsigned long src_skip_bytes) { while (src_bytes) { int acc = (*(int *)dst & 0xFFFFFF) + (*(int *)src & 0xFFFFFF); memcpy(dst, &acc, 3); dst += dst_skip_bytes; src += src_skip_bytes; src_bytes -= 3; } } void memcpy_interleave_d16_s16 (char *dst, char *src, unsigned long src_bytes, unsigned long dst_skip_bytes, unsigned long src_skip_bytes) { while (src_bytes) { *((short *) dst) = *((short *) src); dst += dst_skip_bytes; src += src_skip_bytes; src_bytes -= 2; } } void memcpy_interleave_d24_s24 (char *dst, char *src, unsigned long src_bytes, unsigned long dst_skip_bytes, unsigned long src_skip_bytes) { while (src_bytes) { memcpy(dst, src, 3); dst += dst_skip_bytes; src += src_skip_bytes; src_bytes -= 3; } } void memcpy_interleave_d32_s32 (char *dst, char *src, unsigned long src_bytes, unsigned long dst_skip_bytes, unsigned long src_skip_bytes) { while (src_bytes) { *((int *) dst) = *((int *) src); dst += dst_skip_bytes; src += src_skip_bytes; src_bytes -= 4; } } traverso-0.49.4/src/engine/AlsaDriver.cpp000644 001750 001750 00000120350 11163362147 020560 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2006 Remon Sijrier (December 2005) Ported to C++ for Traverso by Remon Sijrier Copyright (C) 2001 Paul Davis This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ /* ALSA driver based on jack-audio-connection-kit-0.109.0 alsa_driver.c */ #include "AlsaDriver.h" #include "AudioChannel.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "AudioDevice.h" // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" #undef DEBUG_WAKEUP /* Delay (in process calls) before Traverso will report an xrun */ #define XRUN_REPORT_DELAY 0 AlsaDriver::AlsaDriver(AudioDevice* dev, int rate, nframes_t bufferSize) : Driver(dev, rate, bufferSize) { read = MakeDelegate(this, &AlsaDriver::_read); write = MakeDelegate(this, &AlsaDriver::_write); run_cycle = RunCycleCallback(this, &AlsaDriver::_run_cycle); } AlsaDriver::~AlsaDriver() { PENTERDES; if (capture_handle) { snd_pcm_close (capture_handle); } if (playback_handle) { snd_pcm_close (playback_handle); } if (capture_hw_params) { snd_pcm_hw_params_free (capture_hw_params); } if (playback_hw_params) { snd_pcm_hw_params_free (playback_hw_params); } if (capture_sw_params) { snd_pcm_sw_params_free (capture_sw_params); } if (playback_sw_params) { snd_pcm_sw_params_free (playback_sw_params); } if (pfd) { free (pfd); } release_channel_dependent_memory (); } int AlsaDriver::setup(bool capture, bool playback, const QString& pcmName, const QString& ditherShape) { unsigned long user_nperiods = device->get_driver_property("numberofperiods", 3).toInt(); char *playback_pcm_name = strdup(pcmName.toAscii().data()); char *capture_pcm_name = strdup(pcmName.toAscii().data()); int shorts_first = false; /* duplex is the default */ if (!capture && !playback) { capture = true; playback = true; } int err; playback_handle = (snd_pcm_t*) 0; capture_handle = (snd_pcm_t*) 0; ctl_handle = 0; capture_and_playback_not_synced = false; capture_interleaved = false; playback_interleaved = false; max_nchannels = 0; user_nchannels = 0; playback_nchannels = 0; capture_nchannels = 0; playback_sample_bytes = (shorts_first ? 2:4); capture_sample_bytes = (shorts_first ? 2:4); capture_frame_latency = 0; playback_frame_latency = 0; channels_done = 0; channels_not_done = 0; dither_state = 0; playback_addr = 0; capture_addr = 0; playback_interleave_skip = NULL; capture_interleave_skip = NULL; playback_hw_params = 0; capture_hw_params = 0; playback_sw_params = 0; capture_sw_params = 0; silent = 0; pfd = 0; playback_nfds = 0; capture_nfds = 0; if (ditherShape == "Rectangular") { dither = Rectangular; } else if (ditherShape == "Shaped") { dither = Shaped; } else if (ditherShape == "Triangular") { dither = Triangular; } else { dither = None; } soft_mode = false; quirk_bswap = 0; process_count = 0; alsa_name_playback = strdup (playback_pcm_name); alsa_name_capture = strdup (capture_pcm_name); printf ("creating alsa driver ... %s|%s|%d|%lu|%d|%d|%d|%s|%s\n", playback ? playback_pcm_name : "-", capture ? capture_pcm_name : "-", frames_per_cycle, user_nperiods, frame_rate, (int)capture_nchannels, (int)playback_nchannels, soft_mode ? "soft-mode":"-", shorts_first ? "16bit":"32bit"); if (playback) { if (snd_pcm_open (&playback_handle, alsa_name_playback, SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK) < 0) { switch (errno) { case EBUSY: device->message(tr("ALSA Driver: The playback device %1 is already in use. Please stop the" " application using it and run Traverso again").arg(playback_pcm_name), AudioDevice::INFO); return -1; break; case EPERM: device->message(tr("ALSA Driver: You do not have permission to open the audio device %1 for playback").arg(playback_pcm_name), AudioDevice::INFO); return -1; break; default: device->message(tr("snd_pcm_open(playback_handle, ..) failed with unknown error type"), AudioDevice::WARNING); } playback_handle = 0; } if (playback_handle) { snd_pcm_nonblock (playback_handle, 0); } } if (capture) { if (snd_pcm_open (&capture_handle, alsa_name_capture, SND_PCM_STREAM_CAPTURE, SND_PCM_NONBLOCK) < 0) { switch (errno) { case EBUSY: device->message(tr("ALSA Driver: The capture device %1 is already in use. Please stop the" " application using it and run Traverso again").arg(capture_pcm_name), AudioDevice::INFO); return -1; break; case EPERM: device->message(tr("ALSA Driver: You do not have permission to open the audio device %1 for capture").arg(capture_pcm_name), AudioDevice::WARNING); return -1; break; default: device->message(tr("ALSA Driver: snd_pcm_open(capture_handle, ...) failed with unknown error type"), AudioDevice::WARNING); } capture_handle = 0; } if (capture_handle) { snd_pcm_nonblock (capture_handle, 0); } } if (playback_handle == 0) { if (playback) { /* they asked for playback, but we can't do it */ device->message(tr("ALSA Driver: Cannot open PCM device %1 for playback. Falling back to capture-only mode").arg("alsa_pcm"), AudioDevice::WARNING); if (capture_handle == 0) { /* can't do anything */ return -1; } playback = false; } } if (capture_handle == 0) { if (capture) { /* they asked for capture, but we can't do it */ device->message(tr("ALSA: Cannot open PCM device %1 for capture. Falling back to playback-only mode").arg("alsa_pcm"), AudioDevice::WARNING); if (playback_handle == 0) { /* can't do anything */ return -1; } capture = false; } } if (playback_handle) { if ((err = snd_pcm_hw_params_malloc (&playback_hw_params)) < 0) { PWARN ("ALSA: could not allocate playback hw params structure"); return -1; } if ((err = snd_pcm_sw_params_malloc (&playback_sw_params)) < 0) { PWARN ("ALSA: could not allocate playback sw params structure"); return -1; } } if (capture_handle) { if ((err = snd_pcm_hw_params_malloc (&capture_hw_params)) < 0) { PWARN ("ALSA: could not allocate capture hw params structure"); return -1; } if ((err = snd_pcm_sw_params_malloc (&capture_sw_params)) < 0) { PWARN ("ALSA: could not allocate capture sw params structure"); return -1; } } if (set_parameters (frames_per_cycle, user_nperiods, frame_rate)) { return -1; } capture_and_playback_not_synced = false; if (capture_handle && playback_handle) { if (snd_pcm_link (playback_handle, capture_handle) != 0) { capture_and_playback_not_synced = true; } } return 1; } void AlsaDriver::release_channel_dependent_memory () { bitset_destroy (&channels_done); bitset_destroy (&channels_not_done); if (playback_addr) { free(playback_addr); playback_addr = 0; } if (capture_addr) { free(capture_addr); capture_addr = 0; } if (playback_interleave_skip) { free (playback_interleave_skip); playback_interleave_skip = NULL; } if (capture_interleave_skip) { free (capture_interleave_skip); capture_interleave_skip = NULL; } if (silent) { free(silent); silent = 0; } if (dither_state) { free(dither_state); dither_state = 0; } } void AlsaDriver::setup_io_function_pointers() { switch (playback_sample_bytes) { case 2: if (playback_interleaved) { channel_copy = memcpy_interleave_d16_s16; } else { channel_copy = memcpy_fake; } switch (dither) { case Rectangular: fprintf (stderr,"Rectangular dithering at 16 bits\n"); write_via_copy = quirk_bswap? sample_move_dither_rect_d16_sSs: sample_move_dither_rect_d16_sS; break; case Triangular: printf("Triangular dithering at 16 bits\n"); write_via_copy = quirk_bswap? sample_move_dither_tri_d16_sSs: sample_move_dither_tri_d16_sS; break; case Shaped: printf("Noise-shaped dithering at 16 bits\n"); write_via_copy = quirk_bswap? sample_move_dither_shaped_d16_sSs: sample_move_dither_shaped_d16_sS; break; default: write_via_copy = quirk_bswap? sample_move_d16_sSs : sample_move_d16_sS; break; } break; case 3: if (playback_interleaved) { channel_copy = memcpy_interleave_d24_s24; } else { channel_copy = memcpy_fake; } switch (dither) { case Rectangular: printf("Rectangular dithering at 24 bits\n"); write_via_copy = quirk_bswap? sample_move_dither_rect_d24_sSs: sample_move_dither_rect_d24_sS; break; case Triangular: printf("Triangular dithering at 24 bits\n"); write_via_copy = quirk_bswap? sample_move_dither_tri_d24_sSs: sample_move_dither_tri_d24_sS; break; case Shaped: printf("Noise-shaped dithering at 24 bits\n"); write_via_copy = quirk_bswap? sample_move_dither_shaped_d24_sSs: sample_move_dither_shaped_d24_sS; break; default: write_via_copy = quirk_bswap? sample_move_d24_sSs : sample_move_d24_sS; break; } break; case 4: if (playback_interleaved) { channel_copy = memcpy_interleave_d32_s32; } else { channel_copy = memcpy_fake; } switch (dither) { case Rectangular: printf("Rectangular dithering at 32 bits\n"); write_via_copy = quirk_bswap? sample_move_dither_rect_d32u24_sSs: sample_move_dither_rect_d32u24_sS; break; case Triangular: printf("Triangular dithering at 16 bits\n"); write_via_copy = quirk_bswap? sample_move_dither_tri_d32u24_sSs: sample_move_dither_tri_d32u24_sS; break; case Shaped: printf("Noise-shaped dithering at 32 bits\n"); write_via_copy = quirk_bswap? sample_move_dither_shaped_d32u24_sSs: sample_move_dither_shaped_d32u24_sS; break; default: write_via_copy = quirk_bswap? sample_move_d32u24_sSs : sample_move_d32u24_sS; break; } break; } switch (capture_sample_bytes) { case 2: read_via_copy = quirk_bswap? sample_move_dS_s16s : sample_move_dS_s16; break; case 3: read_via_copy = quirk_bswap? sample_move_dS_s24s : sample_move_dS_s24; break; case 4: read_via_copy = quirk_bswap? sample_move_dS_s32u24s : sample_move_dS_s32u24; break; } } int AlsaDriver::configure_stream(char *device_name, const char *stream_name, snd_pcm_t *handle, snd_pcm_hw_params_t *hw_params, snd_pcm_sw_params_t *sw_params, unsigned int *nperiodsp, unsigned long *nchns, unsigned long sample_width) { int err, format; snd_pcm_uframes_t stop_th; static struct { char Name[32]; snd_pcm_format_t format; int swapped; int bitdepth; } formats[] = { {"32bit little-endian", SND_PCM_FORMAT_S32_LE, IS_LE, 32}, {"32bit big-endian", SND_PCM_FORMAT_S32_BE, IS_BE, 32}, {"24bit little-endian", SND_PCM_FORMAT_S24_3LE, IS_LE, 24}, {"24bit big-endian", SND_PCM_FORMAT_S24_3BE, IS_BE, 24}, {"16bit little-endian", SND_PCM_FORMAT_S16_LE, IS_LE, 16}, {"16bit big-endian", SND_PCM_FORMAT_S16_BE, IS_BE, 16}, }; #define NUMFORMATS (sizeof(formats)/sizeof(formats[0])) #define FIRST_16BIT_FORMAT 4 if ((err = snd_pcm_hw_params_any (handle, hw_params)) < 0) { printf("ALSA: no playback configurations available (%s)\n", snd_strerror (err)); return -1; } if ((err = snd_pcm_hw_params_set_periods_integer (handle, hw_params)) < 0) { printf("ALSA: cannot restrict period size to integral value.\n"); return -1; } if ((err = snd_pcm_hw_params_set_access (handle, hw_params, SND_PCM_ACCESS_MMAP_NONINTERLEAVED)) < 0) { if ((err = snd_pcm_hw_params_set_access (handle, hw_params, SND_PCM_ACCESS_MMAP_INTERLEAVED)) < 0) { if ((err = snd_pcm_hw_params_set_access (handle, hw_params, SND_PCM_ACCESS_MMAP_COMPLEX)) < 0) { printf("ALSA: mmap-based access is not possible for the %s " "stream of this audio interface\n", stream_name); return -1; } } } format = (sample_width == 4) ? 0 : (NUMFORMATS - 1); while (1) { if ((err = snd_pcm_hw_params_set_format ( handle, hw_params, formats[format].format)) < 0) { if (( (sample_width == 4) ? (format++ >= int(NUMFORMATS) - 1) : (format-- <= 0))) { printf("ALSA Driver: Sorry. The audio interface \"%s\" doesn't support any of the" " hardware sample formats that Traverso's alsa-driver can use.\n", device_name); return -1; } } else { if (formats[format].swapped) { quirk_bswap = 1; } else { quirk_bswap = 0; } printf("ALSA: final selected sample format for %s: %s\n", stream_name, formats[format].Name); device->set_bit_depth(formats[format].bitdepth); break; } } if ( (err = snd_pcm_hw_params_set_rate_near (handle, hw_params, &frame_rate, NULL)) < 0) { printf("ALSA: cannot set sample/frame rate to % for %s\n", (double)frame_rate, stream_name); return -1; } if (!*nchns) { /*if not user-specified, try to find the maximum number of channels */ unsigned int channels_max ; err = snd_pcm_hw_params_get_channels_max (hw_params, &channels_max); *nchns = channels_max; if (*nchns > 1024) { /* the hapless user is an unwitting victim of the "default" ALSA PCM device, which can support up to 16 million channels. since they can't be bothered to set up a proper default device, limit the number of channels for them to a sane default. */ PERROR ( "ALSA Driver: You appear to be using the ALSA software \"plug\" layer, probably\n" "a result of using the \"default\" ALSA device. This is less\n" "efficient than it could be. Consider using a hardware device\n" "instead rather than using the plug layer. Usually the name of the\n" "hardware device that corresponds to the first sound card is hw:0\n" ); *nchns = 2; } } if ((err = snd_pcm_hw_params_set_channels (handle, hw_params, *nchns)) < 0) { printf("ALSA: cannot set channel count to %lu for %s\n", *nchns, stream_name); return -1; } int frperscycle = frames_per_cycle; if ((err = snd_pcm_hw_params_set_period_size (handle, hw_params, frames_per_cycle, 0)) < 0) { printf("ALSA: cannot set period size to %d frames for %s\n", frperscycle, stream_name); return -1; } *nperiodsp = user_nperiods; snd_pcm_hw_params_set_periods_min (handle, hw_params, nperiodsp, NULL); if (*nperiodsp < user_nperiods) *nperiodsp = user_nperiods; if (snd_pcm_hw_params_set_periods_near (handle, hw_params, nperiodsp, NULL) < 0) { printf("ALSA: cannot set number of periods to %u for %s\n", *nperiodsp, stream_name); return -1; } if (*nperiodsp < user_nperiods) { printf("ALSA: use %d periods for %s\n", *nperiodsp, stream_name); return -1; } if (!is_power_of_two(frames_per_cycle)) { printf("Traverso: frames must be a power of two (64, 512, 1024, ...)\n"); return -1; } if ((err = snd_pcm_hw_params_set_buffer_size (handle, hw_params, *nperiodsp * frames_per_cycle)) < 0) { printf("ALSA: cannot set buffer length to %d for %s\n", *nperiodsp * frames_per_cycle, stream_name); return -1; } if ((err = snd_pcm_hw_params (handle, hw_params)) < 0) { printf("ALSA: cannot set hardware parameters for %s\n", stream_name); device->message(tr("ALSA Driver: Unable to configure hardware, is it in use by another application?"), AudioDevice::WARNING); return -1; } snd_pcm_sw_params_current (handle, sw_params); if ((err = snd_pcm_sw_params_set_start_threshold (handle, sw_params, 0U)) < 0) { printf("ALSA: cannot set start mode for %s\n", stream_name); return -1; } stop_th = *nperiodsp * frames_per_cycle; if (soft_mode) { stop_th = (snd_pcm_uframes_t)-1; } if ((err = snd_pcm_sw_params_set_stop_threshold (handle, sw_params, stop_th)) < 0) { printf("ALSA: cannot set stop mode for %s\n", stream_name); return -1; } if ((err = snd_pcm_sw_params_set_silence_threshold (handle, sw_params, 0)) < 0) { printf("ALSA: cannot set silence threshold for %s\n", stream_name); return -1; } #if 0 fprintf (stderr, "set silence size to %lu * %lu = %lu\n", frames_per_cycle, *nperiodsp, frames_per_cycle * *nperiodsp); if ((err = snd_pcm_sw_params_set_silence_size ( handle, sw_params, frames_per_cycle * *nperiodsp)) < 0) { PERROR ("ALSA: cannot set silence size for %s", stream_name); return -1; } #endif if (handle == playback_handle) err = snd_pcm_sw_params_set_avail_min (handle, sw_params, frames_per_cycle * (*nperiodsp - user_nperiods + 1)); else err = snd_pcm_sw_params_set_avail_min (handle, sw_params, frames_per_cycle); if (err < 0) { printf("ALSA: cannot set avail min for %s\n", stream_name); return -1; } if ((err = snd_pcm_sw_params (handle, sw_params)) < 0) { printf("ALSA: cannot set software parameters for %s\n", stream_name); return -1; } return 0; } int AlsaDriver::set_parameters (nframes_t frames_per_interupt, nframes_t nperiods, nframes_t rate) { int dir; snd_pcm_uframes_t p_period_size = 0; snd_pcm_uframes_t c_period_size = 0; channel_t chn; unsigned int pr = 0; unsigned int cr = 0; int err; frame_rate = rate; frames_per_cycle = frames_per_interupt; user_nperiods = nperiods; fprintf (stderr, "configuring for %d Hz, period=%ld frames (%.1f ms), buffer=%ld periods\n", rate, (long)frames_per_cycle,(((float)frames_per_cycle / (float) rate) * 1000.0f), user_nperiods); if (capture_handle) { if (configure_stream ( alsa_name_capture, "capture", capture_handle, capture_hw_params, capture_sw_params, &capture_nperiods, &capture_nchannels, capture_sample_bytes)) { PERROR ("ALSA: cannot configure capture channel"); return -1; } } if (playback_handle) { if (configure_stream ( alsa_name_playback, "playback", playback_handle, playback_hw_params, playback_sw_params, &playback_nperiods, &playback_nchannels, playback_sample_bytes)) { PERROR ("ALSA: cannot configure playback channel"); return -1; } } /* check the rate, since thats rather important */ if (playback_handle) { snd_pcm_hw_params_get_rate (playback_hw_params, &pr, &dir); } if (capture_handle) { snd_pcm_hw_params_get_rate (capture_hw_params, &cr, &dir); } if (capture_handle && playback_handle) { if (cr != pr) { PERROR ("ALSA Driver: playback and capture sample rates do not match (%d vs. %d)", pr, cr); } /* only change if *both* capture and playback rates * don't match requested certain hardware actually * still works properly in full-duplex with slightly * different rate values between adc and dac */ if (cr != frame_rate && pr != frame_rate) { PERROR ("ALSA Driver: sample rate in use (%d Hz) does not match requested rate (%d Hz)", cr, frame_rate); frame_rate = cr; } } else if (capture_handle && cr != frame_rate) { PERROR ("ALSA Driver: capture sample rate in use (%d Hz) does not match requested rate (%d Hz)", cr, frame_rate); frame_rate = cr; } else if (playback_handle && pr != frame_rate) { PERROR ("ALSA Driver: playback sample rate in use (%d Hz) does not match requested rate (%d Hz)", pr, frame_rate); frame_rate = pr; } /* check the fragment size, since thats non-negotiable */ if (playback_handle) { snd_pcm_access_t access; err = snd_pcm_hw_params_get_period_size (playback_hw_params, &p_period_size, &dir); err = snd_pcm_hw_params_get_format (playback_hw_params, &playback_sample_format); err = snd_pcm_hw_params_get_access (playback_hw_params, &access); playback_interleaved = (access == SND_PCM_ACCESS_MMAP_INTERLEAVED) || (access == SND_PCM_ACCESS_MMAP_COMPLEX); if (p_period_size != frames_per_cycle) { PERROR ("alsa_pcm: requested an interrupt every %ld frames but got %ld frames for playback", (long)frames_per_cycle, p_period_size); return -1; } } if (capture_handle) { snd_pcm_access_t access; err = snd_pcm_hw_params_get_period_size (capture_hw_params, &c_period_size, &dir); err = snd_pcm_hw_params_get_format (capture_hw_params, &(capture_sample_format)); err = snd_pcm_hw_params_get_access (capture_hw_params, &access); capture_interleaved = (access == SND_PCM_ACCESS_MMAP_INTERLEAVED) || (access == SND_PCM_ACCESS_MMAP_COMPLEX); if (c_period_size != frames_per_cycle) { PERROR ("alsa_pcm: requested an interrupt every %ld frames but got %ld frames for capture", (long)frames_per_cycle, p_period_size); return -1; } } playback_sample_bytes = snd_pcm_format_physical_width(playback_sample_format) / 8; capture_sample_bytes = snd_pcm_format_physical_width(capture_sample_format) / 8; if (playback_handle) { switch (playback_sample_format) { case SND_PCM_FORMAT_S32_LE: case SND_PCM_FORMAT_S24_3LE: case SND_PCM_FORMAT_S24_3BE: case SND_PCM_FORMAT_S16_LE: case SND_PCM_FORMAT_S32_BE: case SND_PCM_FORMAT_S16_BE: break; default: PERROR ("ALSA Driver: programming error: unhandled format type for playback"); return -1; } } if (capture_handle) { switch (capture_sample_format) { case SND_PCM_FORMAT_S32_LE: case SND_PCM_FORMAT_S24_3LE: case SND_PCM_FORMAT_S24_3BE: case SND_PCM_FORMAT_S16_LE: case SND_PCM_FORMAT_S32_BE: case SND_PCM_FORMAT_S16_BE: break; default: PERROR ("ALSA Driver: programming error: unhandled format type for capture"); return -1; } } if (playback_interleaved) { const snd_pcm_channel_area_t *my_areas; snd_pcm_uframes_t offset, frames; if (snd_pcm_mmap_begin(playback_handle, &my_areas, &offset, &frames) < 0) { PERROR ("ALSA: %s: mmap areas info error", alsa_name_playback); return -1; } interleave_unit = snd_pcm_format_physical_width(playback_sample_format) / 8; } else { interleave_unit = 0; /* NOT USED */ } if (capture_interleaved) { const snd_pcm_channel_area_t *my_areas; snd_pcm_uframes_t offset, frames; if (snd_pcm_mmap_begin(capture_handle, &my_areas, &offset, &frames) < 0) { PERROR ("ALSA: %s: mmap areas info error", alsa_name_capture); return -1; } } if (playback_nchannels > capture_nchannels) { max_nchannels = playback_nchannels; user_nchannels = capture_nchannels; } else { max_nchannels = capture_nchannels; user_nchannels = playback_nchannels; } setup_io_function_pointers (); /* Allocate and initialize structures that rely on the channels counts. Set up the bit pattern that is used to record which channels require action on every cycle. any bits that are not set after the engine's process() call indicate channels that potentially need to be silenced. */ bitset_create (&channels_done, max_nchannels); bitset_create (&channels_not_done, max_nchannels); if (playback_handle) { playback_addr = (char**) malloc (sizeof (char *) * playback_nchannels); memset (playback_addr, 0, sizeof (char *) * playback_nchannels); playback_interleave_skip = (unsigned long *) malloc (sizeof (unsigned long *) * playback_nchannels); memset (playback_interleave_skip, 0, sizeof (unsigned long *) * playback_nchannels); silent = (unsigned long *) malloc (sizeof (unsigned long) * playback_nchannels); for (chn = 0; chn < playback_nchannels; chn++) { silent[chn] = 0; } for (chn = 0; chn < playback_nchannels; chn++) { bitset_add (channels_done, chn); } dither_state = (dither_state_t *) calloc ( playback_nchannels, sizeof (dither_state_t)); } if (capture_handle) { capture_addr = (char **) malloc (sizeof (char *) * capture_nchannels); memset (capture_addr, 0, sizeof (char *) * capture_nchannels); capture_interleave_skip = (unsigned long *) malloc (sizeof (unsigned long *) * capture_nchannels); memset (capture_interleave_skip, 0, sizeof (unsigned long *) * capture_nchannels); } period_usecs = (trav_time_t) floor ((((float) frames_per_cycle) / frame_rate) * 1000000.0f); poll_timeout = (int) floor (1.5f * period_usecs); device->set_buffer_size(frames_per_cycle); return 0; } int AlsaDriver::reset_parameters (nframes_t frames_per_cycle, nframes_t user_nperiods, nframes_t rate) { /* XXX unregister old ports ? */ release_channel_dependent_memory (); return set_parameters (frames_per_cycle, user_nperiods, rate); } int AlsaDriver::get_channel_addresses (snd_pcm_uframes_t *capture_avail, snd_pcm_uframes_t *playback_avail, snd_pcm_uframes_t *capture_offset, snd_pcm_uframes_t *playback_offset) { int err; channel_t chn; if (capture_avail) { if ((err = snd_pcm_mmap_begin (capture_handle, &capture_areas, capture_offset, capture_avail)) < 0) { PERROR ("ALSA: %s: mmap areas info error", alsa_name_capture); return -1; } for (chn = 0; chn < capture_nchannels; chn++) { const snd_pcm_channel_area_t *a = &capture_areas[chn]; capture_addr[chn] = (char *) a->addr + ((a->first + a->step * *capture_offset) / 8); capture_interleave_skip[chn] = (unsigned long ) (a->step / 8); } } if (playback_avail) { if ((err = snd_pcm_mmap_begin (playback_handle, &playback_areas, playback_offset, playback_avail)) < 0) { PERROR ("ALSA: %s: mmap areas info error ", alsa_name_playback); return -1; } for (chn = 0; chn < playback_nchannels; chn++) { const snd_pcm_channel_area_t *a = &playback_areas[chn]; playback_addr[chn] = (char *) a->addr + ((a->first + a->step * *playback_offset) / 8); playback_interleave_skip[chn] = (unsigned long ) (a->step / 8); } } return 0; } int AlsaDriver::start() { int err; snd_pcm_uframes_t poffset, pavail; channel_t chn; poll_last = 0; poll_next = 0; if (playback_handle) { if ((err = snd_pcm_prepare (playback_handle)) < 0) { PERROR ("ALSA: prepare error for playback on \"%s\" (%s)", alsa_name_playback, snd_strerror(err)); return -1; } } if ((capture_handle && capture_and_playback_not_synced) || !playback_handle) { if ((err = snd_pcm_prepare (capture_handle)) < 0) { PERROR ("ALSA: prepare error for capture on \"%s\" (%s)", alsa_name_capture, snd_strerror(err)); return -1; } } if (playback_handle) { playback_nfds = snd_pcm_poll_descriptors_count (playback_handle); } else { playback_nfds = 0; } if (capture_handle) { capture_nfds = snd_pcm_poll_descriptors_count (capture_handle); } else { capture_nfds = 0; } if (pfd) { free (pfd); } pfd = (struct pollfd *) malloc (sizeof (struct pollfd) * (playback_nfds + capture_nfds + 2)); if (playback_handle) { /* fill playback buffer with zeroes, and mark all fragments as having data. */ pavail = snd_pcm_avail_update (playback_handle); if (pavail != frames_per_cycle * playback_nperiods) { PERROR ("ALSA: full buffer not available at start"); return -1; } if (get_channel_addresses (0, &pavail, 0, &poffset)) { return -1; } /* XXX this is cheating. ALSA offers no guarantee that we can access the entire buffer at any one time. It works on most hardware tested so far, however, buts its a liability in the long run. I think that alsa-lib may have a better function for doing this here, where the goal is to silence the entire buffer. */ for (chn = 0; chn < playback_nchannels; chn++) { silence_on_channel (chn, user_nperiods * frames_per_cycle); } snd_pcm_mmap_commit (playback_handle, poffset, user_nperiods * frames_per_cycle); if ((err = snd_pcm_start (playback_handle)) < 0) { PERROR ("ALSA: could not start playback (%s)", snd_strerror (err)); return -1; } } if ((capture_handle && capture_and_playback_not_synced) || !playback_handle) { if ((err = snd_pcm_start (capture_handle)) < 0) { PERROR ("ALSA: could not start capture (%s)", snd_strerror (err)); return -1; } } return 0; } int AlsaDriver::stop() { int err; audio_sample_t* buf; /* silence all capture port buffers, because we might be entering offline mode. */ for (int i=0; iget_buffer(frames_per_cycle); memset (buf, 0, sizeof (audio_sample_t) * frames_per_cycle); } if (playback_handle) { if ((err = snd_pcm_drop (playback_handle)) < 0) { PERROR ("ALSA: channel flush for playback failed (%s)", snd_strerror (err)); return -1; } } if (!playback_handle || capture_and_playback_not_synced) { if (capture_handle) { if ((err = snd_pcm_drop (capture_handle)) < 0) { PERROR ("ALSA: channel flush for capture failed (%s)", snd_strerror (err)); return -1; } } } return 0; } int AlsaDriver::restart() { if (stop()) return -1; return start(); } int AlsaDriver::xrun_recovery (float *delayed_usecs) { PWARN("xrun"); snd_pcm_status_t *status; int res; snd_pcm_status_alloca(&status); if (capture_handle) { if ((res = snd_pcm_status(capture_handle, status)) < 0) { printf ("status error: %s", snd_strerror(res)); } } else { if ((res = snd_pcm_status(playback_handle, status)) < 0) { printf ("status error: %s", snd_strerror(res)); } } if (snd_pcm_status_get_state(status) == SND_PCM_STATE_XRUN && process_count > XRUN_REPORT_DELAY) { struct timeval now, diff, tstamp; gettimeofday(&now, 0); snd_pcm_status_get_trigger_tstamp(status, &tstamp); timersub(&now, &tstamp, &diff); *delayed_usecs = diff.tv_sec * 1000000.0 + diff.tv_usec; printf ("\n**** alsa_pcm: xrun of at least %.3f msecs\n\n", *delayed_usecs / 1000.0); device->xrun(); } if (restart()) { return -1; } return 0; } void AlsaDriver::silence_untouched_channels (nframes_t nframes) { channel_t chn; nframes_t buffer_frames = frames_per_cycle * playback_nperiods; for (chn = 0; chn < playback_nchannels; chn++) { if (bitset_contains (channels_not_done, chn)) { if (silent[chn] < buffer_frames) { silence_on_channel_no_mark (chn, nframes); silent[chn] += nframes; } } } } static int under_gdb = false; int AlsaDriver::wait(int extra_fd, int *status, float *delayed_usecs) { snd_pcm_sframes_t avail = 0; snd_pcm_sframes_t capture_avail = 0; snd_pcm_sframes_t playback_avail = 0; int xrun_detected = false; int need_capture; int need_playback; unsigned int i; trav_time_t poll_enter; trav_time_t poll_ret = 0; *status = -1; *delayed_usecs = 0; need_capture = capture_handle ? 1 : 0; if (extra_fd >= 0) { need_playback = 0; } else { need_playback = playback_handle ? 1 : 0; } again: while (need_playback || need_capture) { int poll_result; unsigned int ci = 0; unsigned int nfds; unsigned short revents; nfds = 0; if (need_playback) { snd_pcm_poll_descriptors (playback_handle, &pfd[0], playback_nfds); nfds += playback_nfds; } if (need_capture) { snd_pcm_poll_descriptors (capture_handle, &pfd[nfds], capture_nfds); ci = nfds; nfds += capture_nfds; } /* ALSA doesn't set POLLERR in some versions of 0.9.X */ for (i = 0; i < nfds; i++) { pfd[i].events |= POLLERR; } if (extra_fd >= 0) { pfd[nfds].fd = extra_fd; pfd[nfds].events = POLLIN|POLLERR|POLLHUP|POLLNVAL; nfds++; } poll_enter = get_microseconds (); if (poll_enter > poll_next) { /* * This processing cycle was delayed past the * next due interrupt! Do not account this as * a wakeup delay: */ poll_next = 0; } device->transport_cycle_end(poll_enter); poll_result = poll (pfd, nfds, poll_timeout); if (poll_result < 0) { if (errno == EINTR) { printf ("poll interrupt\n"); // this happens mostly when run // under gdb, or when exiting due to a signal if (under_gdb) { goto again; } *status = -2; return 0; } PERROR ("ALSA: poll call failed (%s)", strerror (errno)); *status = -3; return 0; } poll_ret = get_microseconds (); if (extra_fd < 0) { if (poll_next && poll_ret > poll_next) { *delayed_usecs = poll_ret - poll_next; } poll_last = poll_ret; poll_next = poll_ret + period_usecs; device->transport_cycle_start (poll_ret); } #ifdef DEBUG_WAKEUP fprintf (stderr, "%" PRIu64 ": checked %d fds, %" PRIu64 " usecs since poll entered\n", poll_ret, nfds, poll_ret - poll_enter); #endif /* check to see if it was the extra FD that caused us * to return from poll */ if (extra_fd >= 0) { if (pfd[nfds-1].revents == 0) { /* we timed out on the extra fd */ *status = -4; return -1; } /* if POLLIN was the only bit set, we're OK */ *status = 0; return (pfd[nfds-1].revents == POLLIN) ? 0 : -1; } if (need_playback) { if (snd_pcm_poll_descriptors_revents(playback_handle, &pfd[0], playback_nfds, &revents) < 0) { qWarning("ALSA: playback revents failed"); *status = -6; return 0; } if (revents & POLLERR) { xrun_detected = TRUE; } if (revents & POLLOUT) { need_playback = 0; #ifdef DEBUG_WAKEUP fprintf (stderr, "%" PRIu64 " playback stream ready\n", poll_ret); #endif } } if (need_capture) { if (snd_pcm_poll_descriptors_revents(capture_handle, &pfd[ci], capture_nfds, &revents) < 0) { qWarning ("ALSA: capture revents failed"); *status = -6; return 0; } if (revents & POLLERR) { xrun_detected = TRUE; } if (revents & POLLIN) { need_capture = 0; #ifdef DEBUG_WAKEUP fprintf (stderr, "%" PRIu64 " capture stream ready\n", poll_ret); #endif } } if (poll_result == 0) { qWarning ("ALSA: poll time out, polled for %ld usecs", (long)(poll_ret - poll_enter)); *status = -5; return 0; } } if (capture_handle) { if ((capture_avail = snd_pcm_avail_update (capture_handle)) < 0) { if (capture_avail == -EPIPE) { xrun_detected = true; } else { PERROR ("ALSA Driver: unknown avail_update return value (%ld)", capture_avail); } } } else { /* odd, but see min() computation below */ capture_avail = INT_MAX; } if (playback_handle) { if ((playback_avail = snd_pcm_avail_update (playback_handle)) < 0) { if (playback_avail == -EPIPE) { xrun_detected = true; } else { PERROR ("ALSA Driver: unknown avail_update return value (%ld)", playback_avail); } } } else { /* odd, but see min() computation below */ playback_avail = INT_MAX; } if (xrun_detected) { *status = xrun_recovery (delayed_usecs); return 0; } *status = 0; last_wait_ust = poll_ret; avail = capture_avail < playback_avail ? capture_avail : playback_avail; #ifdef DEBUG_WAKEUP fprintf (stderr, "wakeup complete, avail = %lu, pavail = %lu " "cavail = %lu\n", avail, playback_avail, capture_avail); #endif /* mark all channels not done for now. read/write will change this */ bitset_copy (channels_not_done, channels_done); /* constrain the available count to the nearest (round down) number of periods. */ return avail - (avail % frames_per_cycle); } int AlsaDriver::_null_cycle(nframes_t nframes) { nframes_t nf; snd_pcm_uframes_t offset; snd_pcm_uframes_t contiguous; uint chn; if (nframes > frames_per_cycle) { return -1; } if (capture_handle) { nf = nframes; offset = 0; while (nf) { contiguous = nf; if (snd_pcm_mmap_begin ( capture_handle, &capture_areas, (snd_pcm_uframes_t *) &offset, (snd_pcm_uframes_t *) &contiguous)) { return -1; } if (snd_pcm_mmap_commit (capture_handle, offset, contiguous) < 0) { return -1; } nf -= contiguous; } } if (playback_handle) { nf = nframes; offset = 0; while (nf) { contiguous = nf; if (snd_pcm_mmap_begin ( playback_handle, &playback_areas, (snd_pcm_uframes_t *) &offset, (snd_pcm_uframes_t *) &contiguous)) { return -1; } for (chn = 0; chn < playback_nchannels; chn++) { silence_on_channel (chn, contiguous); } if (snd_pcm_mmap_commit (playback_handle, offset, contiguous) < 0) { return -1; } nf -= contiguous; } } return 0; } int AlsaDriver::bufsize(nframes_t nframes) { return reset_parameters (nframes, user_nperiods,frame_rate); } int AlsaDriver::_read(nframes_t nframes) { snd_pcm_uframes_t contiguous; snd_pcm_uframes_t nread; snd_pcm_uframes_t offset; nframes_t orig_nframes; audio_sample_t* buf; int err; if (nframes > frames_per_cycle) { return -1; } if (!capture_handle) { return 0; } nread = 0; contiguous = 0; orig_nframes = nframes; while (nframes) { contiguous = nframes; if (get_channel_addresses (&contiguous, (snd_pcm_uframes_t *) 0, &offset, 0) < 0) { return -1; } for (int i=0; ihas_data()) { //no-copy optimization continue; } buf = channel->get_data(); read_from_channel (channel->get_number(), buf + nread, contiguous); } if ((err = snd_pcm_mmap_commit (capture_handle, offset, contiguous)) < 0) { PERROR ("ALSA: could not complete read of %ld frames: error = %d\n", contiguous, err); return -1; } nframes -= contiguous; nread += contiguous; } return 0; } int AlsaDriver::_write(nframes_t nframes) { audio_sample_t* buf; nframes_t orig_nframes; snd_pcm_uframes_t nwritten; snd_pcm_uframes_t contiguous; snd_pcm_uframes_t offset; int err; process_count++; if (! playback_handle) { return 0; } if (nframes > frames_per_cycle) { return -1; } nwritten = 0; contiguous = 0; orig_nframes = nframes; while (nframes) { contiguous = nframes; if (get_channel_addresses ((snd_pcm_uframes_t *) 0, &contiguous, 0, &offset) < 0) { return -1; } for (int i=0; ihas_data()) { continue; } buf = channel->get_data(); write_to_channel (channel->get_number(), buf + nwritten, contiguous); channel->silence_buffer(nframes); } if (!bitset_empty (channels_not_done)) { silence_untouched_channels (contiguous); } if ((err = snd_pcm_mmap_commit (playback_handle, offset, contiguous)) < 0) { PERROR ("ALSA: could not complete playback of %ld frames: error = %d", contiguous, err); if (err != EPIPE && err != ESTRPIPE) return -1; } nframes -= contiguous; nwritten += contiguous; } return 0; } int AlsaDriver::_run_cycle() { int wait_status; float delayed_usecs; nframes_t nframes; // PWARN ("alsa run cycle wait\n"); nframes = wait (-1, &wait_status, &delayed_usecs); if (nframes == 0) { /* we detected an xrun and restarted: notify * clients about the delay. */ device->delay(delayed_usecs); return 0; } if (wait_status == 0) return device->run_cycle (nframes, delayed_usecs); if (wait_status < 0) return -1; /* driver failed */ else return 0; } int AlsaDriver::attach() { char buf[32]; channel_t chn; AudioChannel* chan; int port_flags; device->set_buffer_size (frames_per_cycle); device->set_sample_rate (frame_rate); port_flags = PortIsOutput|PortIsPhysical|PortIsTerminal; for (chn = 0; chn < capture_nchannels; chn++) { snprintf (buf, sizeof(buf) - 1, "capture_%lu", chn+1); chan = device->register_capture_channel(buf, "32 bit float audio", port_flags, frames_per_cycle, chn); chan->set_latency( frames_per_cycle + capture_frame_latency ); captureChannels.append(chan); } port_flags = PortIsInput|PortIsPhysical|PortIsTerminal; for (chn = 0; chn < playback_nchannels; chn++) { snprintf (buf, sizeof(buf) - 1, "playback_%lu", chn+1); chan = device->register_playback_channel(buf, "32 bit float audio", port_flags, frames_per_cycle, chn); chan->set_latency( frames_per_cycle + capture_frame_latency ); playbackChannels.append(chan); } return 1; } int AlsaDriver::detach () { return 0; } QString AlsaDriver::get_device_name( ) { return alsa_device_name(false); } QString AlsaDriver::get_device_longname( ) { return alsa_device_name(true); } QString AlsaDriver::alsa_device_name(bool longname, int devicenumber) { snd_ctl_card_info_t *info; snd_ctl_t *handle; char name[32]; sprintf(name, "hw:%d", devicenumber); int err = 0; snd_ctl_card_info_alloca(&info); if ((err = snd_ctl_open(&handle, name, devicenumber)) < 0) { PMESG("AlsaDriver::alsa_device_name: Control open (device %i): %s", devicenumber, snd_strerror(err)); return ""; } if ((err = snd_ctl_card_info(handle, info)) < 0) { PMESG("Control hardware info (%i): %s", 0, snd_strerror(err)); } snd_ctl_close(handle); if (err < 0) { return "Device name unknown"; } if (longname) { return snd_ctl_card_info_get_name(info); } return snd_ctl_card_info_get_id(info); } //eof traverso-0.49.4/src/engine/bitset.h000644 001750 001750 00000006210 11163362147 017461 0ustar00remonremon000000 000000 /* * bitset.h -- some simple bit vector set operations. * * This is useful for sets of small non-negative integers. There are * some obvious set operations that are not implemented because I * don't need them right now. * * These functions represent sets as arrays of unsigned 32-bit * integers allocated on the heap. The first entry contains the set * cardinality (number of elements allowed), followed by one or more * words containing bit vectors. * * $Id: bitset.h,v 1.1 2006/04/20 14:50:44 r_sijrier Exp $ */ /* * Copyright (C) 2005 Jack O'Quin * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef __bitset_h__ #define __bitset_h__ #include /* POSIX standard fixed-size types */ #include /* `#define NDEBUG' to disable */ /* On some 64-bit machines, this implementation may be slightly * inefficient, depending on how compilers allocate space for * uint32_t. For the set sizes I currently need, this is acceptable. * It should not be hard to pack the bits better, if that becomes * worthwhile. */ typedef uint32_t _bitset_word_t; typedef _bitset_word_t *bitset_t; #define WORD_SIZE(cardinality) (1+((cardinality)+31)/32) #define BYTE_SIZE(cardinality) (WORD_SIZE(cardinality)*sizeof(_bitset_word_t)) #define WORD_INDEX(element) (1+(element)/32) #define BIT_INDEX(element) ((element)&037) static inline void bitset_add(bitset_t set, unsigned int element) { assert(element < set[0]); set[WORD_INDEX(element)] |= (1 << BIT_INDEX(element)); } static inline void bitset_copy(bitset_t to_set, bitset_t from_set) { assert(to_set[0] == from_set[0]); memcpy(to_set, from_set, BYTE_SIZE(to_set[0])); } static inline void bitset_create(bitset_t *set, unsigned int cardinality) { *set = (bitset_t) calloc(WORD_SIZE(cardinality), sizeof(_bitset_word_t)); assert(*set); *set[0] = cardinality; } static inline void bitset_destroy(bitset_t *set) { if (*set) { free(*set); *set = (bitset_t) 0; } } static inline int bitset_empty(bitset_t set) { int i; _bitset_word_t result = 0; int nwords = WORD_SIZE(set[0]); for (i = 1; i < nwords; i++) { result |= set[i]; } return (result == 0); } static inline int bitset_contains(bitset_t set, unsigned int element) { assert(element < set[0]); return (0 != (set[WORD_INDEX(element)] & (1< #include "AudioDevice.h" #include "AudioChannel.h" // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" PulseAudioDriver::PulseAudioDriver( AudioDevice * dev , int rate, nframes_t bufferSize) : Driver(dev, rate, bufferSize) { read = MakeDelegate(this, &PulseAudioDriver::_read); write = MakeDelegate(this, &PulseAudioDriver::_write); run_cycle = RunCycleCallback(this, &PulseAudioDriver::_run_cycle); mainloop = NULL; context = NULL; stream = NULL; mainloop_api = NULL; volume = PA_VOLUME_NORM; channel_map_set = 0; } PulseAudioDriver::~PulseAudioDriver( ) { PENTER; if (stream) pa_stream_unref(stream); if (context) pa_context_unref(context); if (mainloop) { pa_signal_done(); pa_mainloop_free(mainloop); } } int PulseAudioDriver::_read( nframes_t nframes ) { return 1; } int PulseAudioDriver::_write( nframes_t nframes ) { return 1; } int PulseAudioDriver::setup(bool capture, bool playback, const QString& ) { PENTER; sample_spec.rate = frame_rate; sample_spec.channels = 2; sample_spec.format = PA_SAMPLE_FLOAT32NE; assert(pa_sample_spec_valid(&sample_spec)); if (channel_map_set && channel_map.channels != sample_spec.channels) { fprintf(stderr, "Channel map doesn't match file.\n"); return -1; } /* Set up a new main loop */ if (!(mainloop = pa_mainloop_new())) { fprintf(stderr, "pa_mainloop_new() failed.\n"); return -1; } mainloop_api = pa_mainloop_get_api(mainloop); int r = pa_signal_init(mainloop_api); assert(r == 0); /* Create a new connection context */ if (!(context = pa_context_new(mainloop_api, "Traverso"))) { fprintf(stderr, "pa_context_new() failed.\n"); return -1; } pa_context_set_state_callback(context, context_state_callback, this); /* Connect the context */ pa_context_connect(context, "", (pa_context_flags_t)0, NULL); int ret; /* Run the main loop */ // if (pa_mainloop_run(mainloop, &ret) < 0) { // fprintf(stderr, "pa_mainloop_run() failed.\n"); // return -1; // } AudioChannel* audiochannel; int port_flags; char buf[32]; // TODO use the found maxchannel count for the playback stream, instead of assuming 2 !! for (int chn = 0; chn < 2; chn++) { snprintf (buf, sizeof(buf) - 1, "playback_%d", chn+1); audiochannel = device->register_playback_channel(buf, "32 bit float audio", port_flags, frames_per_cycle, chn); audiochannel->set_latency( frames_per_cycle + capture_frame_latency ); playbackChannels.append(audiochannel); } // TODO use the found maxchannel count for the capture stream, instead of assuming 0 !! for (int chn = 0; chn < 2; chn++) { snprintf (buf, sizeof(buf) - 1, "capture_%d", chn+1); audiochannel = device->register_capture_channel(buf, "32 bit float audio", port_flags, frames_per_cycle, chn); audiochannel->set_latency( frames_per_cycle + capture_frame_latency ); captureChannels.append(audiochannel); } return 1; } int PulseAudioDriver::attach( ) { PENTER; return 1; } int PulseAudioDriver::start( ) { PENTER; return 1; } int PulseAudioDriver::stop( ) { PENTER; return 1; } int PulseAudioDriver::process_callback (nframes_t nframes) { device->run_cycle( nframes, 0.0); return 0; } QString PulseAudioDriver::get_device_name() { return "Pulse"; } QString PulseAudioDriver::get_device_longname() { return "Pulse"; } int PulseAudioDriver::_run_cycle() { return device->run_cycle(frames_per_cycle, 0); } void PulseAudioDriver::context_state_callback(pa_context * c, void * userdata) { } void PulseAudioDriver::stream_state_callback(pa_stream * s, void * userdata) { } void PulseAudioDriver::stream_write_callback(pa_stream * s, size_t length, void * userdata) { } traverso-0.49.4/src/engine/CoreAudioDriver.h000644 001750 001750 00000007633 11163362147 021227 0ustar00remonremon000000 000000 /* Copyright (C) 2008 Remon Sijrier Copyright (C) Grame, 2003. Copyright (C) Johnny Petrantoni, 2003. (November 2008) Ported to C++ for Traverso by Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. Grame Research Laboratory, 9, rue du Garet 69001 Lyon - France grame@rd.grame.fr Johnny Petrantoni, johnny@lato-b.com - Italy, Rome. 30-01-04, Johnny Petrantoni: first code of the coreaudio driver. */ #ifndef CORE_AUDIO_DRIVER_H #define CORE_AUDIO_DRIVER_H #include "Driver.h" #include #include #include #include "defines.h" class CoreAudioDriver : public Driver { public: CoreAudioDriver(AudioDevice* dev, int rate, nframes_t bufferSize); ~CoreAudioDriver(); // int start(); // int stop(); // int _read(nframes_t nframes); // int _write(nframes_t nframes); // int _null_cycle(nframes_t nframes); // int _run_cycle(); int attach(); // int detach(); // int bufsize(nframes_t nframes); // int restart(); int setup(bool capture=true, bool playback=true, const QString& cardDevice="none"); AudioUnit au_hal; AudioBufferList* input_list; AudioDeviceID device_id; int state; channel_t playback_nchannels; channel_t capture_nchannels; char capture_driver_name[256]; char playback_driver_name[256]; int xrun_detected; int null_cycle_occured; void JCALog(char *fmt, ...); void printError(OSStatus err); OSStatus get_device_name_from_id(AudioDeviceID id, char name[256]); OSStatus get_device_id_from_uid(char* UID, AudioDeviceID* id); OSStatus get_default_device(AudioDeviceID * id); OSStatus get_default_input_device(AudioDeviceID* id); OSStatus get_default_output_device(AudioDeviceID* id); OSStatus get_total_channels(AudioDeviceID device, int* channelCount, bool isInput); OSStatus display_device_names(); OSStatus render(AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList *ioData); OSStatus render_input(AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList *ioData); OSStatus sr_notification( AudioDeviceID inDevice, UInt32 inChannel, Boolean isInput, AudioDevicePropertyID inPropertyID); OSStatus notification( AudioDeviceID inDevice, UInt32 inChannel, Boolean isInput, AudioDevicePropertyID inPropertyID); static OSStatus _render(void *inRefCon, AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList *ioData); static OSStatus _render_input( void *inRefCon, AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList *ioData); static OSStatus _sr_notification( AudioDeviceID inDevice, UInt32 inChannel, Boolean isInput, AudioDevicePropertyID inPropertyID, void* inClientData); static OSStatus _notification( AudioDeviceID inDevice, UInt32 inChannel, Boolean isInput, AudioDevicePropertyID inPropertyID, void* inClientData); }; #endif //eof traverso-0.49.4/src/engine/AudioDevice.cpp000644 001750 001750 00000055267 12417542747 020734 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2006 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: AudioDevice.cpp,v 1.56 2009/03/04 20:54:00 r_sijrier Exp $ */ #include "AudioDevice.h" #include "AudioDeviceThread.h" #if defined (ALSA_SUPPORT) #include "AlsaDriver.h" #endif #if defined (JACK_SUPPORT) RELAYTOOL_JACK #include "JackDriver.h" #endif #if defined (PORTAUDIO_SUPPORT) #include "PADriver.h" #endif #if defined (PULSEAUDIO_SUPPORT) #include "PulseAudioDriver.h" #endif #if defined (COREAUDIO_SUPPORT) #include "CoreAudioDriver.h" #endif #include "Driver.h" #include "Client.h" #include "AudioChannel.h" #include "AudioBus.h" #include "Tsar.h" //#include // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" /*! \class AudioDevice \brief An Interface to the 'real' audio device, and the hearth of the libtraversoaudiobackend AudioDevice is accessed by the audiodevice() function. You need to first initialize the 'device' by calling AudioDevice::set_parameters(int rate, nframes_t bufferSize, QString driverType); This will initialize the real audiodevice in case of the Alsa driver, or connect to the jack deamon. In the latter case, the rate and bufferSize don't do anything, since they are provided by the jack itself This class and/or related classes depend on RingBuffer, Tsar and FastDelegate which are found in libtraversocore. The signal/slot feature as supplied by Qt is also used, which makes the Qt dependency a bit deeper, though it shouldn't be to hard to get rid of it if you like to use the libtraversoaudiobackend in an application not using Qt, or if you don't want a dependency to Qt. Using the audiobackend in an application is as simple as: \code #include main() { myApp = new MyApp(); myApp->execute(); return; } MyApp::MyApp() : QApplication { setup_audiobackend(); connect_to_audiodevice(); } void MyApp::setup_audiobackend() { int rate = 44100; int bufSize = 1024; QString driver = "ALSA"; audiodevice().set_parameters(rate, bufSize, driver); } \endcode The AudioDevice instance now has set up it's own audio thread, or uses the one created by jack. This thread will continuously run, and process the callback functions of the registered Client's Connecting your application to the audiodevice is done by creating an instance of Client, and setting the right callback function. The Client is added to the audiodevice in a thread save way, without using any locking mechanisms. \code void MyApp::connect_to_audiodevice() { m_client = new Client("MyApplication"); m_client->set_process_callback( MakeDelegate(this, &MyApp::process) ); audiodevice().add_client(m_client); } \endcode Finally, we want to do some processing in the process callback, e.g. \code int MyApp::process(nframes_t nframes) { AudioBus* captureBus = audiodevice().get_capture_bus("Capture 1"); AudioBus* playbackBus = audiodevice().get_playback_bus("Playback 1"); // Just copy the captured audio to the playback buses. for (int i=0; iget_channel_count(); ++i) { memcpy(captureBus->get_channel(i)->get_buffer(nframes), playbackBus->get_channel(i)->get_buffer(nframes), nframes); } return 1; } \endcode */ /** * A global function, used to get the AudioDevice instance. Due the nature of singletons, the AudioDevice intance will be created automatically! * @return The AudioDevice instance, it will be automatically created on first call */ AudioDevice& audiodevice() { static AudioDevice device; return device; } AudioDevice::AudioDevice() { m_runAudioThread = false; driver = 0; audioThread = 0; m_bufferSize = 1024; m_xrunCount = 0; m_cpuTime = new RingBufferNPT(4096); m_driverType = tr("No Driver Loaded"); #if defined (JACK_SUPPORT) if (libjack_is_present) { availableDrivers << "Jack"; } #endif #if defined (ALSA_SUPPORT) availableDrivers << "ALSA"; #endif #if defined (PORTAUDIO_SUPPORT) availableDrivers << "PortAudio"; #endif #if defined (PULSEAUDIO_SUPPORT) availableDrivers << "PulseAudio"; #endif #if defined (COREAUDIO_SUPPORT) availableDrivers << "CoreAudio"; #endif availableDrivers << "Null Driver"; // tsar is a singleton, so initialization is done on first tsar() call // Tsar makes use of a QTimer to cleanup the processed events. // The QTimer _has_ to be started from the GUI thread, so we 'initialize' // tsar here _before_ the AudioDevice is setup, since tsar is being called // from here by for example the jack driver which could initialize tsar // from within the _jack client thread_ which makes the whole thing _fail_ tsar(); connect(this, SIGNAL(xrunStormDetected()), this, SLOT(switch_to_null_driver())); connect(&m_xrunResetTimer, SIGNAL(timeout()), this, SLOT(reset_xrun_counter())); m_xrunResetTimer.start(30000); } AudioDevice::~AudioDevice() { PENTERDES; shutdown(); if (audioThread) { delete audioThread; } delete m_cpuTime; free_memory(); } void AudioDevice::free_memory() { foreach(AudioBus* bus, captureBuses) { delete bus; } foreach(AudioBus* bus, playbackBuses) { delete bus; } captureChannels.clear(); playbackChannels.clear(); captureBuses.clear(); playbackBuses.clear(); } /** * * Not yet implemented */ void AudioDevice::show_descriptors( ) { // Needs to be implemented } void AudioDevice::set_buffer_size( nframes_t size ) { Q_ASSERT(size > 0); m_bufferSize = size; } void AudioDevice::set_sample_rate( nframes_t rate ) { m_rate = rate; } void AudioDevice::set_bit_depth( uint depth ) { m_bitdepth = depth; } int AudioDevice::run_cycle( nframes_t nframes, float delayed_usecs ) { nframes_t left; if (nframes != m_bufferSize) { printf ("late driver wakeup: nframes to process = %ld\n", (long)nframes); } /* run as many cycles as it takes to consume nframes (Should be 1 cycle!!)*/ for (left = nframes; left >= m_bufferSize; left -= m_bufferSize) { if (run_one_cycle (m_bufferSize, delayed_usecs) < 0) { qCritical ("cycle execution failure, exiting"); return -1; } } post_process(); return 1; } int AudioDevice::run_one_cycle( nframes_t nframes, float ) { if (driver->read(nframes) < 0) { qDebug("driver read failed!"); return -1; } apill_foreach(TAudioDeviceClient* client, TAudioDeviceClient, m_clients) { client->process(nframes); } /* for (int i=0; iprocess(nframes) < 0) { // ? } }*/ if (driver->write(nframes) < 0) { qDebug("driver write failed!"); return -1; } return 0; } void AudioDevice::delay( float ) { } /** * * @return The amount of Capture Buses, 0 if no Capture Buses are available */ uint AudioDevice::capture_buses_count( ) const { return captureChannels.size(); } /** * * @return The amount of PlayBack Buses, 0 if no PlayBack Buses are available */ uint AudioDevice::playback_buses_count( ) const { return playbackChannels.size(); } /** * This function is used to initialize the AudioDevice's audioThread with the supplied * rate, bufferSize and driver type. In case the AudioDevice allready was configured, * it will stop the AudioDeviceThread and emits the stopped() signal, * re-inits the AlsaDriver with the new paramaters, when succesfull emits the driverParamsChanged() signal, * restarts the AudioDeviceThread and emits the started() signal * * @param rate The new sample rate, only used for the AlsaDriver * @param bufferSize The period buffer size, only used for the AlsaDriver * @param driverType The Driver Type, can be ALSA, Jack or the Null Driver */ void AudioDevice::set_parameters( int rate, nframes_t bufferSize, const QString& driverType, bool capture, bool playback, const QString& cardDevice, const QString& ditherShape) { PENTER; m_rate = rate; m_bufferSize = bufferSize; m_xrunCount = 0; m_ditherShape = ditherShape; shutdown(); if (create_driver(driverType, capture, playback, cardDevice) < 0) { set_parameters(rate, bufferSize, "Null Driver"); return; } driver->attach(); setup_buses(); emit driverParamsChanged(); m_runAudioThread = 1; if ((driverType == "ALSA") || (driverType == "Null Driver")) { printf("Starting AudioDeviceThread..... "); if (!audioThread) { audioThread = new AudioDeviceThread(this); } // m_cycleStartTime/EndTime are set before/after the first cycle. // to avoid a "100%" cpu usage value during audioThread startup, set the // m_cycleStartTime here! m_cycleStartTime = get_microseconds(); // When the audiothread fails for some reason we catch it in audiothread_finished() // by connecting the finished signal of the audio thread! connect(audioThread, SIGNAL(finished()), this, SLOT(audiothread_finished())); // Start the audio thread, the driver->start() will be called from there!! audioThread->start(); // It appears this check is a little silly because it always returns true // this close after calling the QThread::start() function :-( if (audioThread->isRunning()) { printf("Running!\n"); } } #if defined (JACK_SUPPORT) // This will activate the jack client if (libjack_is_present) { if (driverType == "Jack") { if (driver->start() == -1) { // jack driver failed to start, fallback to Null Driver: set_parameters(rate, bufferSize, "Null Driver"); return; } connect(&jackShutDownChecker, SIGNAL(timeout()), this, SLOT(check_jack_shutdown())); jackShutDownChecker.start(500); } } #endif if (driverType == "PortAudio"|| (driverType == "PulseAudio") || (driverType == "CoreAudio")) { if (driver->start() == -1) { // PortAudio driver failed to start, fallback to Null Driver: set_parameters(rate, bufferSize, "Null Driver"); return; } } emit started(); } int AudioDevice::create_driver(QString driverType, bool capture, bool playback, const QString& cardDevice) { #if defined (JACK_SUPPORT) if (libjack_is_present) { if (driverType == "Jack") { driver = new JackDriver(this, m_rate, m_bufferSize); if (driver->setup(capture, playback) < 0) { message(tr("Audiodevice: Failed to create the Jack Driver"), WARNING); delete driver; driver = 0; return -1; } m_driverType = driverType; return 1; } } #endif #if defined (ALSA_SUPPORT) if (driverType == "ALSA") { driver = new AlsaDriver(this, m_rate, m_bufferSize); if (((AlsaDriver*)driver)->setup(capture,playback, cardDevice, m_ditherShape) < 0) { message(tr("Audiodevice: Failed to create the ALSA Driver"), WARNING); delete driver; driver = 0; return -1; } m_driverType = driverType; return 1; } #endif #if defined (PORTAUDIO_SUPPORT) if (driverType == "PortAudio") { driver = new PADriver(this, m_rate, m_bufferSize); if (driver->setup(capture, playback, cardDevice) < 0) { message(tr("Audiodevice: Failed to create the PortAudio Driver"), WARNING); delete driver; driver = 0; return -1; } m_driverType = driverType; return 1; } #endif #if defined (PULSEAUDIO_SUPPORT) if (driverType == "PulseAudio") { driver = new PulseAudioDriver(this, m_rate, m_bufferSize); if (driver->setup(capture, playback, cardDevice) < 0) { message(tr("Audiodevice: Failed to create the PulseAudio Driver"), WARNING); delete driver; driver = 0; return -1; } m_driverType = driverType; return 1; } #endif #if defined (COREAUDIO_SUPPORT) if (driverType == "CoreAudio") { driver = new CoreAudioDriver(this, m_rate, m_bufferSize); if (driver->setup(capture, playback, cardDevice) < 0) { message(tr("Audiodevice: Failed to create the CoreAudio Driver"), WARNING); delete driver; driver = 0; return -1; } m_driverType = driverType; return 1; } #endif if (driverType == "Null Driver") { printf("Creating Null Driver...\n"); driver = new Driver(this, m_rate, m_bufferSize); m_driverType = driverType; return 1; } return -1; } AudioChannel* AudioDevice::register_capture_channel(const QByteArray& chanName, const QString& audioType, int flags, uint , uint channel ) { AudioChannel* chan = new AudioChannel(chanName, audioType, flags, channel); captureChannels.insert(chanName, chan); return chan; } AudioChannel* AudioDevice::register_playback_channel(const QByteArray& chanName, const QString& audioType, int flags, uint , uint channel ) { AudioChannel* chan = new AudioChannel(chanName, audioType, flags, channel); playbackChannels.insert(chanName, chan); return chan; } /** * Stops the AudioDevice's AudioThread, free's any related memory. * Use this to properly shut down the AudioDevice on application exit, * or to explicitely release the real 'audiodevice'. * Use set_parameters() to reinitialize the audiodevice if you want to use it again. * * @return 1 on succes, 0 on failure */ int AudioDevice::shutdown( ) { PENTER; int r = 1; emit stopped(); m_runAudioThread = 0; if (audioThread) { disconnect(audioThread, SIGNAL(finished()), this, SLOT(audiothread_finished())); // Wait until the audioThread has finished execution. One second // should do, if it's still running then, the thread must have gone wild or something.... if (audioThread->isRunning()) { printf("Starting to shutdown AudioThread..\n"); r = audioThread->wait(1000); printf("AudioDeviceThread finished, stopping driver\n"); } } if (driver) { driver->stop(); delete driver; driver = 0; } free_memory(); return r; } /** * Get the names of all the Capture Buses availble, use the names to get a Bus instance * via get_capture_bus() * * @return A QStringList with all the Capture Buses names which are available, * an empty list if no Buses are available. */ QStringList AudioDevice::get_capture_buses_names( ) const { QStringList names; foreach(AudioBus* bus, captureBuses) { names.append(bus->get_name()); } return names; } /** * Get the names of all the Playback Buses availble, use the names to get a Bus instance * via get_playback_bus() * * @return A QStringList with all the PlayBack Buses names which are available, * an empty list if no Buses are available. */ QStringList AudioDevice::get_playback_buses_names( ) const { QStringList names; foreach(AudioBus* bus, playbackBuses) { names.append(bus->get_name()); } return names; } void AudioDevice::setup_buses( ) { int number = 1; QByteArray name; AudioChannel* channel; for (int i=1; i <= captureChannels.size();) { name = "Capture " + QByteArray::number(number++); AudioBus* bus = new AudioBus(name); channel = captureChannels.value("capture_"+QByteArray::number(i++), 0); if (channel) { bus->add_channel(channel); } channel = captureChannels.value("capture_"+QByteArray::number(i++), 0); if (channel) { bus->add_channel(channel); } captureBuses.insert(name, bus); } // PWARN("Capture buses count is: %d", captureBuses.size()); number = 1; for (int i=1; i <= playbackChannels.size();) { name = "Playback " + QByteArray::number(number++); AudioBus* bus = new AudioBus(name); channel = playbackChannels.value("playback_"+QByteArray::number(i++), 0); if (channel) { bus->add_channel(channel); } channel = playbackChannels.value("playback_"+QByteArray::number(i++), 0); if (channel) { bus->add_channel(channel); } playbackBuses.insert(name, bus); } // PWARN("Playback buses count is: %d", playbackBuses.size()); } /** * * @return The real audiodevices sample rate */ uint AudioDevice::get_sample_rate( ) const { return m_rate; } /** * * @return The real bit depth, which is 32 bit float.... FIXME Need to get the real bitdepth as * reported by the 'real audiodevice' */ uint AudioDevice::get_bit_depth( ) const { return m_bitdepth; } /** * * @return The short description of the 'real audio device' */ QString AudioDevice::get_device_name( ) const { if (driver) return driver->get_device_name(); return tr("No Device Configured"); } /** * * @return The long description of the 'real audio device' */ QString AudioDevice::get_device_longname( ) const { if (driver) return driver->get_device_longname(); return tr("No Device Configured"); } /** * * @return A list of supported Drivers */ QStringList AudioDevice::get_available_drivers( ) const { return availableDrivers; } /** * * @return The currently used Driver type */ QString AudioDevice::get_driver_type( ) const { return m_driverType; } /** * * @return The cpu load, call this at least 1 time per second to keep data consistent */ trav_time_t AudioDevice::get_cpu_time( ) { #if defined (JACK_SUPPORT) if (libjack_is_present) if (driver && m_driverType == "Jack") return ((JackDriver*)driver)->get_cpu_load(); #endif #if defined (PORTAUDIO_SUPPORT) if (driver && m_driverType == "PortAudio") return ((PADriver*)driver)->get_cpu_load(); #endif trav_time_t currentTime = get_microseconds(); float totaltime = 0; trav_time_t value = 0; int read = m_cpuTime->read_space(); while (read != 0) { read = m_cpuTime->read(&value, 1); totaltime += value; } audio_sample_t result = ( (totaltime / (currentTime - m_lastCpuReadTime) ) * 100 ); m_lastCpuReadTime = currentTime; return result; } void AudioDevice::post_process( ) { tsar().process_events(); } void AudioDevice::private_add_client(TAudioDeviceClient* client) { m_clients.prepend(client); } void AudioDevice::private_remove_client(TAudioDeviceClient* client) { if (!m_clients.remove(client)) { printf("AudioDevice:: Client was not in clients list, failed to remove it!\n"); } } /** * Adds the client into the audio processing chain in a Thread Save way * WARNING: This function assumes the Clients callback function is set to an existing objects function! */ void AudioDevice::add_client( TAudioDeviceClient * client ) { THREAD_SAVE_INVOKE(this, client, private_add_client(TAudioDeviceClient*)); } /** * Removes the client into the audio processing chain in a Thread save way * * The clientRemoved(Client* client); signal will be emited after succesfull removal * from within the GUI Thread! */ void AudioDevice::remove_client( TAudioDeviceClient * client ) { THREAD_SAVE_INVOKE_AND_EMIT_SIGNAL(this, client, private_remove_client(TAudioDeviceClient*), clientRemoved(TAudioDeviceClient*)); } void AudioDevice::mili_sleep(int msec) { audioThread->mili_sleep(msec); } void AudioDevice::audiothread_finished() { if (m_runAudioThread) { // AudioThread stopped, but we didn't do it ourselves // so something certainly did go wrong when starting the beast // Start the Null Driver to avoid problems with Tsar PERROR("Alsa/Jack AudioThread stopped, but we didn't ask for it! Something apparently did go wrong :-("); set_parameters(44100, m_bufferSize, "Null Driver"); } } void AudioDevice::xrun( ) { RT_THREAD_EMIT(this, NULL, bufferUnderRun()); m_xrunCount++; if (m_xrunCount > 30) { RT_THREAD_EMIT(this, NULL, xrunStormDetected()); } } void AudioDevice::check_jack_shutdown() { #if defined (JACK_SUPPORT) if (libjack_is_present) { JackDriver* jackdriver = qobject_cast(driver); if (jackdriver) { if ( ! jackdriver->is_jack_running()) { jackShutDownChecker.stop(); printf("jack shutdown detected\n"); message(tr("The Jack server has been shutdown!"), CRITICAL); delete driver; driver = 0; set_parameters(44100, m_bufferSize, "Null Driver"); } } } #endif } void AudioDevice::switch_to_null_driver() { message(tr("AudioDevice:: Buffer underrun 'Storm' detected, switching to Null Driver"), CRITICAL); message(tr("AudioDevice:: For trouble shooting this problem, please see Chapter 11 from the user manual!"), INFO); set_parameters(44100, m_bufferSize, "Null Driver"); } int AudioDevice::transport_control(transport_state_t state) { #if defined (JACK_SUPPORT) if (!slaved_jack_driver()) { return true; } #endif int result = 0; apill_foreach(TAudioDeviceClient* client, TAudioDeviceClient, m_clients) { result = client->transport_control(state); } return result; } void AudioDevice::transport_start(TAudioDeviceClient * client) { #if defined (JACK_SUPPORT) JackDriver* jackdriver = slaved_jack_driver(); if (jackdriver) { PMESG("using jack_transport_start"); jack_transport_start(jackdriver->get_client()); return; } #endif transport_state_t state; state.tranport = TransportRolling; state.isSlave = false; state.realtime = false; state.location = TimeRef(); // get from client!! client->transport_control(state); } void AudioDevice::transport_stop(TAudioDeviceClient * client) { #if defined (JACK_SUPPORT) JackDriver* jackdriver = slaved_jack_driver(); if (jackdriver) { PMESG("using jack_transport_stop"); jack_transport_stop(jackdriver->get_client()); return; } #endif transport_state_t state; state.tranport = TransportStopped; state.isSlave = false; state.realtime = false; state.location = TimeRef(); // get from client!! client->transport_control(state); } // return 0 if valid request, non-zero otherwise. int AudioDevice::transport_seek_to(TAudioDeviceClient* client, TimeRef location) { #if defined (JACK_SUPPORT) JackDriver* jackdriver = slaved_jack_driver(); if (jackdriver) { PMESG("using jack_transport_locate"); nframes_t frames = location.to_frame(get_sample_rate()); return jack_transport_locate(jackdriver->get_client(), frames); } #endif transport_state_t state; state.tranport = TransportStarting; state.isSlave = false; state.realtime = false; state.location = location; client->transport_control(state); return 0; } #if defined (JACK_SUPPORT) JackDriver* AudioDevice::slaved_jack_driver() { if (libjack_is_present) { JackDriver* jackdriver = qobject_cast(driver); if (jackdriver && jackdriver->is_slave()) { return jackdriver; } } return 0; } #endif TimeRef AudioDevice::get_buffer_latency() { return TimeRef(m_bufferSize, m_rate); } void AudioDevice::set_driver_properties(QHash< QString, QVariant > & properties) { m_driverProperties = properties; #if defined (JACK_SUPPORT) if (libjack_is_present) { JackDriver* jackdriver = qobject_cast(driver); if (jackdriver) { jackdriver->update_config(); } } #endif } QVariant AudioDevice::get_driver_property(const QString& property, QVariant defaultValue) { return m_driverProperties.value(property, defaultValue); } traverso-0.49.4/src/engine/AudioDeviceThread.h000644 001750 001750 00000002507 11163362147 021505 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2006 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: AudioDeviceThread.h,v 1.4 2007/03/16 00:10:26 r_sijrier Exp $ */ #ifndef AUDIODEVICETHREAD_H #define AUDIODEVICETHREAD_H #include class AudioDevice; class AudioDeviceThread : public QThread { public: AudioDeviceThread(AudioDevice* device); int become_realtime(bool realtime); void run_on_cpu(int cpu); void mili_sleep(int msec) {msleep(msec);} volatile size_t watchdogCheck; protected: void run(); private: AudioDevice* m_device; bool m_realTime; }; #endif //eof traverso-0.49.4/src/engine/sse_functions.S000644 001750 001750 00000024424 11163362147 021033 0ustar00remonremon000000 000000 /* Copyright (C) 2005 Sampo Savolainen This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: sse_functions.S,v 1.1 2006/11/28 13:59:34 r_sijrier Exp $ */ #; void x86_sse_mix_buffers_with_gain (float *dst, float *src, long nframes, float gain); .globl x86_sse_mix_buffers_with_gain .type x86_sse_mix_buffers_with_gain,@function x86_sse_mix_buffers_with_gain: #; 8(%ebp) = float *dst = %edi #; 12(%ebp) = float *src = %esi #; 16(%ebp) = long nframes = %ecx #; 20(%ebp) = float gain = st(0) pushl %ebp movl %esp, %ebp #; save the registers #; pushl %eax pushl %ebx #; pushl %ecx pushl %edi pushl %esi #; if nframes == 0, go to end movl 16(%ebp), %ecx #; nframes cmp $0, %ecx je .MBWG_END #; Check for alignment movl 8(%ebp), %edi #; dst movl 12(%ebp), %esi #; src movl %edi, %eax andl $12, %eax #; mask alignemnt offset movl %esi, %ebx andl $12, %ebx #; mask alignment offset cmp %eax, %ebx jne .MBWG_NONALIGN #; if not aligned, calculate manually #; if we are aligned cmp $0, %ebx jz .MBWG_SSE #; Pre-loop, we need to run 1-3 frames "manually" without #; SSE instructions movss 20(%ebp), %xmm1 #; xmm1 .MBWG_PRELOOP: movss (%esi), %xmm0 mulss %xmm1, %xmm0 addss (%edi), %xmm0 movss %xmm0, (%edi) addl $4, %edi #; dst++ addl $4, %esi #; src++ decl %ecx #; nframes-- jz .MBWG_END #; cmp $0, %ecx #; je .MBWG_END #; if we run out of frames, go to end addl $4, %ebx cmp $16, %ebx #; test if we've reached 16 byte alignment jne .MBWG_PRELOOP .MBWG_SSE: cmp $4, %ecx #; we know it's not zero, but if it's not >=4, then jnge .MBWG_NONALIGN #; we jump straight to the "normal" code #; copy gain to fill %xmm1 movss 20(%ebp), %xmm1 shufps $0x00, %xmm1, %xmm1 .MBWG_SSELOOP: movaps (%esi), %xmm0 #; source => xmm0 mulps %xmm1, %xmm0 #; apply gain to source addps (%edi), %xmm0 #; mix with destination movaps %xmm0, (%edi) #; copy result to destination addl $16, %edi #; dst+=4 addl $16, %esi #; src+=4 subl $4, %ecx #; nframes-=4 cmp $4, %ecx jge .MBWG_SSELOOP cmp $0, %ecx je .MBWG_END #; if there are remaining frames, the nonalign code will do nicely #; for the rest 1-3 frames. .MBWG_NONALIGN: #; not aligned! movss 20(%ebp), %xmm1 #; gain => xmm1 .MBWG_NONALIGNLOOP: movss (%esi), %xmm0 mulss %xmm1, %xmm0 addss (%edi), %xmm0 movss %xmm0, (%edi) addl $4, %edi addl $4, %esi decl %ecx jnz .MBWG_NONALIGNLOOP .MBWG_END: popl %esi popl %edi #; popl %ecx popl %ebx #; popl %eax #; return leave ret .size x86_sse_mix_buffers_with_gain, .-x86_sse_mix_buffers_with_gain #; void x86_sse_mix_buffers_no_gain (float *dst, float *src, long nframes); .globl x86_sse_mix_buffers_no_gain .type x86_sse_mix_buffers_no_gain,@function x86_sse_mix_buffers_no_gain: #; 8(%ebp) = float *dst = %edi #; 12(%ebp) = float *src = %esi #; 16(%ebp) = long nframes = %ecx pushl %ebp movl %esp, %ebp #; save the registers #; pushl %eax pushl %ebx #; pushl %ecx pushl %edi pushl %esi #; the real function #; if nframes == 0, go to end movl 16(%ebp), %ecx #; nframes cmp $0, %ecx je .MBNG_END #; Check for alignment movl 8(%ebp), %edi #; dst movl 12(%ebp), %esi #; src movl %edi, %eax andl $12, %eax #; mask alignemnt offset movl %esi, %ebx andl $12, %ebx #; mask alignment offset cmp %eax, %ebx jne .MBNG_NONALIGN #; if not aligned, calculate manually cmp $0, %ebx je .MBNG_SSE #; Pre-loop, we need to run 1-3 frames "manually" without #; SSE instructions .MBNG_PRELOOP: movss (%esi), %xmm0 addss (%edi), %xmm0 movss %xmm0, (%edi) addl $4, %edi #; dst++ addl $4, %esi #; src++ decl %ecx #; nframes-- jz .MBNG_END addl $4, %ebx cmp $16, %ebx #; test if we've reached 16 byte alignment jne .MBNG_PRELOOP .MBNG_SSE: cmp $4, %ecx #; if there are frames left, but less than 4 jnge .MBNG_NONALIGN #; we can't run SSE .MBNG_SSELOOP: movaps (%esi), %xmm0 #; source => xmm0 addps (%edi), %xmm0 #; mix with destination movaps %xmm0, (%edi) #; copy result to destination addl $16, %edi #; dst+=4 addl $16, %esi #; src+=4 subl $4, %ecx #; nframes-=4 cmp $4, %ecx jge .MBNG_SSELOOP cmp $0, %ecx je .MBNG_END #; if there are remaining frames, the nonalign code will do nicely #; for the rest 1-3 frames. .MBNG_NONALIGN: #; not aligned! movss (%esi), %xmm0 #; src => xmm0 addss (%edi), %xmm0 #; xmm0 += dst movss %xmm0, (%edi) #; xmm0 => dst addl $4, %edi addl $4, %esi decl %ecx jnz .MBNG_NONALIGN .MBNG_END: popl %esi popl %edi #; popl %ecx popl %ebx #; popl %eax #; return leave ret .size x86_sse_mix_buffers_no_gain, .-x86_sse_mix_buffers_no_gain #; void x86_sse_apply_gain_to_buffer (float *buf, long nframes, float gain); .globl x86_sse_apply_gain_to_buffer .type x86_sse_apply_gain_to_buffer,@function x86_sse_apply_gain_to_buffer: #; 8(%ebp) = float *buf = %edi #; 12(%ebp) = long nframes = %ecx #; 16(%ebp) = float gain = st(0) pushl %ebp movl %esp, %ebp #; save %edi pushl %edi #; the real function #; if nframes == 0, go to end movl 12(%ebp), %ecx #; nframes cmp $0, %ecx je .AG_END #; create the gain buffer in %xmm1 movss 16(%ebp), %xmm1 shufps $0x00, %xmm1, %xmm1 #; Check for alignment movl 8(%ebp), %edi #; buf movl %edi, %edx #; buf => %edx andl $12, %edx #; mask bits 1 & 2, result = 0, 4, 8 or 12 jz .AG_SSE #; if buffer IS aligned #; PRE-LOOP #; we iterate 1-3 times, doing normal x87 float comparison #; so we reach a 16 byte aligned "buf" (=%edi) value .AGLP_START: #; Load next value from the buffer movss (%edi), %xmm0 mulss %xmm1, %xmm0 movss %xmm0, (%edi) #; increment buffer, decrement counter addl $4, %edi #; buf++; decl %ecx #; nframes-- jz .AG_END #; if we run out of frames, we go to the end addl $4, %edx #; one non-aligned byte less cmp $16, %edx jne .AGLP_START #; if more non-aligned frames exist, we do a do-over .AG_SSE: #; We have reached the 16 byte aligned "buf" ("edi") value #; Figure out how many loops we should do movl %ecx, %eax #; copy remaining nframes to %eax for division movl $0, %edx #; 0 the edx register pushl %edi movl $4, %edi divl %edi #; %edx = remainder == 0 popl %edi #; %eax = SSE iterations cmp $0, %eax je .AGPOST_START .AGLP_SSE: movaps (%edi), %xmm0 mulps %xmm1, %xmm0 movaps %xmm0, (%edi) addl $16, %edi #; subl $4, %ecx #; nframes-=4 decl %eax jnz .AGLP_SSE #; Next we need to post-process all remaining frames #; the remaining frame count is in %ecx #; if no remaining frames, jump to the end #; cmp $0, %ecx andl $3, %ecx #; nframes % 4 je .AG_END .AGPOST_START: movss (%edi), %xmm0 mulss %xmm1, %xmm0 movss %xmm0, (%edi) #; increment buffer, decrement counter addl $4, %edi #; buf++; decl %ecx #; nframes-- jnz .AGPOST_START #; if we run out of frames, we go to the end .AG_END: popl %edi #; return leave ret .size x86_sse_apply_gain_to_buffer, .-x86_sse_apply_gain_to_buffer #; end proc #; float x86_sse_compute_peak(float *buf, long nframes, float current); .globl x86_sse_compute_peak .type x86_sse_compute_peak,@function abs_mask: .long 2147483647 x86_sse_compute_peak: #; 8(%ebp) = float *buf = %edi #; 12(%ebp) = long nframes = %ecx #; 16(%ebp) = float current = st(0) pushl %ebp movl %esp, %ebp #; save %edi pushl %edi #; the real function #; Load "current" in xmm0 movss 16(%ebp), %xmm0 #; if nframes == 0, go to end movl 12(%ebp), %ecx #; nframes cmp $0, %ecx je .CP_END #; create the "abs" mask in %xmm2 movss abs_mask, %xmm2 shufps $0x00, %xmm2, %xmm2 #; Check for alignment movl 8(%ebp), %edi #; buf movl %edi, %edx #; buf => %edx andl $12, %edx #; mask bits 1 & 2, result = 0, 4, 8 or 12 jz .CP_SSE #; if buffer IS aligned #; PRE-LOOP #; we iterate 1-3 times, doing normal x87 float comparison #; so we reach a 16 byte aligned "buf" (=%edi) value .LP_START: #; Load next value from the buffer movss (%edi), %xmm1 andps %xmm2, %xmm1 maxss %xmm1, %xmm0 #; increment buffer, decrement counter addl $4, %edi #; buf++; decl %ecx #; nframes-- jz .CP_END #; if we run out of frames, we go to the end addl $4, %edx #; one non-aligned byte less cmp $16, %edx jne .LP_START #; if more non-aligned frames exist, we do a do-over .CP_SSE: #; We have reached the 16 byte aligned "buf" ("edi") value #; Figure out how many loops we should do movl %ecx, %eax #; copy remaining nframes to %eax for division shr $2,%eax #; unsigned divide by 4 jz .POST_START #; %eax = SSE iterations #; current maximum is at %xmm0, but we need to .. shufps $0x00, %xmm0, %xmm0 #; shuffle "current" to all 4 FP's #;prefetcht0 16(%edi) .LP_SSE: movaps (%edi), %xmm1 andps %xmm2, %xmm1 maxps %xmm1, %xmm0 addl $16, %edi decl %eax jnz .LP_SSE #; Calculate the maximum value contained in the 4 FP's in %xmm0 movaps %xmm0, %xmm1 shufps $0x4e, %xmm1, %xmm1 #; shuffle left & right pairs (1234 => 3412) maxps %xmm1, %xmm0 #; maximums of the two pairs movaps %xmm0, %xmm1 shufps $0xb1, %xmm1, %xmm1 #; shuffle the floats inside the two pairs (1234 => 2143) maxps %xmm1, %xmm0 #; now every float in %xmm0 is the same value, current maximum value #; Next we need to post-process all remaining frames #; the remaining frame count is in %ecx #; if no remaining frames, jump to the end andl $3, %ecx #; nframes % 4 jz .CP_END .POST_START: movss (%edi), %xmm1 andps %xmm2, %xmm1 maxss %xmm1, %xmm0 addl $4, %edi #; buf++; decl %ecx #; nframes--; jnz .POST_START .CP_END: #; Load the value from xmm0 to the float stack for returning movss %xmm0, 16(%ebp) flds 16(%ebp) popl %edi #; return leave ret .size x86_sse_compute_peak, .-x86_sse_compute_peak #; end proc #ifdef __ELF__ .section .note.GNU-stack,"",%progbits #endif traverso-0.49.4/src/engine/PulseAudioDriver.h000644 001750 001750 00000003613 11163362147 021421 0ustar00remonremon000000 000000 /* Copyright (C) 2008 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef PULSE_AUDIO_DRIVER_H #define PULSE_AUDIO_DRIVER_H #include "Driver.h" #include "defines.h" #include class PulseAudioDriver : public Driver { public: PulseAudioDriver(AudioDevice* dev, int rate, nframes_t bufferSize); ~PulseAudioDriver(); int process_callback (nframes_t nframes); int _read(nframes_t nframes); int _write(nframes_t nframes); int _run_cycle(); int setup(bool capture=true, bool playback=true, const QString& cardDevice="hw:0"); int attach(); int start(); int stop(); QString get_device_name(); QString get_device_longname(); float get_cpu_load(); void update_config(); private: /** PulseAudio playback stream object */ pa_mainloop* mainloop; pa_context *context; pa_stream *stream; pa_mainloop_api *mainloop_api; pa_volume_t volume; pa_sample_spec sample_spec; pa_channel_map channel_map; int channel_map_set; static void context_state_callback(pa_context *c, void *userdata); static void stream_state_callback(pa_stream *s, void *userdata); static void stream_write_callback(pa_stream *s, size_t length, void *userdata); }; #endif //eof traverso-0.49.4/src/engine/AudioChannel.cpp000644 001750 001750 00000006450 11163362147 021062 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2006 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: AudioChannel.cpp,v 1.7 2006/09/07 09:36:52 r_sijrier Exp $ */ #include "AudioChannel.h" #ifdef USE_MLOCK #include #endif /* USE_MLOCK */ #include // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" /** * \class AudioChannel * \brief AudioChannel wraps one 'real' audiochannel into an easy to use class * * An AudioChannel has a audio_sample_t* buffer, a name and some functions for setting the buffer size, * and monitoring the highest peak value, which is handy to use by for example a VU meter. */ AudioChannel::AudioChannel( const QString& busName, const QString& audioType, int flags, uint channelNumber ) { m_name = busName; m_audioType = audioType; m_flags = flags; m_number = channelNumber; hasData = false; monitoring = false; buf = 0; bufSize = 0; mlocked = 0; peaks = new RingBuffer(150); peaks->reset(); } AudioChannel::~ AudioChannel( ) { PENTERDES2; #ifdef USE_MLOCK if (mlocked) { munlock (buf, bufSize); } #endif /* USE_MLOCK */ delete [] buf; delete peaks; } void AudioChannel::set_latency( uint latency ) { m_latency = latency; } void AudioChannel::set_buffer_size( nframes_t size ) { #ifdef USE_MLOCK if (mlocked) { if (munlock (buf, bufSize) == -1) { PERROR("Couldn't lock buffer into memory"); } mlocked = 0; } #endif /* USE_MLOCK */ if (buf) { delete [] buf; } buf = new audio_sample_t[size]; bufSize = size; silence_buffer(size); #ifdef USE_MLOCK if (mlock (buf, size) == -1) { PERROR("Couldn't lock buffer into memory"); } mlocked = 1; #endif /* USE_MLOCK */ } /** * * @return The highest peak value since the previous call to this function, * call this at least 10 times each second to keep data consistent */ audio_sample_t AudioChannel::get_peak_value( ) { float peak = 0; audio_sample_t result = 0; int read = peaks->read_space() / sizeof(audio_sample_t); while (read != 0) { read = peaks->read((char*)&peak, 1 * sizeof(audio_sample_t)); if (peak > result) result = peak; } return result; } void AudioChannel::set_monitor_peaks( bool monitor ) { monitoring = monitor; } //eof traverso-0.49.4/src/engine/PADriver.h000644 001750 001750 00000003370 11163362147 017647 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef PORTAUDIO_DRIVER_H #define PORTAUDIO_DRIVER_H #include "Driver.h" #include "portaudio.h" class PADriver : public Driver { public: PADriver(AudioDevice* dev, int rate, nframes_t bufferSize); ~PADriver(); int process_callback (nframes_t nframes); int _read(nframes_t nframes); int _write(nframes_t nframes); int _run_cycle() {return 1;} int setup(bool capture=true, bool playback=true, const QString& hostapi="alsa"); int attach(); int start(); int stop(); QString get_device_name(); QString get_device_longname(); float get_cpu_load(); private: PaStream* m_paStream; const void* paInputBuffer; void* paOutputBuffer; static int _xrun_callback(void *arg); static void _on_pa_shutdown_callback(void* arg); static int _process_callback( const void *inputBuffer, void *outputBuffer, unsigned long framesPerBuffer, const PaStreamCallbackTimeInfo* timeInfo, PaStreamCallbackFlags statusFlags, void *arg ); }; #endif //eof traverso-0.49.4/src/engine/AudioDeviceThread.cpp000644 001750 001750 00000010034 11163362147 022032 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: AudioDeviceThread.cpp,v 1.21 2007/10/20 17:38:19 r_sijrier Exp $ */ #include "AudioDeviceThread.h" #include "AudioDevice.h" #include "Driver.h" #if defined (Q_WS_X11) #include #include #include #endif #include #include #include // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" class WatchDogThread : public QThread { AudioDeviceThread* guardedThread; public: WatchDogThread(AudioDeviceThread* thread) { guardedThread = thread; } protected: void run() { #if defined (Q_WS_X11) || defined (Q_WS_MAC) struct sched_param param; param.sched_priority = 90; if (pthread_setschedparam (pthread_self(), SCHED_FIFO, ¶m) != 0) {} #endif while(true) { sleep(5); // printf("Checking watchdogCheck...\n"); if (guardedThread->watchdogCheck == 0) { qCritical("WatchDog timed out!"); // guardedThread->terminate(); #if defined (Q_WS_X11) || defined (Q_WS_MAC) kill (-getpgrp(), SIGABRT); #endif } guardedThread->watchdogCheck = 0; } } }; AudioDeviceThread::AudioDeviceThread(AudioDevice* device) { m_device = device; m_realTime = true; setTerminationEnabled(true); #ifndef Q_WS_MAC setStackSize(1000000); #endif watchdogCheck = 1; } void AudioDeviceThread::run() { run_on_cpu( 0 ); WatchDogThread watchdog(this); watchdog.start(); become_realtime(m_realTime); if (m_device->driver->start() < 0) { watchdog.terminate(); watchdog.wait(); return; } while (m_device->run_audio_thread()) { if (m_device->get_driver()->run_cycle() < 0) { PERROR("Driver cycle error, exiting!"); break; } watchdogCheck = 1; } watchdog.terminate(); watchdog.wait(); } int AudioDeviceThread::become_realtime( bool realtime ) { m_realTime = realtime; #if defined (Q_WS_X11) || defined (Q_WS_MAC) /* RTC stuff */ if (realtime) { struct sched_param param; param.sched_priority = 70; if (pthread_setschedparam (pthread_self(), SCHED_FIFO, ¶m) != 0) { m_device->message(tr("Unable to set Audiodevice Thread to realtime priority!!!" "This most likely results in unreliable playback/capture and " "lots of buffer underruns (== sound drops)." "In the worst case the program can even malfunction!" "Please make sure you run this program with realtime privileges!!!"), AudioDevice::CRITICAL); return -1; } else { printf("AudioThread: Running with realtime priority\n"); return 1; } } #endif return -1; } #if defined (Q_WS_X11) typedef int* (*setaffinity_func_type)(pid_t,unsigned int,cpu_set_t *); #endif void AudioDeviceThread::run_on_cpu( int cpu ) { #if defined (Q_WS_X11) void *setaffinity_handle = dlopen(NULL, RTLD_LAZY);// NULL might not be portable to platforms other than linux - tajmorton@gmail.com setaffinity_func_type setaffinity_func; setaffinity_func = (setaffinity_func_type) dlsym(setaffinity_handle, "sched_setaffinity"); if (setaffinity_func != NULL) { cpu_set_t mask; CPU_ZERO(&mask); CPU_SET(cpu, &mask); if (setaffinity_func(0, sizeof(mask), &mask)) { PWARN("Unable to set CPU affinity\n"); } else { PMESG("Running AudioDeviceThread on CPU %d\n", cpu); } } else { PWARN("Unable to set CPU affinity (glibc is too old)\n"); } #endif } traverso-0.49.4/src/engine/PADriver.cpp000644 001750 001750 00000022254 11163362147 020204 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "PADriver.h" #include "AudioDevice.h" #include "AudioChannel.h" #include // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" // TODO Is there an xrun callback for PortAudio? If so, connect to _xrun_callback // TODO If there is some portaudio shutdown callback, connect to _on_pa_shutdown_callback // and make it work! PADriver::PADriver( AudioDevice * dev , int rate, nframes_t bufferSize) : Driver(dev, rate, bufferSize) { read = MakeDelegate(this, &PADriver::_read); write = MakeDelegate(this, &PADriver::_write); run_cycle = RunCycleCallback(this, &PADriver::_run_cycle); } PADriver::~PADriver( ) { PENTER; } int PADriver::_read(nframes_t nframes) { float* in = (float*) paInputBuffer; if (!captureChannels.size()) { return 0; } if (!captureChannels.at(0)->has_data()) { return 0; } float* datachan0 = captureChannels.at(0)->get_data(); float* datachan1 = captureChannels.at(1)->get_data(); int j=0; for (uint i=0; iget_data(); float* datachan1 = playbackChannels.at(1)->get_data(); int j=0; for (uint i=0; isilence_buffer(nframes); playbackChannels.at(1)->silence_buffer(nframes); return 1; } int PADriver::setup(bool capture, bool playback, const QString& hostapi) { // TODO Only open the capture/playback stream if requested (capture == true, playback == true) // TODO use hostapi to detect which hostApi to use. // hostapi can be any of these: // Linux: alsa, jack, oss // Mac os x: coreaudio, jack // Windows: wmme, directx, asio // TODO In case of hostapi == "alsa", the callback thread prio needs to be set to realtime. // there has been some discussion on this on the pa mailinglist, digg it up! printf("PADriver:: capture, playback, hostapi: %d, %d, %s\n", capture, playback, QS_C(hostapi)); PaError err = Pa_Initialize(); if( err != paNoError ) { device->message(tr("PADriver:: PortAudio error: %1").arg(Pa_GetErrorText( err )), AudioDevice::WARNING); Pa_Terminate(); return -1; } else { printf("PADriver:: Succesfully initialized portaudio\n"); } PaStreamParameters outputParameters, inputParameters; PaDeviceIndex deviceindex = -1; for (int i=0; imessage(tr("hostapi name is %1, deviceCount is %2").arg(inf->name).arg(inf->deviceCount), AudioDevice::INFO); if (hostapi == "alsa" && inf->type == paALSA) { printf("PADriver:: Found alsa host api, using device %d\n", i); deviceindex = i; break; } if (hostapi == "jack" && inf->type == paJACK) { printf("PADriver:: Found jack host api, using device %d\n", i); deviceindex = i; break; } if (hostapi == "wmme" && inf->type == paMME) { printf("PADriver:: Found wmme host api, using device %d\n", i); deviceindex = i; break; } if (hostapi == "directsound" && inf->type == paDirectSound ) { printf("PADriver:: Found directsound host api, using device %d\n", i); deviceindex = i; break; } if (hostapi == "coreaudio" && inf->type == paCoreAudio ) { printf("PADriver:: Found directsound host api, using device %d\n", i); deviceindex = i; break; } } if (deviceindex == -1) { device->message(tr("PADriver:: hostapi %1 was not found by Portaudio!").arg(hostapi), AudioDevice::WARNING); return -1; } deviceindex = 0; // device->message(tr("PADriver:: using device %1").arg(deviceindex), AudioDevice::INFO); // Configure output parameters. // TODO get the max channel count, and use that instead, of assuming 2 PaDeviceIndex result = Pa_GetDefaultOutputDevice(); if( result != paNoDevice) { outputParameters.device = result; outputParameters.channelCount = 2; outputParameters.sampleFormat = paFloat32; /* 32 bit floating point output */ outputParameters.suggestedLatency = Pa_GetDeviceInfo( outputParameters.device )->defaultLowOutputLatency; outputParameters.hostApiSpecificStreamInfo = NULL; } result = Pa_GetDefaultInputDevice(); if( result != paNoDevice) { inputParameters.device = result; inputParameters.channelCount = 2; inputParameters.sampleFormat = paFloat32; /* 32 bit floating point output */ inputParameters.suggestedLatency = Pa_GetDeviceInfo( inputParameters.device )->defaultLowInputLatency; inputParameters.hostApiSpecificStreamInfo = NULL; } /* Open an audio I/O stream. */ err = Pa_OpenStream( &m_paStream, &inputParameters, // The input parameter &outputParameters, // The outputparameter frame_rate, // Set in the constructor frames_per_cycle, // Set in the constructor paNoFlag, // Don't use any flags _process_callback, // our callback function this ); if( err != paNoError ) { device->message(tr("PADriver:: PortAudio error: %1").arg(Pa_GetErrorText( err )), AudioDevice::WARNING); Pa_Terminate(); return -1; } else { printf("PADriver:: Succesfully opened portaudio stream\n"); } AudioChannel* audiochannel; int port_flags; char buf[32]; // TODO use the found maxchannel count for the playback stream, instead of assuming 2 !! for (int chn = 0; chn < 2; chn++) { snprintf (buf, sizeof(buf) - 1, "playback_%d", chn+1); audiochannel = device->register_playback_channel(buf, "32 bit float audio", port_flags, frames_per_cycle, chn); audiochannel->set_latency( frames_per_cycle + capture_frame_latency ); playbackChannels.append(audiochannel); } // TODO use the found maxchannel count for the capture stream, instead of assuming 0 !! for (int chn = 0; chn < 2; chn++) { snprintf (buf, sizeof(buf) - 1, "capture_%d", chn+1); audiochannel = device->register_capture_channel(buf, "32 bit float audio", port_flags, frames_per_cycle, chn); audiochannel->set_latency( frames_per_cycle + capture_frame_latency ); captureChannels.append(audiochannel); } return 1; } int PADriver::attach() { return 1; } int PADriver::start( ) { PENTER; PaError err = Pa_StartStream( m_paStream ); if( err != paNoError ) { device->message((tr("PADriver:: PortAudio error: %1").arg(Pa_GetErrorText( err ))), AudioDevice::WARNING); Pa_Terminate(); return -1; } else { printf("PADriver:: Succesfully started portaudio stream\n"); } return 1; } int PADriver::stop( ) { PENTER; PaError err = Pa_CloseStream( m_paStream ); if( err != paNoError ) { device->message((tr("PADriver:: PortAudio error: %1").arg(Pa_GetErrorText( err ))), AudioDevice::WARNING); Pa_Terminate(); } else { printf("PADriver:: Succesfully closed portaudio stream\n\n"); } return 1; } int PADriver::process_callback (nframes_t nframes) { if (device->run_cycle( nframes, 0.0) == -1) { return paAbort; } return paContinue; } QString PADriver::get_device_name( ) { // TODO get it from portaudio ? return "AudioDevice"; } QString PADriver::get_device_longname( ) { // TODO get it from portaudio ? return "AudioDevice"; } int PADriver::_xrun_callback( void * arg ) { PADriver* driver = static_cast (arg); driver->device->xrun(); return 0; } void PADriver::_on_pa_shutdown_callback(void * arg) { Q_UNUSED(arg); } int PADriver::_process_callback( const void *inputBuffer, void *outputBuffer, unsigned long framesPerBuffer, const PaStreamCallbackTimeInfo* timeInfo, PaStreamCallbackFlags statusFlags, void *arg ) { Q_UNUSED(timeInfo); Q_UNUSED(statusFlags); PADriver* driver = static_cast (arg); driver->paInputBuffer = inputBuffer; driver->paOutputBuffer = outputBuffer; driver->process_callback (framesPerBuffer); return 0; } float PADriver::get_cpu_load( ) { return Pa_GetStreamCpuLoad(m_paStream) * 100; } //eof traverso-0.49.4/src/engine/AudioBus.cpp000644 001750 001750 00000007433 11163362147 020245 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2006 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: AudioBus.cpp,v 1.11 2008/01/21 16:22:15 r_sijrier Exp $ */ #include "AudioBus.h" #include "AudioChannel.h" #include "Mixer.h" #include "AudioDevice.h" // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" /** * \class AudioBus * A convenience class to wrap (the likley 2) AudioChannels in the well known Bus concept. * */ /** * Constructs an AudioBus instance with name \a name * @param name The name of the AudioBus * @return a new AudioBus instance */ AudioBus::AudioBus(const QString& name) : QObject() { PENTERCONS; init(name); } /** * Constructs an AudioBus instance with name \a name and channel \a channels * * This is a convenience constructor, which populates the AudioBus with \a channels AudioChannels * The buffer size of the AudioChannels is the same as the current AudioDevice::get_buffer_size() * @param name The name of the AudioBus * @param channels The number of AudioChannels to add to this AudioBus * @return a new AudioBus instance */ AudioBus::AudioBus( const QString& name, int channels ) { PENTERCONS; init(name); for(int channelNumber=0; channelNumberset_buffer_size(audiodevice().get_buffer_size()); add_channel(chan); } } void AudioBus::init(const QString& name ) { channelCount = m_monitors = 0; m_name = name; connect(&audiodevice(), SIGNAL(driverParamsChanged()), this, SLOT(resize_buffer()), Qt::DirectConnection); } AudioBus::~ AudioBus( ) { while( ! channels.isEmpty()) delete channels.takeFirst(); } /** * Add's AudioChannel \a chan to this AudioBus channel list * * This function is used by the AudioDrivers, use the convenience constructor AudioBus( QString name, int channels ) * if you want to quickly create an AudioBus with a certain amount of AudioChannels! * @param chan The AudioChannel to add. */ void AudioBus::add_channel(AudioChannel* chan) { Q_ASSERT(chan); channels.append(chan); channelCount++; } /** * Resizes all the AudioChannel buffers to the new size. * * WARNING: This is not thread save! * * @param size The new buffer size */ void AudioBus::set_buffer_size( nframes_t size ) { for (int i=0; iset_buffer_size(size); } } void AudioBus::resize_buffer( ) { set_buffer_size(audiodevice().get_buffer_size()); } /** * If set to true, all the data going through the AudioChannels in this AudioBus * will be monitored for their highest peak value. * Get the peak value with AudioChannel::get_peak_value() * @param monitor */ void AudioBus::set_monitor_peaks( bool monitor ) { if (monitor) { m_monitors++; } else { m_monitors--; } for (int i=0; iset_monitor_peaks(m_monitors); } if (m_monitors > 0) { emit monitoringPeaksStarted(); } if (m_monitors == 0) { emit monitoringPeaksStopped(); } } void AudioBus::reset_monitor_peaks() { m_monitors = 0; emit monitoringPeaksStopped(); } //eof traverso-0.49.4/src/engine/AlsaDriver.h000644 001750 001750 00000015374 11163362147 020236 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2006 Remon Sijrier (December 2005) Ported to C++ for Traverso by Remon Sijrier Copyright (C) 2001 Paul Davis This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef ALSADRIVER_H #define ALSADRIVER_H #include "Driver.h" #include #include #include #include "bitset.h" #include "defines.h" #if __BYTE_ORDER == __LITTLE_ENDIAN #define IS_LE 0 #define IS_BE 1 #elif __BYTE_ORDER == __BIG_ENDIAN #define IS_LE 1 #define IS_BE 0 #endif class AlsaDriver : public Driver { public: AlsaDriver(AudioDevice* dev, int rate, nframes_t bufferSize); ~AlsaDriver(); int start(); int stop(); int _read(nframes_t nframes); int _write(nframes_t nframes); int _null_cycle(nframes_t nframes); int _run_cycle(); int attach(); int detach(); int bufsize(nframes_t nframes); int restart(); int setup(bool capture=true, bool playback=true, const QString& pcmName="hw:0", const QString& dither="None"); QString get_device_name(); QString get_device_longname(); static QString alsa_device_name(bool longname = false, int devicenumber=0); private: void setup_io_function_pointers(); void silence_untouched_channels(nframes_t nframes); void release_channel_dependent_memory(); int configure_stream(char *device_name, const char *stream_name, snd_pcm_t *handle, snd_pcm_hw_params_t *hw_params, snd_pcm_sw_params_t *sw_params, unsigned int *nperiodsp, unsigned long *nchns, unsigned long sample_width); int set_parameters(nframes_t frames_per_cycle, nframes_t user_nperiods, nframes_t rate); int xrun_recovery(float *delayed_usecs); int reset_parameters(nframes_t frames_per_cycle, nframes_t user_nperiods, nframes_t rate); int alsa_driver_set_parameters(nframes_t frames_per_cycle, nframes_t user_nperiods, nframes_t rate); int get_channel_addresses ( snd_pcm_uframes_t *capture_avail, snd_pcm_uframes_t *playback_avail, snd_pcm_uframes_t *capture_offset, snd_pcm_uframes_t *playback_offset ); int wait(int extra_fd, int *status, float *delayed_usecs); inline void mark_channel_done (channel_t chn) { bitset_remove (channels_not_done, chn); silent[chn] = 0; } inline void silence_on_channel (channel_t chn, nframes_t nframes) { if (playback_interleaved) { memset_interleave (playback_addr[chn], 0, nframes * playback_sample_bytes, interleave_unit, playback_interleave_skip[chn]); } else { memset (playback_addr[chn], 0, nframes * playback_sample_bytes); } mark_channel_done (chn); } inline void silence_on_channel_no_mark (channel_t chn, nframes_t nframes) { if (playback_interleaved) { memset_interleave (playback_addr[chn], 0, nframes * playback_sample_bytes, interleave_unit, playback_interleave_skip[chn]); } else { memset (playback_addr[chn], 0, nframes * playback_sample_bytes); } } inline void read_from_channel (channel_t channel, audio_sample_t *buf, nframes_t nsamples) { read_via_copy (buf, capture_addr[channel], nsamples, capture_interleave_skip[channel]); } inline void write_to_channel (channel_t channel, audio_sample_t *buf, nframes_t nsamples) { write_via_copy (playback_addr[channel], buf, nsamples, playback_interleave_skip[channel], dither_state + channel); mark_channel_done (channel); } inline void copy_channel (channel_t input_channel, channel_t output_channel, nframes_t nsamples) { channel_copy ( playback_addr[output_channel], capture_addr[input_channel], nsamples * playback_sample_bytes, playback_interleave_skip[output_channel], capture_interleave_skip[input_channel]); mark_channel_done (output_channel); } typedef void (*ReadCopyFunction) ( audio_sample_t *dst, char *src, unsigned long src_bytes, unsigned long src_skip_bytes ); typedef void (*WriteCopyFunction) ( char *dst, audio_sample_t *src, unsigned long src_bytes, unsigned long dst_skip_bytes, dither_state_t *state ); typedef void (*CopyCopyFunction) ( char *dst, char *src, unsigned long src_bytes, unsigned long dst_skip_bytes, unsigned long src_skip_byte ); int poll_timeout; trav_time_t poll_last; trav_time_t poll_next; char **playback_addr; char **capture_addr; const snd_pcm_channel_area_t *capture_areas; const snd_pcm_channel_area_t *playback_areas; struct pollfd *pfd; unsigned int playback_nfds; unsigned int capture_nfds; unsigned long interleave_unit; unsigned long *capture_interleave_skip; unsigned long *playback_interleave_skip; channel_t max_nchannels; channel_t user_nchannels; channel_t playback_nchannels; channel_t capture_nchannels; unsigned long playback_sample_bytes; unsigned long capture_sample_bytes; unsigned long *silent; char *alsa_name_playback; char *alsa_name_capture; char *alsa_driver; bitset_t channels_not_done; bitset_t channels_done; snd_pcm_format_t playback_sample_format; snd_pcm_format_t capture_sample_format; float max_sample_val; unsigned long user_nperiods; unsigned int playback_nperiods; unsigned int capture_nperiods; unsigned long last_mask; snd_ctl_t *ctl_handle; snd_pcm_t *playback_handle; snd_pcm_t *capture_handle; snd_pcm_hw_params_t *playback_hw_params; snd_pcm_sw_params_t *playback_sw_params; snd_pcm_hw_params_t *capture_hw_params; snd_pcm_sw_params_t *capture_sw_params; char soft_mode; char capture_and_playback_not_synced; char playback_interleaved; char capture_interleaved; char quirk_bswap; ReadCopyFunction read_via_copy; WriteCopyFunction write_via_copy; CopyCopyFunction channel_copy; int process_count; }; #endif //eof traverso-0.49.4/src/engine/AudioChannel.h000644 001750 001750 00000004423 11163362147 020525 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2006 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: AudioChannel.h,v 1.8 2008/11/24 21:11:04 r_sijrier Exp $ */ #ifndef AUDIOCHANNEL_H #define AUDIOCHANNEL_H #include "defines.h" #include #include "Mixer.h" #include "RingBuffer.h" class RingBuffer; class AudioChannel { public: AudioChannel(const QString& busName, const QString& audioType, int flags, uint channelNumber ); ~AudioChannel(); audio_sample_t* get_buffer(nframes_t ) { hasData = true; return buf; } void set_latency(unsigned int latency); void silence_buffer(nframes_t nframes) { memset (buf, 0, sizeof (audio_sample_t) * nframes); } void set_buffer_size(nframes_t size); void set_monitor_peaks(bool monitor); uint get_number() const { return m_number; } void monitor_peaks() { float peakValue = 0; peakValue = Mixer::compute_peak( buf, bufSize, peakValue ); peaks->write( (char*)&peakValue, 1 * sizeof(audio_sample_t)); } audio_sample_t get_peak_value(); QString get_name() { return m_name; } uint get_buffer_size() { return bufSize; } private: audio_sample_t* buf; RingBuffer* peaks; uint bufSize; uint m_latency; uint m_number; int m_flags; bool hasData; bool mlocked; bool monitoring; QString m_name; QString m_audioType; friend class JackDriver; friend class AlsaDriver; friend class PADriver; friend class PulseAudioDriver; friend class Driver; friend class CoreAudioDriver; int has_data() { return hasData || monitoring; } audio_sample_t* get_data() { hasData = false; monitor_peaks(); return buf; } }; #endif //eof traverso-0.49.4/src/engine/TAudioDeviceClient.cpp000664 001750 001750 00000004320 12417543112 022164 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2006 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: Client.cpp,v 1.5 2007/06/21 14:31:10 r_sijrier Exp $ */ #include "Client.h" #include // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" /** * \class Client * \brief The Client class is used to include an Object's process callback function * into the audio processing chain of the AudioDevice's Audio Thread. * Use the set_process_callback( ProcessCallback call) to set the Objects callback function. * It's now save to add the Client to the AudioDevice, which will be done in a Thread save way, * without using any mutual exclusion mechanisms. * \sa AudioDevice::add_client(Client* client) * * @param name The name of the Client, this should be a unique name */ TAudioDeviceClient::TAudioDeviceClient(const QString& name ) { PENTERCONS; m_name = name; } TAudioDeviceClient::~ TAudioDeviceClient( ) { PENTERDES; } /** * Set this Client's process callback delegate to \a call. * * The ProcessCallback is of type FastDelegate. * * Use the convenience function MakeDelegate(this, &MyApp::process); to create a * ProcessCallback delegate. See the AudioDevice for a code example * * @param call The FastDelegate \a call to use as the callback function */ void TAudioDeviceClient::set_process_callback( ProcessCallback call) { process = call; } void TAudioDeviceClient::set_transport_control_callback(TransportControlCallback callback) { transport_control = callback; } //eof traverso-0.49.4/src/engine/AudioBus.h000644 001750 001750 00000005255 11163362147 017712 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2006 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: AudioBus.h,v 1.7 2007/06/04 20:47:16 r_sijrier Exp $ */ #ifndef AUDIOBUS_H #define AUDIOBUS_H #include #include #include #include "defines.h" #include "AudioChannel.h" class AudioBus : public QObject { Q_OBJECT public: AudioBus(const QString& name); AudioBus(const QString& name, int channelCount); ~AudioBus(); void add_channel(AudioChannel* chan); int get_channel_count() { return channelCount; } QString get_name() { return m_name; } AudioChannel* get_channel(int channelNumber); /** * Get a pointer to the buffer associated with AudioChannel \a channel * @param channel The channel number to get the buffer from * @param nframes The buffer size to get * @return */ audio_sample_t* get_buffer(int channel, nframes_t nframes) { return channels.at(channel)->get_buffer(nframes); } void set_buffer_size(nframes_t size); void set_monitor_peaks(bool monitor); void reset_monitor_peaks(); bool is_monitoring_peaks() const {return m_monitors;} void monitor_peaks() { for (int i=0; imonitor_peaks(); } } /** * Zero all AudioChannels buffers for * @param nframes size of the buffer */ void silence_buffers(nframes_t nframes) { for (int i=0; isilence_buffer(nframes); } } private: QList channels; QString deviceName; QString m_name; int channelCount; int m_monitors; void init(const QString& name); public slots: void resize_buffer(); signals: void monitoringPeaksStarted(); void monitoringPeaksStopped(); }; /** * Get the AudioChannel associated with \a channelNumber * @param channelNumber The channelNumber associated with this AudioBus's AudioChannel * @return The AudioChannel on succes, 0 on failure */ inline AudioChannel * AudioBus::get_channel( int channelNumber ) { return channels.at(channelNumber); } #endif //eof traverso-0.49.4/src/engine/sse_functions_64bit.S000644 001750 001750 00000027434 11163362147 022047 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2006 Paul Davis, John Rigg This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. Author: Sampo Savolainen 64-bit conversion: John Rigg $Id: sse_functions_64bit.S,v 1.1 2007/10/27 17:57:15 r_sijrier Exp $ */ #; void x86_sse_mix_buffers_with_gain (float *dst, float *src, unsigned int nframes, float gain); .globl x86_sse_mix_buffers_with_gain .type x86_sse_mix_buffers_with_gain,@function x86_sse_mix_buffers_with_gain: #; %rdi float *dst #; %rsi float *src #; %rdx unsigned int nframes #; %xmm0 float gain pushq %rbp movq %rsp, %rbp #; save the registers pushq %rbx pushq %rdi pushq %rsi #; if nframes == 0, go to end cmp $0, %rdx je .MBWG_END #; Check for alignment movq %rdi, %rax andq $12, %rax #; mask alignment offset movq %rsi, %rbx andq $12, %rbx #; mask alignment offset cmp %rax, %rbx jne .MBWG_NONALIGN #; if not aligned, calculate manually #; if we are aligned cmp $0, %rbx jz .MBWG_SSE #; Pre-loop, we need to run 1-3 frames "manually" without #; SSE instructions .MBWG_PRELOOP: #; gain is already in %xmm0 movss (%rsi), %xmm1 mulss %xmm0, %xmm1 addss (%rdi), %xmm1 movss %xmm1, (%rdi) addq $4, %rdi #; dst++ addq $4, %rsi #; src++ decq %rdx #; nframes-- jz .MBWG_END addq $4, %rbx cmp $16, %rbx #; test if we've reached 16 byte alignment jne .MBWG_PRELOOP .MBWG_SSE: cmp $4, %rdx #; we know it's not zero, but if it's not >=4, then jnge .MBWG_NONALIGN #; we jump straight to the "normal" code #; gain is already in %xmm0 shufps $0x00, %xmm0, %xmm0 .MBWG_SSELOOP: movaps (%rsi), %xmm1 #; source => xmm0 mulps %xmm0, %xmm1 #; apply gain to source addps (%rdi), %xmm1 #; mix with destination movaps %xmm1, (%rdi) #; copy result to destination addq $16, %rdi #; dst+=4 addq $16, %rsi #; src+=4 subq $4, %rdx #; nframes-=4 cmp $4, %rdx jge .MBWG_SSELOOP cmp $0, %rdx je .MBWG_END #; if there are remaining frames, the nonalign code will do nicely #; for the rest 1-3 frames. .MBWG_NONALIGN: #; not aligned! #; gain is already in %xmm0 .MBWG_NONALIGNLOOP: movss (%rsi), %xmm1 mulss %xmm0, %xmm1 addss (%rdi), %xmm1 movss %xmm1, (%rdi) addq $4, %rdi addq $4, %rsi decq %rdx jnz .MBWG_NONALIGNLOOP .MBWG_END: popq %rsi popq %rdi popq %rbx #; return leave ret .size x86_sse_mix_buffers_with_gain, .-x86_sse_mix_buffers_with_gain #; void x86_sse_mix_buffers_no_gain (float *dst, float *src, unsigned int nframes); .globl x86_sse_mix_buffers_no_gain .type x86_sse_mix_buffers_no_gain,@function x86_sse_mix_buffers_no_gain: #; %rdi float *dst #; %rsi float *src #; %rdx unsigned int nframes pushq %rbp movq %rsp, %rbp #; save the registers pushq %rbx pushq %rdi pushq %rsi #; the real function #; if nframes == 0, go to end cmp $0, %rdx je .MBNG_END #; Check for alignment movq %rdi, %rax andq $12, %rax #; mask alignment offset movq %rsi, %rbx andq $12, %rbx #; mask alignment offset cmp %rax, %rbx jne .MBNG_NONALIGN #; if not aligned, calculate manually cmp $0, %rbx je .MBNG_SSE #; Pre-loop, we need to run 1-3 frames "manually" without #; SSE instructions .MBNG_PRELOOP: movss (%rsi), %xmm0 addss (%rdi), %xmm0 movss %xmm0, (%rdi) addq $4, %rdi #; dst++ addq $4, %rsi #; src++ decq %rdx #; nframes-- jz .MBNG_END addq $4, %rbx cmp $16, %rbx #; test if we've reached 16 byte alignment jne .MBNG_PRELOOP .MBNG_SSE: cmp $4, %rdx #; if there are frames left, but less than 4 jnge .MBNG_NONALIGN #; we can't run SSE .MBNG_SSELOOP: movaps (%rsi), %xmm0 #; source => xmm0 addps (%rdi), %xmm0 #; mix with destination movaps %xmm0, (%rdi) #; copy result to destination addq $16, %rdi #; dst+=4 addq $16, %rsi #; src+=4 subq $4, %rdx #; nframes-=4 cmp $4, %rdx jge .MBNG_SSELOOP cmp $0, %rdx je .MBNG_END #; if there are remaining frames, the nonalign code will do nicely #; for the rest 1-3 frames. .MBNG_NONALIGN: #; not aligned! movss (%rsi), %xmm0 #; src => xmm0 addss (%rdi), %xmm0 #; xmm0 += dst movss %xmm0, (%rdi) #; xmm0 => dst addq $4, %rdi addq $4, %rsi decq %rdx jnz .MBNG_NONALIGN .MBNG_END: popq %rsi popq %rdi popq %rbx #; return leave ret .size x86_sse_mix_buffers_no_gain, .-x86_sse_mix_buffers_no_gain #; void x86_sse_apply_gain_to_buffer (float *buf, unsigned int nframes, float gain); .globl x86_sse_apply_gain_to_buffer .type x86_sse_apply_gain_to_buffer,@function x86_sse_apply_gain_to_buffer: #; %rdi float *buf 32(%rbp) #; %rsi unsigned int nframes #; %xmm0 float gain #; %xmm1 float buf[0] pushq %rbp movq %rsp, %rbp #; save %rdi pushq %rdi #; the real function #; if nframes == 0, go to end movq %rsi, %rcx #; nframes cmp $0, %rcx je .AG_END #; set up the gain buffer (gain is already in %xmm0) shufps $0x00, %xmm0, %xmm0 #; Check for alignment movq %rdi, %rdx #; buf => %rdx andq $12, %rdx #; mask bits 1 & 2, result = 0, 4, 8 or 12 jz .AG_SSE #; if buffer IS aligned #; PRE-LOOP #; we iterate 1-3 times, doing normal x87 float comparison #; so we reach a 16 byte aligned "buf" (=%rdi) value .AGLP_START: #; Load next value from the buffer into %xmm1 movss (%rdi), %xmm1 mulss %xmm0, %xmm1 movss %xmm1, (%rdi) #; increment buffer, decrement counter addq $4, %rdi #; buf++; decq %rcx #; nframes-- jz .AG_END #; if we run out of frames, we go to the end addq $4, %rdx #; one non-aligned byte less cmp $16, %rdx jne .AGLP_START #; if more non-aligned frames exist, we do a do-over .AG_SSE: #; We have reached the 16 byte aligned "buf" ("rdi") value #; Figure out how many loops we should do movq %rcx, %rax #; copy remaining nframes to %rax for division movq $0, %rdx #; 0 the edx register pushq %rdi movq $4, %rdi divq %rdi #; %rdx = remainder == 0 popq %rdi #; %rax = SSE iterations cmp $0, %rax je .AGPOST_START .AGLP_SSE: movaps (%rdi), %xmm1 mulps %xmm0, %xmm1 movaps %xmm1, (%rdi) addq $16, %rdi subq $4, %rcx #; nframes-=4 decq %rax jnz .AGLP_SSE #; Next we need to post-process all remaining frames #; the remaining frame count is in %rcx #; if no remaining frames, jump to the end cmp $0, %rcx andq $3, %rcx #; nframes % 4 je .AG_END .AGPOST_START: movss (%rdi), %xmm1 mulss %xmm0, %xmm1 movss %xmm1, (%rdi) #; increment buffer, decrement counter addq $4, %rdi #; buf++; decq %rcx #; nframes-- jnz .AGPOST_START #; if we run out of frames, we go to the end .AG_END: popq %rdi #; return leave ret .size x86_sse_apply_gain_to_buffer, .-x86_sse_apply_gain_to_buffer #; end proc #; x86_sse_apply_gain_vector(float *buf, float *gain_vector, unsigned int nframes) .globl x86_sse_apply_gain_vector .type x86_sse_apply_gain_vector,@function x86_sse_apply_gain_vector: #; %rdi float *buf #; %rsi float *gain_vector #; %rdx unsigned int nframes pushq %rbp movq %rsp, %rbp #; Save registers pushq %rdi pushq %rsi pushq %rbx #; if nframes == 0 go to end cmp $0, %rdx je .AGA_END #; Check alignment movq %rdi, %rax andq $12, %rax movq %rsi, %rbx andq $12, %rbx cmp %rax,%rbx jne .AGA_ENDLOOP cmp $0, %rax jz .AGA_SSE #; if buffers are aligned, jump to the SSE loop #; Buffers aren't 16 byte aligned, but they are unaligned by the same amount .AGA_ALIGNLOOP: movss (%rdi), %xmm0 #; buf => xmm0 movss (%rsi), %xmm1 #; gain value => xmm1 mulss %xmm1, %xmm0 #; xmm1 * xmm0 => xmm0 movss %xmm0, (%rdi) #; signal with gain => buf decq %rdx jz .AGA_END addq $4, %rdi #; buf++ addq $4, %rsi #; gab++ addq $4, %rax cmp $16, %rax jne .AGA_ALIGNLOOP #; There are frames left for sure, as that is checked in the beginning #; and within the previous loop. BUT, there might be less than 4 frames #; to process .AGA_SSE: movq %rdx, %rax #; nframes => %rax shr $2, %rax #; unsigned divide by 4 cmp $0, %rax #; Jos toimii ilman t�t�, niin kiva je .AGA_ENDLOOP .AGA_SSELOOP: movaps (%rdi), %xmm0 movaps (%rsi), %xmm1 mulps %xmm1, %xmm0 movaps %xmm0, (%rdi) addq $16, %rdi addq $16, %rsi decq %rax jnz .AGA_SSELOOP andq $3, %rdx #; Remaining frames are nframes & 3 jz .AGA_END #; Inside this loop, we know there are frames left to process #; but because either there are < 4 frames left, or the buffers #; are not aligned, we can't use the parallel SSE ops .AGA_ENDLOOP: movss (%rdi), %xmm0 #; buf => xmm0 movss (%rsi), %xmm1 #; gain value => xmm1 mulss %xmm1, %xmm0 #; xmm1 * xmm0 => xmm0 movss %xmm0, (%rdi) #; signal with gain => buf addq $4,%rdi addq $4,%rsi decq %rdx #; nframes-- jnz .AGA_ENDLOOP .AGA_END: popq %rbx popq %rsi popq %rdi leave ret .size x86_sse_apply_gain_vector, .-x86_sse_apply_gain_vector #; end proc #; float x86_sse_compute_peak(float *buf, long nframes, float current); .globl x86_sse_compute_peak .type x86_sse_compute_peak,@function x86_sse_compute_peak: #; %rdi float *buf 32(%rbp) #; %rsi unsigned int nframes #; %xmm0 float current #; %xmm1 float buf[0] pushq %rbp movq %rsp, %rbp #; save %rdi pushq %rdi #; if nframes == 0, go to end movq %rsi, %rcx #; nframes cmp $0, %rcx je .CP_END #; create the "abs" mask in %xmm2 pushq $2147483647 movss (%rsp), %xmm2 addq $8, %rsp shufps $0x00, %xmm2, %xmm2 #; Check for alignment #;movq 8(%rbp), %rdi #; buf movq %rdi, %rdx #; buf => %rdx andq $12, %rdx #; mask bits 1 & 2, result = 0, 4, 8 or 12 jz .CP_SSE #; if buffer IS aligned #; PRE-LOOP #; we iterate 1-3 times, doing normal x87 float comparison #; so we reach a 16 byte aligned "buf" (=%rdi) value .LP_START: #; Load next value from the buffer movss (%rdi), %xmm1 andps %xmm2, %xmm1 maxss %xmm1, %xmm0 #; increment buffer, decrement counter addq $4, %rdi #; buf++; decq %rcx #; nframes-- jz .CP_END #; if we run out of frames, we go to the end addq $4, %rdx #; one non-aligned byte less cmp $16, %rdx jne .LP_START #; if more non-aligned frames exist, we do a do-over .CP_SSE: #; We have reached the 16 byte aligned "buf" ("rdi") value #; Figure out how many loops we should do movq %rcx, %rax #; copy remaining nframes to %rax for division shr $2,%rax #; unsigned divide by 4 jz .POST_START #; %rax = SSE iterations #; current maximum is at %xmm0, but we need to .. shufps $0x00, %xmm0, %xmm0 #; shuffle "current" to all 4 FP's #;prefetcht0 16(%rdi) .LP_SSE: movaps (%rdi), %xmm1 andps %xmm2, %xmm1 maxps %xmm1, %xmm0 addq $16, %rdi decq %rax jnz .LP_SSE #; Calculate the maximum value contained in the 4 FP's in %xmm0 movaps %xmm0, %xmm1 shufps $0x4e, %xmm1, %xmm1 #; shuffle left & right pairs (1234 => 3412) maxps %xmm1, %xmm0 #; maximums of the two pairs movaps %xmm0, %xmm1 shufps $0xb1, %xmm1, %xmm1 #; shuffle the floats inside the two pairs (1234 => 2143) maxps %xmm1, %xmm0 #; now every float in %xmm0 is the same value, current maximum value #; Next we need to post-process all remaining frames #; the remaining frame count is in %rcx #; if no remaining frames, jump to the end andq $3, %rcx #; nframes % 4 jz .CP_END .POST_START: movss (%rdi), %xmm1 andps %xmm2, %xmm1 maxss %xmm1, %xmm0 addq $4, %rdi #; buf++; decq %rcx #; nframes--; jnz .POST_START .CP_END: popq %rdi #; return leave ret .size x86_sse_compute_peak, .-x86_sse_compute_peak #; end proc #ifdef __ELF__ .section .note.GNU-stack,"",%progbits #endif traverso-0.49.4/src/engine/Client.h000644 001750 001750 00000002543 12417542755 017422 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: Client.h,v 1.7 2007/11/19 11:18:54 r_sijrier Exp $ */ #ifndef CLIENT_H #define CLIENT_H #include #include #include "APILinkedList.h" #include "defines.h" class TAudioDeviceClient : public QObject, public APILinkedListNode { Q_OBJECT public: TAudioDeviceClient(const QString& name); ~TAudioDeviceClient(); void set_process_callback(ProcessCallback call); void set_transport_control_callback(TransportControlCallback call); bool is_smaller_then(APILinkedListNode* ) {return false;} ProcessCallback process; TransportControlCallback transport_control; QString m_name; }; #endif //eof traverso-0.49.4/src/engine/AudioDevice.h000644 001750 001750 00000016500 12417542747 020364 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2008 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef AUDIODEVICE_H #define AUDIODEVICE_H #include #include #include #include #include #include #include #include #include "RingBufferNPT.h" #include "APILinkedList.h" #include "defines.h" class AudioDeviceThread; class Driver; class TAudioDeviceClient; class AudioChannel; class AudioBus; #if defined (JACK_SUPPORT) class JackDriver; #endif #if defined (COREAUDIO_SUPPORT) class CoreAudioDriver; #endif class AudioDevice : public QObject { Q_OBJECT public: void set_parameters( int rate, nframes_t bufferSize, const QString& driverType, bool capture=true, bool playback=true, const QString& device="hw:0", const QString& ditherShape="None"); void add_client(TAudioDeviceClient* client); void remove_client(TAudioDeviceClient* client); void transport_start(TAudioDeviceClient* client); void transport_stop(TAudioDeviceClient* client); int transport_seek_to(TAudioDeviceClient* client, TimeRef location); /** * Get the Playback AudioBus instance with name \a name. * You can use this for example in your callback function to get a Playback Bus, * and mix audiodata into the Buses' buffers. * \sa get_playback_buses_names(), AudioBus::get_buffer() * * @param name The name of the Playback Bus * @return An AudioBus if one exists with name \a name, 0 on failure */ AudioBus* get_playback_bus(QByteArray name) const { return playbackBuses.value(name); } /** * Get the Capture AudioBus instance with name \a name. * You can use this for example in your callback function to get a Capture Bus, * and read the audiodata from the Buses' buffers. * \sa AudioBus::get_buffer(), get_capture_buses_names() * * @param name The name of the Capture Bus * @return An AudioBus if one exists with name \a name, 0 on failure */ AudioBus* get_capture_bus(QByteArray name) const { return captureBuses.value(name); } QStringList get_capture_buses_names() const; QStringList get_playback_buses_names() const; QString get_device_name() const; QString get_device_longname() const; QString get_driver_type() const; QStringList get_available_drivers() const; uint get_sample_rate() const; uint get_bit_depth() const; TimeRef get_buffer_latency(); /** * * @return The period buffer size, as used by the Audio Driver. */ nframes_t get_buffer_size() const { return m_bufferSize; } void show_descriptors(); void set_driver_properties(QHash& properties); int shutdown(); uint capture_buses_count() const; uint playback_buses_count() const; trav_time_t get_cpu_time(); private: AudioDevice(); ~AudioDevice(); AudioDevice(const AudioDevice&) : QObject() {} // allow this function to create one instance friend AudioDevice& audiodevice(); friend class AlsaDriver; friend class PADriver; friend class Driver; friend class PulseAudioDriver; friend class AudioDeviceThread; #if defined (COREAUDIO_SUPPORT) friend class CoreAudioDriver; #endif Driver* driver; AudioDeviceThread* audioThread; APILinkedList m_clients; QHash playbackChannels; QHash captureChannels; QHash playbackBuses; QHash captureBuses; QStringList availableDrivers; QTimer m_xrunResetTimer; #if defined (JACK_SUPPORT) QTimer jackShutDownChecker; JackDriver* slaved_jack_driver(); friend class JackDriver; #endif RingBufferNPT* m_cpuTime; volatile size_t m_runAudioThread; trav_time_t m_cycleStartTime; trav_time_t m_lastCpuReadTime; uint m_bufferSize; uint m_rate; uint m_bitdepth; uint m_xrunCount; QString m_driverType; QString m_ditherShape; QHash m_driverProperties; int run_one_cycle(nframes_t nframes, float delayed_usecs); int create_driver(QString driverType, bool capture, bool playback, const QString& cardDevice); int transport_control(transport_state_t state); void setup_buses(); void post_process(); void free_memory(); // These are reserved for Driver Objects only!! AudioChannel* register_capture_channel(const QByteArray& busName, const QString& audioType, int flags, uint bufferSize, uint channel ); AudioChannel* register_playback_channel(const QByteArray& busName, const QString& audioType, int flags, uint bufferSize, uint channel ); int run_cycle(nframes_t nframes, float delayed_usecs); void set_buffer_size(uint size); void set_sample_rate(uint rate); void set_bit_depth(uint depth); void delay(float delay); void transport_cycle_start(trav_time_t time) { m_cycleStartTime = time; } void transport_cycle_end(trav_time_t time) { trav_time_t runcycleTime = time - m_cycleStartTime; m_cpuTime->write(&runcycleTime, 1); } Driver* get_driver() const {return driver;} void mili_sleep(int msec); void xrun(); size_t run_audio_thread() const; enum { INFO = 0, WARNING = 1, CRITICAL = 2 }; QVariant get_driver_property(const QString& property, QVariant defaultValue); signals: /** * The stopped() signal is emited just before the AudioDeviceThread will be stopped. * Connect this signal to all Objects that have a pointer to an AudioBus (For example a VU meter), * since all he Buses will be deleted, and new ones created when the AudioDevice re-inits * the AudioDriver. */ void stopped(); /** * The started() signal is emited ones the AudioThread and AudioDriver have been succesfully * setup. */ void started(); /** * The driverParamsChanged() signal is emited just before the started() signal, you should * connect all objects to this signal who need a pointer to one of the AudioBuses supplied by * the AudioDevice! */ void driverParamsChanged(); /** * Connect this signal to any Object who need to be informed about buffer under/overruns */ void bufferUnderRun(); /** * This signal will be emited after succesfull Client removal from within the GUI Thread! * @param The Client \a client which as been removed from the AudioDevice */ void clientRemoved(TAudioDeviceClient*); void xrunStormDetected(); void message(QString, int); private slots: void private_add_client(TAudioDeviceClient* client); void private_remove_client(TAudioDeviceClient* client); void audiothread_finished(); void switch_to_null_driver(); void reset_xrun_counter() {m_xrunCount = 0;} void check_jack_shutdown(); }; // use this function to get the audiodevice object AudioDevice& audiodevice(); inline size_t AudioDevice::run_audio_thread( ) const {return m_runAudioThread;} #endif //eof traverso-0.49.4/src/engine/Client.cpp000644 001750 001750 00000004320 12417542754 017747 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2006 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: Client.cpp,v 1.5 2007/06/21 14:31:10 r_sijrier Exp $ */ #include "Client.h" #include // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" /** * \class Client * \brief The Client class is used to include an Object's process callback function * into the audio processing chain of the AudioDevice's Audio Thread. * Use the set_process_callback( ProcessCallback call) to set the Objects callback function. * It's now save to add the Client to the AudioDevice, which will be done in a Thread save way, * without using any mutual exclusion mechanisms. * \sa AudioDevice::add_client(Client* client) * * @param name The name of the Client, this should be a unique name */ TAudioDeviceClient::TAudioDeviceClient(const QString& name ) { PENTERCONS; m_name = name; } TAudioDeviceClient::~ TAudioDeviceClient( ) { PENTERDES; } /** * Set this Client's process callback delegate to \a call. * * The ProcessCallback is of type FastDelegate. * * Use the convenience function MakeDelegate(this, &MyApp::process); to create a * ProcessCallback delegate. See the AudioDevice for a code example * * @param call The FastDelegate \a call to use as the callback function */ void TAudioDeviceClient::set_process_callback( ProcessCallback call) { process = call; } void TAudioDeviceClient::set_transport_control_callback(TransportControlCallback callback) { transport_control = callback; } //eof traverso-0.49.4/src/engine/JackDriver.cpp000644 001750 001750 00000022746 11163362147 020562 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: JackDriver.cpp,v 1.24 2007/12/07 13:21:49 r_sijrier Exp $ */ #include "JackDriver.h" #include #if defined (ALSA_SUPPORT) #include "AlsaDriver.h" #endif #include "AudioDevice.h" #include "AudioChannel.h" // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" JackDriver::JackDriver( AudioDevice * dev , int rate, nframes_t bufferSize) : Driver(dev, rate, bufferSize) { read = MakeDelegate(this, &JackDriver::_read); write = MakeDelegate(this, &JackDriver::_write); run_cycle = RunCycleCallback(this, &JackDriver::_run_cycle); m_running = false; } JackDriver::~JackDriver( ) { PENTER; if (m_running == 0) { jack_client_close (client); } } int JackDriver::_read( nframes_t nframes ) { int portNumber = 0; for (int i=0; ihas_data()) { portNumber++; continue; } memcpy (chan->get_data(), jack_port_get_buffer (inputPorts[portNumber], nframes), sizeof (jack_default_audio_sample_t) * nframes); portNumber++; } return 1; } int JackDriver::_write( nframes_t nframes ) { int portNumber = 0; for (int i=0; ihas_data()) { portNumber++; continue; }*/ memcpy ( jack_port_get_buffer (outputPorts[portNumber], nframes), chan->get_data(), sizeof (jack_default_audio_sample_t) * nframes); chan->silence_buffer(nframes); portNumber++; } return 1; } int JackDriver::setup(bool capture, bool playback, const QString& ) { PENTER; Q_UNUSED(capture); Q_UNUSED(playback); const char **inputports; const char **outputports; const char *client_name = "Traverso"; // const char *server_name = NULL; int inputPortCount = 0; int outputPortCount = 0; client = 0; AudioChannel* channel; char buf[32]; int port_flags; capture_frame_latency = playback_frame_latency =0; printf("Connecting to the Jack server...\n"); if ( (client = jack_client_new (client_name)) == NULL) { device->message(tr("Jack Driver: Couldn't connect to the jack server, is jack running?"), AudioDevice::WARNING); return -1; } /*********** INPUT PORTS STUFF *************/ /******************************************/ //Get all the input ports of Jack if ((inputports = jack_get_ports (client, NULL, NULL, JackPortIsPhysical|JackPortIsInput)) == 0) { inputPorts = 0; } if (inputports) { for (inputPortCount = 0; inputports[inputPortCount]; ++inputPortCount) ; free (inputports); } inputPorts = (jack_port_t **) malloc (sizeof (jack_port_t *) * inputPortCount); for (int i = 0; i < inputPortCount; i++) { char name[64]; sprintf (name, "input_%d", i+1); if ((inputPorts[i] = jack_port_register (client, name, JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0)) == 0) { fprintf (stderr, "cannot register input port \"%s\"!\n", name); jack_client_close (client); return -1; } } /*********** OUTPUT PORTS STUFF *************/ /******************************************/ //Get all the input ports of Jack if ((outputports = jack_get_ports (client, NULL, NULL, JackPortIsPhysical|JackPortIsOutput)) == 0) { outputPorts = 0; } if (outputports) { for (outputPortCount = 0; outputports[outputPortCount]; ++outputPortCount) ; free (outputports); } outputPorts = (jack_port_t **) malloc (sizeof (jack_port_t *) * outputPortCount); for (int i = 0; i < outputPortCount; i++) { char name[64]; sprintf (name, "output_%d", i+1); if ((outputPorts[i] = jack_port_register (client, name, JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0)) == 0) { fprintf (stderr, "cannot register output port \"%s\"!\n", name); jack_client_close (client); return -1; } } port_flags = PortIsInput|PortIsPhysical|PortIsTerminal; for (int chn = 0; chn < inputPortCount; chn++) { snprintf (buf, sizeof(buf) - 1, "capture_%d", chn+1); channel = device->register_capture_channel(buf, JACK_DEFAULT_AUDIO_TYPE, port_flags, frames_per_cycle, chn); channel->set_latency( frames_per_cycle + capture_frame_latency ); captureChannels.append(channel); } port_flags = PortIsOutput|PortIsPhysical|PortIsTerminal; for (int chn = 0; chn < outputPortCount; chn++) { snprintf (buf, sizeof(buf) - 1, "playback_%d", chn+1); channel = device->register_playback_channel(buf, JACK_DEFAULT_AUDIO_TYPE, port_flags, frames_per_cycle, chn); channel->set_latency( frames_per_cycle + capture_frame_latency ); playbackChannels.append(channel); } device->set_buffer_size( jack_get_buffer_size(client) ); device->set_sample_rate (jack_get_sample_rate(client)); jack_set_process_callback (client, _process_callback, this); jack_set_xrun_callback (client, _xrun_callback, this); jack_set_buffer_size_callback (client, _bufsize_callback, this); jack_on_shutdown(client, _on_jack_shutdown_callback, this); update_config(); device->message(tr("Jack Driver: Connected successfully to the jack server!"), AudioDevice::INFO); return 1; } int JackDriver::attach( ) { PENTER; return 1; } int JackDriver::start( ) { PENTER; if (jack_activate (client)) { //if jack_active() != 0, something went wrong! return -1; } m_running = 1; return 1; } int JackDriver::stop( ) { PENTER; m_running = 0; return 1; } int JackDriver::process_callback (nframes_t nframes) { jack_position_t pos; jack_transport_state_t state = jack_transport_query (client, &pos); transport_state_t tranportstate; tranportstate.tranport = state; tranportstate.location = TimeRef(pos.frame, audiodevice().get_sample_rate()); tranportstate.realtime = true; device->transport_control(tranportstate); device->run_cycle( nframes, 0.0); return 0; } int JackDriver::jack_sync_callback (jack_transport_state_t state, jack_position_t* pos) { transport_state_t tranportstate; tranportstate.tranport = state; tranportstate.location = TimeRef(pos->frame, audiodevice().get_sample_rate()); tranportstate.isSlave = true; tranportstate.realtime = true; return device->transport_control(tranportstate); } // Is there a way to get the device name from Jack? Can't find it :-( // Since Jack uses ALSA, we ask it from ALSA directly :-) QString JackDriver::get_device_name( ) { #if defined (ALSA_SUPPORT) return AlsaDriver::alsa_device_name(false); #endif return "AudioDevice"; } QString JackDriver::get_device_longname( ) { #if defined (ALSA_SUPPORT) return AlsaDriver::alsa_device_name(true); #endif return "AudioDevice"; } int JackDriver::_xrun_callback( void * arg ) { JackDriver* driver = static_cast (arg); if (driver->m_running) { driver->device->xrun(); } return 0; } int JackDriver::_process_callback (nframes_t nframes, void *arg) { JackDriver* driver = static_cast (arg); if (!driver->m_running) { return 0; } return driver->process_callback (nframes); } int JackDriver::_bufsize_callback( nframes_t nframes, void * arg ) { JackDriver* driver = static_cast (arg); driver->device->set_buffer_size( nframes ); emit driver->device->driverParamsChanged(); return 0; } float JackDriver::get_cpu_load( ) { return jack_cpu_load(client); } void JackDriver::_on_jack_shutdown_callback( void * arg ) { JackDriver* driver = static_cast (arg); driver->m_running = -1; } int JackDriver::_jack_sync_callback (jack_transport_state_t state, jack_position_t* pos, void* arg) { return static_cast (arg)->jack_sync_callback (state, pos); } void JackDriver::update_config() { m_isSlave = device->get_driver_property("jackslave", false).toBool(); if (m_isSlave) { jack_set_sync_callback (client, _jack_sync_callback, this); } else { jack_set_sync_callback(client, NULL, this); } } //eof traverso-0.49.4/src/engine/JackDriver.h000644 001750 001750 00000004472 11163362147 020223 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: JackDriver.h,v 1.9 2007/10/20 17:38:19 r_sijrier Exp $ */ #ifndef JACKDRIVER_H #define JACKDRIVER_H #include "Driver.h" #include "defines.h" #include #include class JackDriver : public Driver { Q_OBJECT public: JackDriver(AudioDevice* dev, int rate, nframes_t bufferSize); ~JackDriver(); int process_callback (nframes_t nframes); int _read(nframes_t nframes); int _write(nframes_t nframes); int _run_cycle() {return 1;} int setup(bool capture=true, bool playback=true, const QString& cardDevice="hw:0"); int attach(); int start(); int stop(); QString get_device_name(); QString get_device_longname(); float get_cpu_load(); size_t is_jack_running() const {return m_running == 1;} jack_client_t* get_client() const {return client;} bool is_slave() const {return m_isSlave;} void update_config(); private: volatile size_t m_running; jack_client_t* client; jack_port_t** inputPorts; jack_port_t** outputPorts; bool m_isSlave; int jack_sync_callback (jack_transport_state_t, jack_position_t*); static int _xrun_callback(void *arg); static int _process_callback (nframes_t nframes, void *arg); static int _bufsize_callback(jack_nframes_t nframes, void *arg); static void _on_jack_shutdown_callback(void* arg); static int _jack_sync_callback (jack_transport_state_t, jack_position_t*, void *arg); signals: void jackShutDown(); }; #endif //eof traverso-0.49.4/src/sheetcanvas/000755 001750 001750 00000000000 12357335671 017066 5ustar00remonremon000000 000000 traverso-0.49.4/src/sheetcanvas/TrackView.cpp000755 001750 001750 00000013375 11163362147 021475 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include #include #include #include "TrackView.h" #include "AudioClipView.h" #include "PluginChainView.h" #include "Themer.h" #include "TrackPanelViewPort.h" #include "SheetView.h" #include "TrackPanelView.h" #include #include #include #include #include #include #include TrackView::TrackView(SheetView* sv, Track * track) : ViewItem(0, track) { PENTERCONS; setZValue(sv->zValue() + 1); m_sv = sv; sv->scene()->addItem(this); load_theme_data(); m_track = track; setFlags(ItemIsSelectable | ItemIsMovable); setCursor(themer()->get_cursor("Track")); m_panel = new TrackPanelView(this); calculate_bounding_rect(); m_pluginChainView = new PluginChainView(m_sv, this, m_track->get_plugin_chain()); connect(m_track, SIGNAL(audioClipAdded(AudioClip*)), this, SLOT(add_new_audioclipview(AudioClip*))); connect(m_track, SIGNAL(audioClipRemoved(AudioClip*)), this, SLOT(remove_audioclipview(AudioClip*))); foreach(AudioClip* clip, m_track->get_cliplist()) { add_new_audioclipview(clip); } } TrackView:: ~ TrackView( ) { } void TrackView::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) { Q_UNUSED(widget); // printf("TrackView:: PAINT :: exposed rect is: x=%f, y=%f, w=%f, h=%f\n", option->exposedRect.x(), option->exposedRect.y(), option->exposedRect.width(), option->exposedRect.height()); int xstart = (int)option->exposedRect.x(); int pixelcount = (int)option->exposedRect.width(); if (m_topborderwidth > 0) { QColor color = themer()->get_color("Track:cliptopoffset"); painter->fillRect(xstart, 0, pixelcount+1, m_topborderwidth, color); } if (m_paintBackground) { QColor color = themer()->get_color("Track:background"); painter->fillRect(xstart, m_topborderwidth, pixelcount+1, m_track->get_height() - m_bottomborderwidth, color); } if (m_bottomborderwidth > 0) { QColor color = themer()->get_color("Track:clipbottomoffset"); painter->fillRect(xstart, m_track->get_height() - m_bottomborderwidth, pixelcount+1, m_bottomborderwidth, color); } } void TrackView::add_new_audioclipview( AudioClip * clip ) { PENTER; AudioClipView* clipView = new AudioClipView(m_sv, this, clip); m_clipViews.append(clipView); } void TrackView::remove_audioclipview( AudioClip * clip ) { PENTER; foreach(AudioClipView* view, m_clipViews) { if (view->get_clip() == clip) { m_clipViews.removeAll(view); scene()->removeItem(view); delete view; return; } } } Track* TrackView::get_track( ) const { return m_track; } TrackPanelView * TrackView::get_trackpanel_view() const { return m_panel; } int TrackView::get_childview_y_offset() const { return m_topborderwidth + m_cliptopmargin; } void TrackView::move_to( int x, int y ) { Q_UNUSED(x); setPos(0, y); m_panel->setPos(-200, y); } int TrackView::get_height( ) { return m_track->get_height() - (m_topborderwidth + m_bottomborderwidth + m_clipbottommargin + m_cliptopmargin); } Command* TrackView::edit_properties( ) { bool ok; QString text = QInputDialog::getText(m_sv->get_trackpanel_view_port()->viewport(), tr("Set Track name"), tr("Enter new Track name"), QLineEdit::Normal, m_track->get_name(), &ok); if (ok && !text.isEmpty()) { m_track->set_name(text); } return (Command*) 0; } Command* TrackView::add_new_plugin( ) { PluginSelectorDialog::instance()->set_description(tr("Track %1: %2") .arg(m_track->get_sort_index()+1).arg(m_track->get_name())); if (PluginSelectorDialog::instance()->exec() == QDialog::Accepted) { Plugin* plugin = PluginSelectorDialog::instance()->get_selected_plugin(); if (plugin) { // Force showing into effects mode, just in case the user adds // a plugin in edit mode, which means it won't show up! m_sv->get_sheet()->set_effects_mode(); return m_track->add_plugin(plugin); } } return 0; } void TrackView::set_height( int height ) { m_height = height; } void TrackView::calculate_bounding_rect() { prepareGeometryChange(); m_boundingRect = QRectF(0, 0, MAX_CANVAS_WIDTH, m_track->get_height()); m_panel->calculate_bounding_rect(); ViewItem::calculate_bounding_rect(); } void TrackView::load_theme_data() { m_paintBackground = themer()->get_property("Track:paintbackground").toInt(); m_topborderwidth = themer()->get_property("Track:topborderwidth").toInt(); m_bottomborderwidth = themer()->get_property("Track:bottomborderwidth").toInt(); m_cliptopmargin = themer()->get_property("Track:cliptopmargin").toInt(); m_clipbottommargin = themer()->get_property("Track:clipbottommargin").toInt(); } Command* TrackView::select_bus() { Interface::instance()->show_busselector(m_track); return 0; } Command* TrackView::insert_silence() { Interface::instance()->show_insertsilence_dialog(); Interface::instance()->set_insertsilence_track(m_track); return 0; } void TrackView::to_front(AudioClipView * view) { foreach(AudioClipView* clipview, m_clipViews) { clipview->setZValue(zValue() + 1); } view->setZValue(zValue() + 2); } traverso-0.49.4/src/sheetcanvas/CMakeLists.txt000644 001750 001750 00000003257 11163362147 021625 0ustar00remonremon000000 000000 INCLUDE_DIRECTORIES( ${CMAKE_SOURCE_DIR}/src/commands ${CMAKE_SOURCE_DIR}/src/common ${CMAKE_SOURCE_DIR}/src/core ${CMAKE_SOURCE_DIR}/src/engine ${CMAKE_SOURCE_DIR}/src/plugins ${CMAKE_SOURCE_DIR}/src/plugins/native ${CMAKE_SOURCE_DIR}/src/plugins/LV2 ${CMAKE_SOURCE_DIR}/src/3rdparty/slv2 ${CMAKE_SOURCE_DIR}/src/traverso ${CMAKE_SOURCE_DIR}/src/traverso/dialogs ${QT_QTGUI_INCLUDE_DIR} ${QT_QTXML_INCLUDE_DIR} ) # IF(HAVE_OPENGL) # INCLUDE_DIRECTORIES( # ${QT_QTOPENGL_INCLUDE_DIR} # ) # ENDIF(HAVE_OPENGL) SET(TRAVERSO_SONGCANVAS_SOURCES AudioClipView.cpp ClipsViewPort.cpp Cursors.cpp CurveNodeView.cpp CurveView.cpp FadeView.cpp MarkerView.cpp PluginChainView.cpp PluginView.cpp PositionIndicator.cpp SheetView.cpp SheetWidget.cpp TimeLineView.cpp TimeLineViewPort.cpp TrackPanelView.cpp TrackPanelViewPort.cpp TrackView.cpp ViewItem.cpp dialogs/AudioClipEditDialog.cpp ) SET(TRAVERSO_SONGCANVAS_MOC_CLASSES AudioClipView.h ClipsViewPort.h Cursors.h CurveNodeView.h FadeView.h MarkerView.h PluginChainView.h PluginView.h PositionIndicator.h TrackView.h ViewItem.h dialogs/AudioClipEditDialog.h CurveView.h SheetView.h SheetWidget.h TrackPanelView.h TimeLineView.h LineView.h ) SET(TRAVERSO_SONGCANVAS_UI_FILES ui/AudioClipEditDialog.ui ) QT4_WRAP_CPP(TRAVERSO_SONGCANVAS_MOC_SOURCES ${TRAVERSO_SONGCANVAS_MOC_CLASSES}) QT4_WRAP_UI(TRAVERSO_SONGCANVAS_UI_SOURCES ${TRAVERSO_SONGCANVAS_UI_FILES}) SET(TRAVERSO_SONGCANVAS_LIBRARY "traversosheetcanvas") ADD_LIBRARY(${TRAVERSO_SONGCANVAS_LIBRARY} STATIC ${TRAVERSO_SONGCANVAS_SOURCES} ${TRAVERSO_SONGCANVAS_MOC_SOURCES} ${TRAVERSO_SONGCANVAS_UI_SOURCES} ) IF(USE_PCH) ADD_DEPENDENCIES(traversosheetcanvas precompiled_headers) ENDIF(USE_PCH) traverso-0.49.4/src/sheetcanvas/TimeLineViewPort.h000644 001750 001750 00000002741 11163362147 022441 0ustar00remonremon000000 000000 /* Copyright (C) 2006 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: TimeLineViewPort.h,v 1.2 2009/01/19 21:07:19 r_sijrier Exp $ */ #ifndef TIME_LINE_VIEW_PORT_H #define TIME_LINE_VIEW_PORT_H #include "ViewPort.h" class SheetWidget; class SheetView; class TimeLineView; #define TIMELINE_HEIGHT 32 class TimeLineViewPort : public ViewPort { public: TimeLineViewPort(QGraphicsScene* scene, SheetWidget* sw); ~TimeLineViewPort(); void set_sheetview(SheetView* view); void scale_factor_changed(); TimeLineView* get_timeline_view() const {return m_timeLineView;} void get_pointed_context_items(QList &list); protected: void wheelEvent ( QWheelEvent * e ); private: SheetView* m_sv; TimeLineView* m_timeLineView; }; #endif //eof traverso-0.49.4/src/sheetcanvas/precompile.h000644 001750 001750 00000001121 11163362147 021361 0ustar00remonremon000000 000000 #include #include #include // All moc genereated code has this include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include traverso-0.49.4/src/sheetcanvas/ClipsViewPort.cpp000644 001750 001750 00000013225 11163362147 022337 0ustar00remonremon000000 000000 /* Copyright (C) 2006-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "ClipsViewPort.h" #include "SheetWidget.h" #include "SheetView.h" #include "TrackView.h" #include "ViewItem.h" #include #include #include #include "RemoveClip.h" #include "AudioDevice.h" #include #include #include #include #include #include #include ClipsViewPort::ClipsViewPort(QGraphicsScene* scene, SheetWidget* sw) : ViewPort(scene, sw) { m_sw = sw; viewport()->setAttribute(Qt::WA_OpaquePaintEvent); // setViewportUpdateMode(SmartViewportUpdate); setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); } void ClipsViewPort::get_pointed_context_items(QList &list) { QList itemlist = items(cpointer().on_first_input_event_x(), cpointer().on_first_input_event_y()); foreach(QGraphicsItem* item, itemlist) { if (ViewItem::is_viewitem(item)) { list.append((ViewItem*)item); } } list.append(m_sw->get_sheetview()); } void ClipsViewPort::resizeEvent( QResizeEvent * e ) { ViewPort::resizeEvent(e); m_sw->get_sheetview()->clipviewport_resize_event(); } void ClipsViewPort::paintEvent(QPaintEvent * e) { QGraphicsView::paintEvent(e); } void ClipsViewPort::dragEnterEvent( QDragEnterEvent * event ) { m_imports.clear(); m_resourcesImport.clear(); // let's see if the D&D was from the resources bin. if (event->mimeData()->hasFormat("application/x-qabstractitemmodeldatalist")) { QByteArray encodedData = event->mimeData()->data("application/x-qabstractitemmodeldatalist"); QDataStream stream(&encodedData, QIODevice::ReadOnly); int r, c; QMap v; while (!stream.atEnd()) { stream >> r >> c >> v; qint64 id = v.value(Qt::UserRole).toLongLong(); if (!id) { continue; } m_resourcesImport.append(id); } } // and who knows, it could have been a D&D drop from a filemanager... if (event->mimeData()->hasUrls()) { foreach(QUrl url, event->mimeData()->urls()) { QString fileName = url.toLocalFile(); if (fileName.isEmpty()) { continue; } Import* import = new Import(fileName); m_imports.append(import); // If a readsource fails to init, the D&D should be // marked as failed, cleanup allready created imports, // and clear the import list. if (import->create_readsource() == -1) { foreach(Import* import, m_imports) { delete import; } m_imports.clear(); break; } } } if (m_imports.size() || m_resourcesImport.size()) { event->acceptProposedAction(); } } void ClipsViewPort::dropEvent(QDropEvent* event ) { PENTER; Q_UNUSED(event) if (!importTrack) { return; } CommandGroup* group = new CommandGroup(m_sw->get_sheet(), tr("Import %n audiofile(s)", "", m_imports.size() + m_resourcesImport.size()), true); TimeRef startpos = TimeRef(mapFromGlobal(QCursor::pos()).x() * m_sw->get_sheetview()->timeref_scalefactor); foreach(qint64 id, m_resourcesImport) { AudioClip* clip = resources_manager()->get_clip(id); if (clip) { bool hadSheet = clip->has_sheet(); clip->set_sheet(m_sw->get_sheet()); clip->set_track(importTrack); if (!hadSheet) { clip->set_state(clip->get_dom_node()); } clip->set_track_start_location(startpos); startpos = clip->get_track_end_location(); AddRemoveClip* arc = new AddRemoveClip(clip, AddRemoveClip::ADD); group->add_command(arc); continue; } ReadSource* source = resources_manager()->get_readsource(id); if (source) { clip = resources_manager()->new_audio_clip(source->get_short_name()); resources_manager()->set_source_for_clip(clip, source); clip->set_sheet(importTrack->get_sheet()); clip->set_track(importTrack); clip->set_track_start_location(startpos); startpos = clip->get_track_end_location(); AddRemoveClip* arc = new AddRemoveClip(clip, AddRemoveClip::ADD); group->add_command(arc); } } bool firstItem = true; foreach(Import* import, m_imports) { import->set_track(importTrack); if (firstItem) { // Place first item at cursor, others at end of track. import->set_position(startpos); firstItem = false; } group->add_command(import); } Command::process_command(group); } void ClipsViewPort::dragMoveEvent( QDragMoveEvent * event ) { Q_UNUSED(event) Project* project = pm().get_project(); if (!project) { return; } Sheet* sheet = project->get_current_sheet(); if (!sheet) { return; } importTrack = 0; // hmmm, code below is candidate for improvements...? // no mouse move events during D&D move events... // So we need to calculate the scene pos ourselves. QPointF mouseposTosScene = mapFromGlobal(QCursor::pos()); QList itemlist = items((int)mouseposTosScene.x(), (int)mouseposTosScene.y()); foreach(QGraphicsItem* obj, itemlist) { TrackView* tv = dynamic_cast(obj); if (tv) { importTrack = tv->get_track(); return; } } } traverso-0.49.4/src/sheetcanvas/TrackPanelView.cpp000644 001750 001750 00000032127 11163362147 022446 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: TrackPanelView.cpp,v 1.2 2009/02/21 22:38:27 r_sijrier Exp $ */ #include #include #include "TrackPanelView.h" #include "TrackView.h" #include "SheetView.h" #include #include "TrackPanelViewPort.h" #include #include "TrackPanelView.h" #include #include #include #include #include #define MICRO_HEIGHT 35 #define SMALL_HEIGHT 65 TrackPanelView::TrackPanelView(TrackView* trackView) : ViewItem(0, trackView) , m_tv(trackView) { PENTERCONS; m_viewPort = m_tv->get_sheetview()->get_trackpanel_view_port(); m_track = m_tv->get_track(); m_gainView = new TrackPanelGain(this, m_track); m_gainView->set_width(m_viewPort->width() - 20); m_panView = new TrackPanelPan(this, m_track); m_panView->set_width(m_viewPort->width() - 20); recLed = new TrackPanelLed(this, "rec", "toggle_arm"); soloLed = new TrackPanelLed(this, "solo", "solo"); muteLed = new TrackPanelLed(this, "mute", "mute"); if (m_track->armed()) { recLed->ison_changed(true); } if (m_track->is_solo()) { soloLed->ison_changed(true); } if (m_track->is_muted()) { muteLed->ison_changed(true); } inBus = new TrackPanelBus(this, m_track, TrackPanelBus::BUSIN); outBus = new TrackPanelBus(this, m_track, TrackPanelBus::BUSOUT); m_viewPort->scene()->addItem(this); m_boundingRect = QRectF(0, 0, 200, m_track->get_height()); layout_panel_items(); connect(m_track, SIGNAL(armedChanged(bool)), recLed, SLOT(ison_changed(bool))); connect(m_track, SIGNAL(soloChanged(bool)), soloLed, SLOT(ison_changed(bool))); connect(m_track, SIGNAL(muteChanged(bool)), muteLed, SLOT(ison_changed(bool))); connect(m_track, SIGNAL(gainChanged()), this, SLOT(update_gain())); connect(m_track, SIGNAL(panChanged()), this, SLOT(update_pan())); connect(m_track, SIGNAL(inBusChanged()), inBus, SLOT(bus_changed())); connect(m_track, SIGNAL(outBusChanged()), outBus, SLOT(bus_changed())); connect(m_track, SIGNAL(stateChanged()), this, SLOT(update_track_name())); // setFlags(ItemIsSelectable | ItemIsMovable); // setAcceptsHoverEvents(true); setCursor(themer()->get_cursor("Track")); } TrackPanelView::~TrackPanelView( ) { PENTERDES; } void TrackPanelView::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) { Q_UNUSED(widget); Q_UNUSED(option); int xstart = (int)option->exposedRect.x(); int pixelcount = (int)option->exposedRect.width(); if (m_tv->m_topborderwidth > 0) { QColor color = themer()->get_color("Track:cliptopoffset"); painter->fillRect(xstart, 0, pixelcount, m_tv->m_topborderwidth, color); } if (m_tv->m_paintBackground) { QColor color = themer()->get_color("Track:background"); painter->fillRect(xstart, m_tv->m_topborderwidth, pixelcount, m_track->get_height() - m_tv->m_bottomborderwidth, color); } if (m_tv->m_bottomborderwidth > 0) { QColor color = themer()->get_color("Track:clipbottomoffset"); painter->fillRect(xstart, m_track->get_height() - m_tv->m_bottomborderwidth, pixelcount, m_tv->m_bottomborderwidth, color); } // Track / track panel seperator is painted in TrackPanelViewPort... not the best place perhaps ? painter->fillRect(m_viewPort->width() - 3, 0, 3, m_track->get_height() - 1, themer()->get_color("TrackPanel:trackseparation")); if (xstart < 180) { draw_panel_track_name(painter); } } void TrackPanelView::update_track_name() { update(); } void TrackPanelView::update_gain() { m_gainView->update(); } void TrackPanelView::update_pan() { m_panView->update(); } void TrackPanelView::draw_panel_track_name(QPainter* painter) { QString title = QString::number(m_track->get_sort_index() + 1) + " " + m_track->get_name(); if (m_track->get_height() < SMALL_HEIGHT) { QFontMetrics fm(themer()->get_font("TrackPanel:fontscale:name")); title = fm.elidedText(title, Qt::ElideMiddle, 90); } painter->save(); painter->setPen(themer()->get_color("TrackPanel:text")); painter->setFont(themer()->get_font("TrackPanel:fontscale:name")); painter->drawText(4, 12, title); painter->restore(); } void TrackPanelView::calculate_bounding_rect() { prepareGeometryChange(); m_boundingRect = QRectF(0, 0, 200, m_track->get_height()); layout_panel_items(); } void TrackPanelView::layout_panel_items() { int height = m_track->get_height(); m_gainView->setPos(10, 39); m_panView->setPos(10, 54); inBus->setPos(10, 73); outBus->setPos(100, 73); if (height < SMALL_HEIGHT) { m_gainView->setPos(10, 20); m_panView->setPos(10, 36); } else { muteLed->setPos(70, 19); soloLed->setPos(118, 19); recLed->setPos(162, 19); muteLed->set_bounding_rect(QRectF(0, 0, 41, 14)); soloLed->set_bounding_rect(QRectF(0, 0, 38, 14)); recLed->set_bounding_rect(QRectF(0, 0, 30, 14)); m_gainView->setPos(10, 39); m_panView->setPos(10, 54); } if (height < SMALL_HEIGHT) { muteLed->setPos(90, 1.5); soloLed->setPos(132, 1.5); recLed->setPos(166, 1.5); muteLed->set_bounding_rect(QRectF(0, 0, 39, 12)); soloLed->set_bounding_rect(QRectF(0, 0, 31, 12)); recLed->set_bounding_rect(QRectF(0, 0, 27, 12)); } if ((inBus->pos().y() + inBus->boundingRect().height()) >= height) { inBus->hide(); outBus->hide(); } else { inBus->show(); outBus->show(); } if ( (m_panView->pos().y() + m_panView->boundingRect().height()) >= height) { m_panView->hide(); } else { m_panView->show(); } if ( (m_gainView->pos().y() + m_panView->boundingRect().height()) >= height) { m_gainView->hide(); } else { m_gainView->show(); } } TrackPanelGain::TrackPanelGain(TrackPanelView* parent, Track * track) : ViewItem(parent, track) , m_track(track) { setAcceptsHoverEvents(true); } void TrackPanelGain::paint( QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget ) { Q_UNUSED(widget); const int height = 9; int sliderWidth = (int)m_boundingRect.width() - 75; float gain = m_track->get_gain(); QString sgain = coefficient_to_dbstring(gain); float db = coefficient_to_dB(gain); if (db < -60) { db = -60; } int sliderdbx = (int) (sliderWidth - (sliderWidth*0.3)) - (int) ( ( (-1 * db) / 60 ) * sliderWidth); if (sliderdbx < 0) { sliderdbx = 0; } if (db > 0) { sliderdbx = (int)(sliderWidth*0.7) + (int) ( ( db / 6 ) * (sliderWidth*0.3)); } int cr = (gain >= 1 ? 30 + (int)(100 * gain) : (int)(50 * gain)); int cb = ( gain < 1 ? 150 + (int)(50 * gain) : abs((int)(10 * gain)) ); painter->save(); painter->setPen(themer()->get_color("TrackPanel:text")); painter->setFont(themer()->get_font("TrackPanel:fontscale:gain")); painter->drawText(0, height + 1, "GAIN"); painter->drawRect(30, 0, sliderWidth, height); bool mousehover = (option->state & QStyle::State_MouseOver); QColor color(cr,0,cb); if (mousehover) { color = color.light(140); } painter->fillRect(31, 1, sliderdbx, height-1, color); painter->drawText(sliderWidth + 35, height, sgain); painter->restore(); } void TrackPanelGain::set_width(int width) { m_boundingRect = QRectF(0, 0, width, 9); } Command* TrackPanelGain::gain_increment() { m_track->set_gain(m_track->get_gain() + 0.05); return 0; } Command* TrackPanelGain::gain_decrement() { m_track->set_gain(m_track->get_gain() - 0.05); return 0; } TrackPanelPan::TrackPanelPan(TrackPanelView* parent, Track * track) : ViewItem(parent, track) , m_track(track) { setAcceptsHoverEvents(true); } void TrackPanelPan::paint( QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget ) { Q_UNUSED(widget); bool mousehover = (option->state & QStyle::State_MouseOver); QColor color = themer()->get_color("TrackPanel:slider:background"); if (mousehover) { color = color.light(110); } const int PAN_H = 9; int sliderWidth = (int)m_boundingRect.width() - 75; float v; // int y; QString s, span; painter->setPen(themer()->get_color("TrackPanel:text")); painter->setFont(themer()->get_font("TrackPanel:fontscale:pan")); painter->drawText(0, PAN_H + 1, "PAN"); v = m_track->get_pan(); span = QByteArray::number(v,'f',1); s = ( v > 0 ? QString("+") + span : span ); painter->fillRect(30, 0, sliderWidth, PAN_H, color); painter->drawRect(30, 0, sliderWidth, PAN_H); int pm= 31 + sliderWidth/2; int z = abs((int)(v*(sliderWidth/2))); int c = abs((int)(255*v)); if (v>=0) { painter->fillRect(pm, 1, z, PAN_H-1, QColor(c,0,0)); } else { painter->fillRect(pm-z, 1, z, PAN_H-1, QColor(c,0,0)); } painter->drawText(30 + sliderWidth + 10, PAN_H + 1, s); } void TrackPanelPan::set_width(int width) { m_boundingRect = QRectF(0, 0, width, 9); } Command* TrackPanelPan::pan_left() { m_track->set_pan(m_track->get_pan() - 0.05); return 0; } Command* TrackPanelPan::pan_right() { m_track->set_pan(m_track->get_pan() + 0.05); return 0; } TrackPanelLed::TrackPanelLed(TrackPanelView* parent, const QString& name, const QString& toggleslot) : ViewItem(parent, 0) , m_name(name) , m_toggleslot(toggleslot) , m_isOn(false) { m_track = parent->get_track(); setAcceptsHoverEvents(true); } void TrackPanelLed::paint(QPainter* painter, const QStyleOptionGraphicsItem * option, QWidget * widget ) { Q_UNUSED(widget); bool mousehover = (option->state & QStyle::State_MouseOver); int roundfactor = 20; painter->save(); painter->setRenderHint(QPainter::Antialiasing); if (m_isOn) { QColor color = themer()->get_color("TrackPanel:" + m_name + "led"); if (mousehover) { color = color.light(110); } painter->setPen(themer()->get_color("TrackPanel:led:margin:active")); painter->setBrush(color); painter->drawRoundRect(m_boundingRect, roundfactor, roundfactor); painter->setFont(themer()->get_font("TrackPanel:fontscale:led")); painter->setPen(themer()->get_color("TrackPanel:led:font:active")); painter->drawText(m_boundingRect, Qt::AlignCenter, m_name); } else { QColor color = themer()->get_color("TrackPanel:led:inactive"); if (mousehover) { color = color.light(110); } painter->setPen(themer()->get_color("TrackPanel:led:margin:inactive")); painter->setBrush(color); painter->drawRoundRect(m_boundingRect, roundfactor, roundfactor); painter->setFont(themer()->get_font("TrackPanel:fontscale:led")); painter->setPen(themer()->get_color("TrackPanel:led:font:inactive")); painter->drawText(m_boundingRect, Qt::AlignCenter, m_name); } painter->restore(); } void TrackPanelLed::set_bounding_rect(QRectF rect) { prepareGeometryChange(); m_boundingRect = rect; } void TrackPanelLed::ison_changed(bool isOn) { m_isOn = isOn; update(); } Command * TrackPanelLed::toggle() { Command* com; QMetaObject::invokeMethod(m_track, QS_C(m_toggleslot), Qt::DirectConnection, Q_RETURN_ARG(Command*, com)); return 0; } TrackPanelBus::TrackPanelBus(TrackPanelView* parent, Track* track, int type) : ViewItem(parent, 0) , m_track(track) , m_type(type) { bus_changed(); setAcceptsHoverEvents(true); } void TrackPanelBus::paint(QPainter* painter, const QStyleOptionGraphicsItem * option, QWidget * widget ) { Q_UNUSED(option); Q_UNUSED(widget); QColor color = themer()->get_color("TrackPanel:bus:background"); int roundfactor = 15; painter->save(); painter->setRenderHint(QPainter::Antialiasing); if (option->state & QStyle::State_MouseOver) { color = color.light(110); } painter->setPen(themer()->get_color("TrackPanel:bus:margin")); painter->setBrush(color); painter->drawRoundRect(m_boundingRect, roundfactor, roundfactor); painter->setFont(themer()->get_font("TrackPanel:fontscale:led")); painter->setPen(themer()->get_color("TrackPanel:bus:font")); QString leftright = ""; if ((m_type == BUSIN) && ! (m_track->capture_left_channel() && m_track->capture_right_channel()) ) { if (m_track->capture_left_channel()) { leftright = " L"; } else { leftright = " R"; } } painter->drawText(m_boundingRect.adjusted(15, 0, 0, 0), Qt::AlignCenter, m_busName + leftright); painter->drawPixmap(3, 3, m_pix); painter->restore(); } void TrackPanelBus::bus_changed() { QFontMetrics fm(themer()->get_font("TrackPanel:bus")); prepareGeometryChange(); if (m_type == BUSIN) { m_busName = m_track->get_bus_in(); m_pix = find_pixmap(":/bus_in"); m_boundingRect = m_pix.rect(); m_boundingRect.setWidth(m_pix.rect().width() + fm.width(m_busName) + 10); } else { m_busName = m_track->get_bus_out(); m_pix = find_pixmap(":/bus_out"); m_boundingRect = m_pix.rect(); m_boundingRect.setWidth(m_pix.rect().width() + fm.width(m_busName) + 10); } m_boundingRect.setHeight(m_boundingRect.height() + 6); update(); } traverso-0.49.4/src/sheetcanvas/TrackPanelViewPort.cpp000644 001750 001750 00000003133 11163362147 023306 0ustar00remonremon000000 000000 /* Copyright (C) 2006 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: TrackPanelViewPort.cpp,v 1.1 2008/01/21 16:17:30 r_sijrier Exp $ */ #include "TrackPanelViewPort.h" #include "SheetWidget.h" #include "SheetView.h" #include "TrackPanelView.h" #include #include TrackPanelViewPort::TrackPanelViewPort(QGraphicsScene* scene, SheetWidget* sw) : ViewPort(scene, sw) { setMinimumWidth(200); setMaximumWidth(200); m_sw = sw; setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); } void TrackPanelViewPort::get_pointed_context_items(QList &list) { QList itemlist = items(cpointer().on_first_input_event_x(), cpointer().on_first_input_event_y()); foreach(QGraphicsItem* item, itemlist) { if (ViewItem::is_viewitem(item)) { list.append((ViewItem*)item); } } list.append(m_sw->get_sheetview()); } //eof traverso-0.49.4/src/sheetcanvas/PositionIndicator.h000644 001750 001750 00000002426 11163362147 022674 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef POSITION_INDICATOR_H #define POSITION_INDICATOR_H #include "ViewItem.h" #include class PositionIndicator : public ViewItem { Q_OBJECT public: PositionIndicator(ViewItem* parent); ~PositionIndicator() {} void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); void calculate_bounding_rect(); void set_position(int x, int y); void set_value(const QString& value); private: QString m_value; QPixmap m_background; }; #endif //eof traverso-0.49.4/src/sheetcanvas/CurveView.h000644 001750 001750 00000007030 11163362147 021146 0ustar00remonremon000000 000000 /* Copyright (C) 2006-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef CURVE_VIEW_H #define CURVE_VIEW_H #include "ViewItem.h" #include "Command.h" #include class Curve; class CurveNode; class CurveNodeView; class QPoint; class CurveView; class DragNode : public Command { Q_OBJECT Q_CLASSINFO("move_up", tr("Move Up")); Q_CLASSINFO("move_down", tr("Move Down")); public: DragNode(CurveNode* node, CurveView* curveview, qint64 scalefactor, TimeRef rangeMin, TimeRef rangeMax, const QString& des); int prepare_actions(); int do_action(); int undo_action(); int finish_hold(); void cancel_action(); int begin_hold(); int jog(); void set_cursor_shape(int useX, int useY); void set_vertical_only(); private : class Private { public: CurveView* curveView; qint64 scalefactor; TimeRef rangeMin; TimeRef rangeMax; QPoint mousepos; bool verticalOnly; }; Private* d; CurveNode* m_node; double m_origWhen; double m_origValue; double m_newWhen; double m_newValue; int calculate_and_set_node_values(); public slots: void move_up(bool autorepeat); void move_down(bool autorepeat); }; class CurveView : public ViewItem { Q_OBJECT Q_CLASSINFO("add_node", tr("New node")) Q_CLASSINFO("remove_node", tr("Remove node")) Q_CLASSINFO("remove_all_nodes", tr("Remove all Nodes")) Q_CLASSINFO("drag_node", tr("Move node")) Q_CLASSINFO("drag_node_vertical_only", tr("Move node (vertical only)")) public: CurveView(SheetView* sv, ViewItem* parentViewItem, Curve* curve); ~CurveView(); void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); int get_vector(int xstart, int pixelcount, float *arg); bool has_nodes() const; float get_default_value(); void calculate_bounding_rect(); void load_theme_data(); void set_start_offset(const TimeRef& offset); const TimeRef& get_start_offset() const {return m_startoffset;} protected: void hoverEnterEvent ( QGraphicsSceneHoverEvent * event ); void hoverLeaveEvent ( QGraphicsSceneHoverEvent * event ); void hoverMoveEvent ( QGraphicsSceneHoverEvent * event ); private: Curve* m_curve; Curve* m_guicurve; QTimer m_blinkTimer; CurveNodeView* m_blinkingNode; int m_blinkDarkness; int m_blinkColorDirection; QList m_nodeViews; TimeRef m_startoffset; void update_softselected_node(QPoint pos, bool force = false); public slots: Command* add_node(); Command* remove_node(); Command* remove_all_nodes(); Command* drag_node(); Command* drag_node_vertical_only(); private slots: void add_curvenode_view(CurveNode* node); void remove_curvenode_view(CurveNode* node); void node_moved(); void set_view_mode(); void update_blink_color(); signals : // emit from the gui so that we can stop following the playhead only // when the user manually edits, not on undo/redo void curveModified(); }; #endif //eof traverso-0.49.4/src/sheetcanvas/PositionIndicator.cpp000644 001750 001750 00000003674 11163362147 023235 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "PositionIndicator.h" #include "SheetView.h" #include #include PositionIndicator::PositionIndicator(ViewItem* parentView) : ViewItem(parentView, 0) { calculate_bounding_rect(); setZValue(100); } void PositionIndicator::paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget) { Q_UNUSED(option); Q_UNUSED(widget); painter->drawPixmap(0, 0, m_background); painter->drawText(m_boundingRect, Qt::AlignVCenter, m_value); } void PositionIndicator::calculate_bounding_rect() { prepareGeometryChange(); m_boundingRect = QRectF(0, 0, 70, 14); m_background = QPixmap((int)m_boundingRect.width(), (int)m_boundingRect.height()); m_background.fill(QColor(Qt::transparent)); QPainter painter(&m_background); painter.setRenderHint(QPainter::Antialiasing); painter.setBrush(QColor(255, 255, 255)); painter.setPen(Qt::NoPen); int rounding = 10; painter.drawRoundRect(0, 0, (int)m_boundingRect.width(), (int)m_boundingRect.height(), rounding, rounding); } void PositionIndicator::set_position(int x, int y) { setPos(x, y); } void PositionIndicator::set_value(const QString & value) { m_value = value; } traverso-0.49.4/src/sheetcanvas/CurveNodeView.h000644 001750 001750 00000002665 11163362147 021765 0ustar00remonremon000000 000000 /* Copyright (C) 2006-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef CURVE_NODE_VIEW_H #define CURVE_NODE_VIEW_H #include "ViewItem.h" #include class CurveView; class CurveNodeView : public ViewItem, public CurveNode { Q_OBJECT public: CurveNodeView(SheetView* sv, CurveView* curveview, CurveNode* node, Curve* guicurve); ~CurveNodeView(); void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); void calculate_bounding_rect(); void set_selected(); void reset_size(); void set_color(QColor color); void load_theme_data(); CurveNode* get_curve_node() const {return m_node;} private: CurveView* m_curveview; CurveNode* m_node; QColor m_color; public slots: void update_pos(); }; #endif //eof traverso-0.49.4/src/sheetcanvas/libtraversosheetcanvas.h000644 001750 001750 00000000630 11163362147 024007 0ustar00remonremon000000 000000 #include "AudioClipView.h" #include "ClipsViewPort.h" #include "Cursors.h" #include "CurveNodeView.h" #include "CurveView.h" #include "FadeView.h" #include "MarkerView.h" #include "PluginView.h" #include "PluginChainView.h" #include "SheetView.h" #include "TimeLineView.h" #include "TimeLineViewPort.h" #include "TrackView.h" #include "TrackPanelView.h" #include "TrackPanelViewPort.h" #include "ViewItem.h" traverso-0.49.4/src/sheetcanvas/PluginView.cpp000644 001750 001750 00000006650 11163362147 021662 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "PluginView.h" #include #include "TrackView.h" #include "PluginChainView.h" #include "Interface.h" #include #include #include #include #include #include // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" PluginView::PluginView(PluginChainView* parent, PluginChain* chain, Plugin* plugin, int index) : ViewItem(parent, plugin) , m_pluginchain(chain) , m_plugin(plugin) , m_index(index) { PENTERCONS; m_propertiesDialog = 0; setZValue(parent->zValue() + 2); m_name = plugin->get_name(); QFontMetrics fm(themer()->get_font("Plugin:fontscale:name")); m_textwidth = fm.width(m_name); calculate_bounding_rect(); setAcceptsHoverEvents(true); setCursor(themer()->get_cursor("Plugin")); connect(m_plugin, SIGNAL(bypassChanged()), this, SLOT(repaint())); } PluginView::~PluginView( ) { PENTERDES2; if (m_propertiesDialog) { delete m_propertiesDialog; } } void PluginView::paint(QPainter* painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { Q_UNUSED(option); Q_UNUSED(widget); QColor color; if (m_plugin->is_bypassed()) { color = themer()->get_color("Plugin:background:bypassed"); } else { color = themer()->get_color("Plugin:background"); } int height, width; if (option->state & QStyle::State_MouseOver) { height = (int)m_boundingRect.height() + 1; width = (int)m_boundingRect.width() + 1; color = color.light(120); } else { height = (int)m_boundingRect.height(); width = (int)m_boundingRect.width(); } QBrush brush(color); QRect rect(0, 0, width, height); painter->fillRect(rect, brush); painter->setPen(themer()->get_color("Plugin:text")); painter->setFont(themer()->get_font("Plugin:fontscale:name")); painter->drawText(rect, Qt::AlignCenter, m_name); } Command * PluginView::edit_properties( ) { if (! m_propertiesDialog) { m_propertiesDialog = new PluginPropertiesDialog(Interface::instance(), m_plugin); m_propertiesDialog->setWindowTitle(m_name); } m_propertiesDialog->show(); return (Command*) 0; } Command* PluginView::remove_plugin() { return m_pluginchain->remove_plugin(m_plugin); } Plugin * PluginView::get_plugin( ) { return m_plugin; } void PluginView::set_index(int index) { m_index = index; } void PluginView::repaint( ) { update(); } void PluginView::calculate_bounding_rect() { int height = 25; int parentheight = (int)m_parentViewItem->boundingRect().height(); if (parentheight < 30) { height = parentheight - 4; } int y = parentheight - height; m_boundingRect = QRectF(0, 0, m_textwidth + 8, height); setPos(x(), y); } traverso-0.49.4/src/sheetcanvas/FadeView.h000644 001750 001750 00000003546 11163362147 020731 0ustar00remonremon000000 000000 /* Copyright (C) 2006 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: FadeView.h,v 1.2 2008/05/24 17:27:49 r_sijrier Exp $ */ #ifndef FADE_VIEW_H #define FADE_VIEW_H #include "ViewItem.h" class Curve; class FadeCurve; class AudioClipView; class FadeView : public ViewItem { Q_OBJECT Q_CLASSINFO("bend", tr("Adjust Bend")) Q_CLASSINFO("strength", tr("Adjust Strength")) Q_CLASSINFO("select_fade_shape", tr("Select Preset")) public: FadeView(SheetView* sv, AudioClipView* parent, FadeCurve* fadeCuve); ~FadeView(); void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); int get_vector(int xstart, int pixelcount, float * arg); void calculate_bounding_rect(); void set_holding(bool hold); FadeCurve* get_fade() const {return m_fadeCurve;} void load_theme_data(); private: FadeCurve* m_fadeCurve; Curve* m_guicurve; bool m_holdactive; public slots: void state_changed(); Command* bend(); Command* strength(); Command* select_fade_shape(); // Command* edit_properties(); signals : // emit from the gui so that we can stop following the playhead only // when the user manually edits, not on undo/redo void fadeModified(); }; #endif //eof traverso-0.49.4/src/sheetcanvas/CurveNodeView.cpp000644 001750 001750 00000007347 11163362147 022322 0ustar00remonremon000000 000000 /* Copyright (C) 2006-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "CurveNodeView.h" #include "SheetView.h" #include #include #include #include #include #include "CurveView.h" #include CurveNodeView::CurveNodeView( SheetView * sv, CurveView* curveview, CurveNode * node, Curve* guicurve) : ViewItem(curveview, 0) , CurveNode(guicurve, node->get_when(), node->get_value()) , m_node(node) { PENTERCONS; m_sv = sv; m_curveview = curveview; int size = themer()->get_property("CurveNode:diameter", 6).toInt(); setCursor(themer()->get_cursor("CurveNode")); m_boundingRect = QRectF(0, 0, size, size); load_theme_data(); connect(m_node->m_curve, SIGNAL(nodePositionChanged()), this, SLOT(update_pos())); } CurveNodeView::~ CurveNodeView( ) { PENTERDES; } void CurveNodeView::paint( QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget ) { Q_UNUSED(option); Q_UNUSED(widget); painter->save(); QPen pen; pen.setColor(m_color); QPointF mapped = mapToParent(QPointF(0, 0)); int x = (int) mapped.x(); int y = (int) mapped.y(); int heightadjust = 0; int widthadjust = 0; if ( (y + m_boundingRect.height()) > (int) m_parentViewItem->boundingRect().height() ) { heightadjust = y - (int)m_parentViewItem->boundingRect().height() + (int) m_boundingRect.height(); } if ( (x + m_boundingRect.width()) > (int) m_parentViewItem->boundingRect().width() ) { widthadjust = x - (int) m_parentViewItem->boundingRect().width() + (int) m_boundingRect.width(); } // printf("widthadjust is %d, heightadjust = %d\n", widthadjust, heightadjust); if (x > 0) x = 0; if (y > 0) y = 0; QRectF rect = m_boundingRect.adjusted(- x, - y, - widthadjust, -heightadjust); painter->setClipRect(rect); painter->setRenderHint(QPainter::Antialiasing); painter->setPen(pen); QPainterPath path; path.addEllipse(m_boundingRect); painter->fillPath(path, QBrush(m_color)); painter->restore(); } void CurveNodeView::calculate_bounding_rect() { update_pos(); } void CurveNodeView::set_color(QColor color) { m_color = color; } void CurveNodeView::update_pos( ) { qreal halfwidth = (m_boundingRect.width() / 2); qreal parentheight = m_parentViewItem->boundingRect().height(); qreal when = ((TimeRef(m_node->get_when()) - m_curveview->get_start_offset()) / m_sv->timeref_scalefactor) - halfwidth; qreal value = parentheight - (m_node->get_value() * parentheight + halfwidth); setPos(when, value); set_when_and_value((m_node->get_when() / m_sv->timeref_scalefactor), m_node->get_value()); } void CurveNodeView::set_selected( ) { int size = themer()->get_property("CurveNode:diameter", 6).toInt(); m_boundingRect.setWidth(size + 1); m_boundingRect.setHeight(size + 1); update_pos(); } void CurveNodeView::reset_size( ) { int size = themer()->get_property("CurveNode:diameter", 6).toInt(); m_boundingRect.setWidth(size); m_boundingRect.setHeight(size); update_pos(); } void CurveNodeView::load_theme_data() { m_color = themer()->get_color("CurveNode:default"); calculate_bounding_rect(); } traverso-0.49.4/src/sheetcanvas/TimeLineViewPort.cpp000644 001750 001750 00000004206 11163362147 022772 0ustar00remonremon000000 000000 /* Copyright (C) 2006-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "TimeLineViewPort.h" #include "SheetView.h" #include "SheetWidget.h" #include "TimeLineView.h" #include #include #include #include TimeLineViewPort::TimeLineViewPort(QGraphicsScene* scene, SheetWidget* sw) : ViewPort(scene, sw) { setMaximumHeight(TIMELINE_HEIGHT); setMinimumHeight(TIMELINE_HEIGHT); setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); m_timeLineView = 0; } TimeLineViewPort::~ TimeLineViewPort() { PENTERDES; } void TimeLineViewPort::wheelEvent ( QWheelEvent * e ) { if (e->delta() > 0) { m_sv->scroll_left(); } else { m_sv->scroll_right(); } } void TimeLineViewPort::set_sheetview( SheetView * view ) { m_timeLineView = new TimeLineView(view); scene()->addItem(m_timeLineView); m_timeLineView->setPos(0, -TIMELINE_HEIGHT); m_sv = view; } void TimeLineViewPort::get_pointed_context_items(QList &list) { QList itemlist = items(cpointer().on_first_input_event_x(), cpointer().on_first_input_event_y()); foreach(QGraphicsItem* item, itemlist) { if (ViewItem::is_viewitem(item)) { list.append((ViewItem*)item); } } list.append(m_sv); } void TimeLineViewPort::scale_factor_changed() { if (m_timeLineView) { m_timeLineView->calculate_bounding_rect(); } } //eof traverso-0.49.4/src/sheetcanvas/PluginView.h000644 001750 001750 00000003344 11163362147 021324 0ustar00remonremon000000 000000 /* Copyright (C) 2006-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef PLUGIN_VIEW_H #define PLUGIN_VIEW_H #include "ViewItem.h" #include class PluginPropertiesDialog; class TrackView; class PluginChainView; class Plugin; class PluginChain; class PluginView : public ViewItem { Q_OBJECT Q_CLASSINFO("edit_properties", tr("Edit...")) Q_CLASSINFO("remove_plugin", tr("Remove")) public: PluginView(PluginChainView* pcv, PluginChain* chain, Plugin* plugin, int index); ~PluginView(); Plugin* get_plugin(); void set_index(int index); void paint(QPainter* painter, const QStyleOptionGraphicsItem *option, QWidget *widget); void calculate_bounding_rect(); private: PluginChain* m_pluginchain; Plugin* m_plugin; int m_index; int m_textwidth; QString m_name; PluginPropertiesDialog* m_propertiesDialog; public slots: Command* edit_properties(); Command* remove_plugin(); private slots: void repaint(); }; #endif //eof traverso-0.49.4/src/sheetcanvas/MarkerView.h000644 001750 001750 00000003161 11163362147 021304 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef MARKER_VIEW_H #define MARKER_VIEW_H #include "ViewItem.h" class Marker; class SheetView; class LineView; class QColor; class PositionIndicator; class MarkerView : public ViewItem { Q_OBJECT public: MarkerView(Marker* marker, SheetView* sv, ViewItem* parent); ~MarkerView() {} void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); void calculate_bounding_rect(); void load_theme_data(); void set_active(bool); int position(); void set_position(int); void set_dragging(bool dragging); Marker* get_marker() const {return m_marker;} private: Marker* m_marker; LineView* m_line; QColor m_fillColor; bool m_active; bool m_dragging; PositionIndicator* m_posIndicator; int m_ascent; int m_width; private slots: void update_position(); void update_drawing(); }; #endif //eof traverso-0.49.4/src/sheetcanvas/SheetView.h000644 001750 001750 00000010732 11163362147 021135 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef SONG_VIEW_H #define SONG_VIEW_H #include "ViewItem.h" #include class Sheet; class TrackView; class ClipsViewPort; class TrackPanelViewPort; class TimeLineViewPort; class Track; class SheetWidget; class TrackView; class PlayHead; class WorkCursor; class Curve; class SheetView : public ViewItem { Q_OBJECT Q_CLASSINFO("touch", tr("Set")) Q_CLASSINFO("touch_play_cursor", tr("Set")) Q_CLASSINFO("center", tr("Center View")) Q_CLASSINFO("scroll_right", tr("Right")) Q_CLASSINFO("scroll_left", tr("Left")) Q_CLASSINFO("scroll_up", tr("Up")) Q_CLASSINFO("scroll_down", tr("Down")) Q_CLASSINFO("shuttle", tr("Shuttle")) Q_CLASSINFO("goto_begin", tr("To start")) Q_CLASSINFO("goto_end", tr("To end")) Q_CLASSINFO("play_to_begin", tr("To Start")) Q_CLASSINFO("play_cursor_move", tr("Move")) Q_CLASSINFO("work_cursor_move", tr("Move")) Q_CLASSINFO("add_marker", tr("Add Marker")) Q_CLASSINFO("add_marker_at_playhead", tr("Add Marker at Playhead")) Q_CLASSINFO("playhead_to_workcursor", tr("To workcursor")) Q_CLASSINFO("center_playhead", tr("Center")) public : SheetView(SheetWidget* sheetwidget, ClipsViewPort* viewPort, TrackPanelViewPort* tpvp, TimeLineViewPort* tlvp, Sheet* sheet); ~SheetView(); void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*) {}; QRectF boundingRect() const {return QRectF();} Sheet* get_sheet() const {return m_sheet;} TrackPanelViewPort* get_trackpanel_view_port() const; ClipsViewPort* get_clips_viewport() const; TrackView* get_trackview_under(QPointF point); void load_theme_data(); void start_shuttle(bool start, bool drag=false); void update_shuttle_factor(); void set_shuttle_factor_values(int x, int y); void vzoom(qreal scale); void hzoom(qreal scale); void clipviewport_resize_event(); int hscrollbar_value() const; int vscrollbar_value() const; int get_peak_cache_zoom_factor() const {return m_peakCacheZoomFactor;} qint64 timeref_scalefactor; private: Sheet* m_sheet; Curve* m_shuttleCurve; Curve* m_dragShuttleCurve; PlayHead* m_playCursor; ClipsViewPort* m_clipsViewPort; TrackPanelViewPort* m_tpvp; TimeLineViewPort* m_tlvp; QList m_trackViews; WorkCursor* m_workCursor; int m_shuttleXfactor; int m_shuttleYfactor; int m_sceneHeight; int m_peakCacheZoomFactor; bool m_dragShuttle; QTimer m_shuttletimer; QScrollBar* m_vScrollBar; QScrollBar* m_hScrollBar; bool m_actOnPlayHead; bool m_viewportReady; // Themeing data int m_trackSeperatingHeight; int m_trackMinimumHeight; int m_trackMaximumHeight; int m_trackTopIndent; void layout_tracks(); void set_hscrollbar_value(int value); void set_vscrollbar_value(int value); int mean_track_height(); friend class PlayHead; public slots: void set_snap_range(int); void update_scrollbars(); void stop_follow_play_head(); void follow_play_head(); void set_follow_state(bool state); void transport_position_set(); Command* touch(); Command* touch_play_cursor(); Command* center(); Command* scroll_right(); Command* scroll_left(); Command* scroll_up(); Command* scroll_down(); Command* shuttle(); Command* goto_begin(); Command* goto_end(); Command* play_to_begin(); Command* play_cursor_move(); Command* work_cursor_move(); Command* add_marker(); Command* add_marker_at_playhead(); Command* playhead_to_workcursor(); Command* center_playhead(); private slots: void scale_factor_changed(); void add_new_trackview(Track*); void remove_trackview(Track*); void update_shuttle(); void sheet_mode_changed(); void hscrollbar_value_changed(int); void hscrollbar_action(int); }; #endif traverso-0.49.4/src/sheetcanvas/ViewItem.cpp000755 001750 001750 00000002142 11427545152 021317 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2006 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "ViewItem.h" ViewItem::ViewItem(ViewItem* parentViewItem, ContextItem* parentContext) : ContextItem(parentViewItem) , QGraphicsItem(parentViewItem) { set_context_item(parentContext); m_parentViewItem = parentViewItem; setCursor(themer()->get_cursor("Default")); #if QT_VERSION >= 0x040600 setFlags(QGraphicsItem::ItemUsesExtendedStyleOption); #endif } traverso-0.49.4/src/sheetcanvas/PluginChainView.h000644 001750 001750 00000003045 11163362147 022265 0ustar00remonremon000000 000000 /* Copyright (C) 2006-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef PLUGIN_CHAIN_VIEW_H #define PLUGIN_CHAIN_VIEW_H #include "ViewItem.h" #include class SheetView; class Plugin; class PluginChain; class PluginView; class PluginChainView : public ViewItem { Q_OBJECT public: PluginChainView(SheetView* sv, ViewItem* parent, PluginChain* chain); ~PluginChainView(); void paint(QPainter* painter, const QStyleOptionGraphicsItem *option, QWidget *widget); void calculate_bounding_rect(); private: PluginChain* m_pluginchain; QList m_pluginViews; public slots: void add_new_pluginview(Plugin* plugin); void remove_pluginview(Plugin* plugin); void scrollbar_value_changed(int value); private slots: void set_view_mode(); }; #endif //eof traverso-0.49.4/src/sheetcanvas/ViewItem.h000755 001750 001750 00000005046 11427550432 020767 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2006 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef VIEW_ITEM_H #define VIEW_ITEM_H #include #include #include #include #include #include #include #include #include class SheetView; // Canvas width should be 2^31, but it doesn't work ok // 2^30 works ok, so let's use that, still gives a lot // of headroom for real large recordings #if ! defined (Q_WS_WIN) #define MAX_CANVAS_WIDTH 1073741824 #define MAX_CANVAS_HEIGHT 1073741824 #else #define MAX_CANVAS_WIDTH 107374182 #define MAX_CANVAS_HEIGHT 107374182 #endif class ViewItem : public ContextItem, public QGraphicsItem { Q_OBJECT #if QT_VERSION >= 0x040600 Q_INTERFACES(QGraphicsItem) #endif public: ViewItem(ViewItem* parentViewItem=0, ContextItem* parentContext=0); ~ViewItem() {}; enum {Type = UserType + 1}; QRectF boundingRect() const; virtual void calculate_bounding_rect() { for (int i=0; i< QGraphicsItem::children().size(); ++i) { QGraphicsItem* item = QGraphicsItem::children().at(i); if (is_viewitem(item)) { ((ViewItem*)item)->calculate_bounding_rect(); } } } virtual int get_childview_y_offset() const {return 0;} virtual int type() const; virtual int get_height() const {return (int)m_boundingRect.height();} /** * Reimplement and call update() in the reimplementation * to make the theme change visible. */ virtual void load_theme_data() {}; SheetView* get_sheetview() const {return m_sv;} static bool is_viewitem(QGraphicsItem* item) { return item->type() == Type; } protected: SheetView* m_sv; ViewItem* m_parentViewItem; QRectF m_boundingRect; }; inline QRectF ViewItem::boundingRect() const {return m_boundingRect;} inline int ViewItem::type() const {return Type;} #endif //eof traverso-0.49.4/src/sheetcanvas/PanelLed.cpp000644 001750 001750 00000003517 11163362147 021254 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2006 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: PanelLed.cpp,v 1.1 2008/01/21 16:17:29 r_sijrier Exp $ */ #include "PanelLed.h" #include #include "TrackPanelView.h" #include // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" const int LED_Y = 18; const int LED_WIDTH = 35; const int LED_HEIGHT = 14; PanelLed::PanelLed(TrackPanelView* parent, int xpos, char* on, char* off ) : QObject(parent), m_xpos(xpos), onType(on), offType(off) { m_isOn = false; } PanelLed::~PanelLed( ) { PENTERDES2; } void PanelLed::paint(QPainter *painter) { if (m_isOn) { painter->drawPixmap(m_xpos, LED_Y, find_pixmap(onType)); } else { painter->drawPixmap(m_xpos, LED_Y, find_pixmap(offType)); } } void PanelLed::ison_changed( bool isOn ) { PENTER2; m_isOn = isOn; } void PanelLed::set_on_type( char * type ) { onType = type; } void PanelLed::set_of_type( char * type ) { offType = type; } void PanelLed::set_xpos( int x ) { m_xpos = x; } //eof traverso-0.49.4/src/sheetcanvas/PluginChainView.cpp000644 001750 001750 00000007024 11163362147 022621 0ustar00remonremon000000 000000 /* Copyright (C) 2006-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "PluginChainView.h" #include #include "TrackView.h" #include "SheetView.h" #include "ClipsViewPort.h" #include "PluginView.h" #include "Themer.h" #include #include #include #include "Sheet.h" #if defined (LV2_SUPPORT) #include #endif #include // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" PluginChainView::PluginChainView(SheetView* sv, ViewItem* parent, PluginChain* chain) : ViewItem(parent, parent) , m_pluginchain(chain) { PENTERCONS; setZValue(parent->zValue() + 10); m_sv = sv; calculate_bounding_rect(); foreach(Plugin* plugin, chain->get_plugin_list()) { add_new_pluginview(plugin); } connect(chain, SIGNAL(pluginAdded(Plugin*)), this, SLOT(add_new_pluginview(Plugin*))); connect(chain, SIGNAL(pluginRemoved(Plugin*)), this, SLOT(remove_pluginview(Plugin*))); connect(m_sv->get_clips_viewport()->horizontalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(scrollbar_value_changed(int))); connect(m_sv->get_sheet(), SIGNAL(modeChanged()), this, SLOT(set_view_mode())); set_view_mode(); } PluginChainView::~PluginChainView( ) { PENTERDES2; } void PluginChainView::add_new_pluginview( Plugin * plugin ) { PluginView* view = new PluginView(this, m_pluginchain, plugin, m_pluginViews.size()); int x = 6; foreach(PluginView* view, m_pluginViews) { x += (int)view->boundingRect().width() + 6; } view->setPos(x, m_boundingRect.height() - view->boundingRect().height()); m_pluginViews.append(view); show(); } void PluginChainView::remove_pluginview( Plugin * plugin ) { foreach(PluginView* view, m_pluginViews) { if (view->get_plugin() == plugin) { m_pluginViews.removeAll(view); delete view; } } for (int i=0; iset_index(i); } int x = 6; foreach(PluginView* view, m_pluginViews) { view->setPos(x, m_boundingRect.height() - view->boundingRect().height()); x += (int)view->boundingRect().width() + 6; } if (!m_pluginViews.size()) { hide(); } m_parentViewItem->update(); } void PluginChainView::paint( QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget ) { Q_UNUSED(painter); Q_UNUSED(option); Q_UNUSED(widget); } void PluginChainView::scrollbar_value_changed(int value) { setPos(value, y()); } void PluginChainView::set_view_mode() { if (m_sv->get_sheet()->get_mode() == Sheet::EFFECTS) { show(); } else { hide(); } } void PluginChainView::calculate_bounding_rect() { int y = (int)(m_parentViewItem->boundingRect().height()); m_boundingRect = QRectF(0, 0, 0, y); setPos(pos().x(), - 2); ViewItem::calculate_bounding_rect(); } traverso-0.49.4/src/sheetcanvas/SheetWidget.h000644 001750 001750 00000004755 11163362147 021456 0ustar00remonremon000000 000000 /* Copyright (C) 2006-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: SheetWidget.h,v 1.2 2009/02/23 20:12:58 r_sijrier Exp $ */ #ifndef SONG_WIDGET_H #define SONG_WIDGET_H #include #include "ViewItem.h" class QGridLayout; class QGraphicsScene; class QScrollBar; class TrackPanelViewPort; class TimeLineViewPort; class ClipsViewPort; class SheetPanelViewPort; class Project; class Sheet; class Command; class SheetView; class SheetPanelGain : public ViewItem { Q_OBJECT public: SheetPanelGain(ViewItem* parent, Sheet* sheet); SheetPanelGain(){} void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); public slots: Command* gain_increment(); Command* gain_decrement(); private slots: void update_gain() {update();} private: Sheet* m_sheet; }; class SheetPanelView : public ViewItem { Q_OBJECT public: SheetPanelView(QGraphicsScene* scene, Sheet* sheet); ~SheetPanelView() {} void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); private: SheetPanelGain* m_gainview; Sheet* m_sheet; }; class SheetWidget : public QFrame { Q_OBJECT public: SheetWidget(Sheet* sheet, QWidget* parent=0); ~SheetWidget(); // void set_use_opengl(bool useOpenGL); Sheet* get_sheet() const; SheetView* get_sheetview() const; protected: QSize minimumSizeHint () const; QSize sizeHint () const; private: SheetView* m_sv; Sheet* m_sheet; QGridLayout* m_mainLayout; TrackPanelViewPort* m_trackPanel; TimeLineViewPort* m_timeLine; ClipsViewPort* m_clipsViewPort; SheetPanelViewPort* m_sheetPanelVP; QGraphicsScene* m_scene; QScrollBar* m_vScrollBar; QScrollBar* m_hScrollBar; // bool m_usingOpenGL; friend class SheetView; private slots: void load_theme_data(); }; #endif //eof traverso-0.49.4/src/sheetcanvas/TimeLineView.cpp000644 001750 001750 00000027300 11163362147 022125 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "TimeLineView.h" #include #include "Themer.h" #include "SheetView.h" #include "MarkerView.h" #include "TimeLineViewPort.h" #include "SnapList.h" #include #include #include #include #include #include #include #include #include #include #include "Information.h" #include "InputEngine.h" #include #include #include // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" #define MARKER_SOFT_SELECTION_DISTANCE 50 DragMarker::DragMarker(MarkerView* mview, qint64 scalefactor, const QString& des) : Command(mview->get_marker(), des) { d = new Data; d->view = mview; m_marker= d->view->get_marker(); d->scalefactor = scalefactor; d->bypassjog = false; } int DragMarker::prepare_actions() { return 1; } int DragMarker::begin_hold() { m_origWhen = m_newWhen = m_marker->get_when(); m_marker->set_snappable(false); d->view->get_sheetview()->start_shuttle(true, true); d->view->set_dragging(true); return 1; } int DragMarker::finish_hold() { d->view->get_sheetview()->start_shuttle(false); d->view->set_dragging(false); delete d; return 1; } int DragMarker::do_action() { m_marker->set_when(m_newWhen); m_marker->set_snappable(true); return 1; } int DragMarker::undo_action() { m_marker->set_when(m_origWhen); m_marker->set_snappable(true); return 1; } void DragMarker::cancel_action() { finish_hold(); undo_action(); } void DragMarker::move_left(bool ) { d->bypassjog = true; // Move 1 pixel to the left TimeRef newpos = TimeRef(m_newWhen - d->scalefactor); if (newpos < TimeRef()) { newpos = TimeRef(); } m_newWhen = newpos; do_action(); } void DragMarker::move_right(bool ) { d->bypassjog = true; // Move 1 pixel to the right m_newWhen = m_newWhen + d->scalefactor; do_action(); } int DragMarker::jog() { if (d->bypassjog) { int diff = d->jogBypassPos - cpointer().x(); if (abs(diff) > 15) { d->bypassjog = false; } else { return 0; } } d->jogBypassPos = cpointer().x(); TimeRef newpos = TimeRef(cpointer().scene_x() * d->scalefactor); if (m_marker->get_timeline()->get_sheet()->is_snap_on()) { SnapList* slist = m_marker->get_timeline()->get_sheet()->get_snap_list(); newpos = slist->get_snap_value(newpos); } if (newpos < TimeRef()) { newpos = TimeRef(); } m_newWhen = newpos; d->view->set_position(int(m_newWhen / d->scalefactor)); d->view->get_sheetview()->update_shuttle_factor(); return 1; } // End DragMarker TimeLineView::TimeLineView(SheetView* view) : ViewItem(0, view->get_sheet()->get_timeline()) , m_blinkingMarker(0) { PENTERCONS2; m_sv = view; m_boundingRect = QRectF(0, 0, MAX_CANVAS_WIDTH, TIMELINE_HEIGHT); m_timeline = m_sv->get_sheet()->get_timeline(); load_theme_data(); // Create MarkerViews for existing markers foreach(Marker* marker, m_timeline->get_markers()) { add_new_marker_view(marker); } // Make connections to the 'core' connect(m_timeline, SIGNAL(markerAdded(Marker*)), this, SLOT(add_new_marker_view(Marker*))); connect(m_timeline, SIGNAL(markerRemoved(Marker*)), this, SLOT(remove_marker_view(Marker*))); setAcceptsHoverEvents(true); m_zooms[524288 * 640] = "20:00.000"; m_zooms[262144 * 640] = "10:00.000"; m_zooms[131072 * 640] = "5:00.000"; m_zooms[ 65536 * 640] = "2:30.000"; m_zooms[ 32768 * 640] = "1:00.000"; m_zooms[ 16384 * 640] = "0:30.000"; m_zooms[ 8192 * 640] = "0:20.000"; m_zooms[ 4096 * 640] = "0:10.000"; m_zooms[ 2048 * 640] = "0:05.000"; m_zooms[ 1024 * 640] = "0:02.000"; m_zooms[ 512 * 640] = "0:01.000"; m_zooms[ 256 * 640] = "0:00.800"; m_zooms[ 128 * 640] = "0:00.400"; m_zooms[ 64 * 640] = "0:00.200"; m_zooms[ 32 * 640] = "0:00.100"; m_zooms[ 16 * 640] = "0:00.050"; m_zooms[ 8 * 640] = "0:00.020"; m_zooms[ 4 * 640] = "0:00.010"; m_zooms[ 2 * 640] = "0:00.005"; m_zooms[ 1 * 640] = "0:00.002"; } TimeLineView::~TimeLineView() { PENTERDES; } void TimeLineView::hzoom_changed( ) { update(); } void TimeLineView::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) { PENTER3; Q_UNUSED(widget); painter->save(); // When the scrollarea moves by a small value, the text // can be screwed up, so give it some room, 100 pixels should do! int xstart = (int) option->exposedRect.x() - 100; int pixelcount = (int) option->exposedRect.width() + 100; int expheight = (int) option->exposedRect.height(); int top = (int) option->exposedRect.top(); bool paintText = top > 28 && expheight < 2 ? false : true; if (xstart < 0) { xstart = 0; } painter->setClipRect(m_boundingRect); int height = TIMELINE_HEIGHT; painter->fillRect(xstart, 0, pixelcount, height, themer()->get_color("Timeline:background") ); painter->setPen(themer()->get_color("Timeline:text")); painter->setFont( themer()->get_font("Timeline:fontscale:label") ); TimeRef major; if (m_zooms.contains(m_sv->timeref_scalefactor)) { major = msms_to_timeref(m_zooms[m_sv->timeref_scalefactor]); } else { major = 120 * m_sv->timeref_scalefactor; } // minor is double so they line up right with the majors, // despite not always being an even number of frames // @Ben : is still still the same when using TimeRef based calculations? double minor = double(major/double(10)); TimeRef firstLocation = TimeRef(xstart * m_sv->timeref_scalefactor); TimeRef lastLocation = TimeRef(xstart * m_sv->timeref_scalefactor + pixelcount * m_sv->timeref_scalefactor); int xstartoffset = m_sv->hscrollbar_value(); painter->setMatrixEnabled(false); TimeRef factor = (firstLocation/major)*major; // Draw minor ticks TimeRef range((lastLocation-firstLocation+major) / minor); for (qint64 i = 0; i < range.universal_frame(); i++ ) { int x = (int)((factor + i * minor) / m_sv->timeref_scalefactor) - xstartoffset; painter->drawLine(x, height - 5, x, height - 1); } // Draw major ticks for (TimeRef location = factor; location < lastLocation; location += major) { int x = int(location/m_sv->timeref_scalefactor - xstartoffset); painter->drawLine(x, height - 13, x, height - 1); if (paintText) { painter->drawText(x + 4, height - 8, timeref_to_text(location, m_sv->timeref_scalefactor)); } } painter->restore(); } void TimeLineView::calculate_bounding_rect() { update(); ViewItem::calculate_bounding_rect(); } void TimeLineView::add_new_marker_view(Marker * marker) { MarkerView* view = new MarkerView(marker, m_sv, this); view->set_active(false); m_markerViews.append(view); view->update(); } void TimeLineView::remove_marker_view(Marker * marker) { foreach(MarkerView* view, m_markerViews) { if (view->get_marker() == marker) { m_markerViews.removeAll(view); scene()->removeItem(view); m_blinkingMarker = 0; delete view; return; } } } Command* TimeLineView::add_marker() { QPointF point = mapFromScene(cpointer().scene_pos()); TimeRef when(point.x() * m_sv->timeref_scalefactor); return add_marker_at(when); } Command* TimeLineView::add_marker_at_playhead() { return add_marker_at(m_sv->get_sheet()->get_transport_location()); } Command* TimeLineView::add_marker_at(const TimeRef when) { CommandGroup* group = new CommandGroup(m_timeline, ""); // check if it is the first marker added to the timeline if (!m_timeline->get_markers().size()) { if (when > TimeRef()) { // add one at the beginning of the sheet Marker* m = new Marker(m_timeline, TimeRef(), Marker::CDTRACK); m->set_description(""); group->add_command(m_timeline->add_marker(m)); } TimeRef lastlocation = m_sv->get_sheet()->get_last_location(); if (when < lastlocation) { // add one at the end of the sheet Marker* me = new Marker(m_timeline, lastlocation, Marker::ENDMARKER); me->set_description(tr("End")); group->add_command(m_timeline->add_marker(me)); } } Marker* marker = new Marker(m_timeline, when, Marker::CDTRACK); marker->set_description(""); group->setText(tr("Add Marker")); group->add_command(m_timeline->add_marker(marker)); return group; } Command* TimeLineView::playhead_to_marker() { update_softselected_marker(QPoint(cpointer().on_first_input_event_scene_x(), cpointer().on_first_input_event_scene_y())); if (m_blinkingMarker) { m_sv->get_sheet()->set_transport_pos(m_blinkingMarker->get_marker()->get_when()); return 0; } return ie().did_not_implement(); } Command* TimeLineView::remove_marker() { if (m_blinkingMarker) { Marker* marker = m_blinkingMarker->get_marker(); if (marker->get_type() == Marker::ENDMARKER && m_markerViews.size() > 1) { info().information(tr("You have to remove all other markers first.")); return ie().failure(); } return m_timeline->remove_marker(marker); } return 0; } void TimeLineView::update_softselected_marker(QPoint pos) { MarkerView* prevMarker = m_blinkingMarker; if (m_markerViews.size()) { m_blinkingMarker = m_markerViews.first(); } if (! m_blinkingMarker) { return; } int x = pos.x(); int blinkMarkerDist = abs(x - m_blinkingMarker->position()); foreach(MarkerView* markerView, m_markerViews) { int markerDist = abs(x - markerView->position()); fflush(stdout); if (markerDist < blinkMarkerDist) { m_blinkingMarker = markerView; blinkMarkerDist = abs(x - m_blinkingMarker->position()); } } if (blinkMarkerDist > MARKER_SOFT_SELECTION_DISTANCE) { m_blinkingMarker = 0; } if (prevMarker && (prevMarker != m_blinkingMarker) ) { prevMarker->set_active(false); if (m_blinkingMarker) { m_blinkingMarker->set_active(true); } } if (!prevMarker && m_blinkingMarker) { m_blinkingMarker->set_active(true); } } void TimeLineView::hoverEnterEvent ( QGraphicsSceneHoverEvent * event ) { Q_UNUSED(event); if (m_blinkingMarker) { m_blinkingMarker->set_active(true); } } void TimeLineView::hoverLeaveEvent ( QGraphicsSceneHoverEvent * event ) { Q_UNUSED(event); if (ie().is_holding()) { event->ignore(); return; } if (m_blinkingMarker) { // TODO add these functions, or something else to // let the user know which marker is to be moved! m_blinkingMarker->set_active(false); m_blinkingMarker = 0; } } void TimeLineView::hoverMoveEvent ( QGraphicsSceneHoverEvent * event ) { QPoint pos((int)event->pos().x(), (int)event->pos().y()); update_softselected_marker(pos); } Command * TimeLineView::drag_marker() { update_softselected_marker(QPoint(cpointer().on_first_input_event_scene_x(), cpointer().on_first_input_event_scene_y())); if (m_blinkingMarker) { return new DragMarker(m_blinkingMarker, m_sv->timeref_scalefactor, tr("Drag Marker")); } return ie().did_not_implement(); } Command * TimeLineView::clear_markers() { CommandGroup* group = new CommandGroup(m_timeline, tr("Clear Markers")); foreach(Marker *m, m_timeline->get_markers()) { group->add_command(m_timeline->remove_marker(m)); } return group; } void TimeLineView::load_theme_data() { // TODO Load pixmap, fonts, colors from themer() !! calculate_bounding_rect(); } traverso-0.49.4/src/sheetcanvas/CurveView.cpp000644 001750 001750 00000037560 11163362147 021514 0ustar00remonremon000000 000000 /* Copyright (C) 2006-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "CurveView.h" #include "SheetView.h" #include "CurveNodeView.h" #include "ClipsViewPort.h" #include #include "AudioDevice.h" #include #include #include #include #include #include #include "CommandGroup.h" #include #define NODE_SOFT_SELECTION_DISTANCE 40 DragNode::DragNode(CurveNode* node, CurveView* curveview, qint64 scalefactor, TimeRef rangeMin, TimeRef rangeMax, const QString& des) : Command(curveview->get_context(), des) , d(new Private) { m_node = node; d->rangeMin = rangeMin; d->rangeMax = rangeMax; d->curveView = curveview; d->scalefactor = scalefactor; d->verticalOnly = false; } void DragNode::set_vertical_only() { d->verticalOnly = true; } int DragNode::prepare_actions() { return 1; } int DragNode::finish_hold() { delete d; return 1; } void DragNode::cancel_action() { delete d; undo_action(); } int DragNode::begin_hold() { m_origWhen = m_newWhen = m_node->get_when(); m_origValue = m_newValue = m_node->get_value(); d->mousepos = QPoint(cpointer().on_first_input_event_x(), cpointer().on_first_input_event_y()); return 1; } int DragNode::do_action() { m_node->set_when_and_value(m_newWhen, m_newValue); return 1; } int DragNode::undo_action() { m_node->set_when_and_value(m_origWhen, m_origValue); return 1; } void DragNode::move_up(bool ) { m_newValue = m_newValue + ( 1 / d->curveView->boundingRect().height()); calculate_and_set_node_values(); } void DragNode::move_down(bool ) { m_newValue = m_newValue - ( 1 / d->curveView->boundingRect().height()); calculate_and_set_node_values(); } void DragNode::set_cursor_shape(int useX, int useY) { cpointer().get_viewport()->set_holdcursor(":/cursorHoldLrud"); } int DragNode::jog() { QPoint mousepos = cpointer().pos(); int dx, dy; dx = mousepos.x() - d->mousepos.x(); dy = mousepos.y() - d->mousepos.y(); d->mousepos = mousepos; if (!d->verticalOnly) { m_newWhen = m_newWhen + dx * d->scalefactor; } m_newValue = m_newValue - ( dy / d->curveView->boundingRect().height()); TimeRef startoffset = d->curveView->get_start_offset(); if ( ((TimeRef(m_newWhen) - startoffset) / d->scalefactor) > d->curveView->boundingRect().width()) { m_newWhen = double(d->curveView->boundingRect().width() * d->scalefactor + startoffset.universal_frame()); } if ((TimeRef(m_newWhen) - startoffset) < TimeRef()) { m_newWhen = startoffset.universal_frame(); } return calculate_and_set_node_values(); } int DragNode::calculate_and_set_node_values() { if (m_newValue < 0.0) { m_newValue = 0.0; } if (m_newValue > 1.0) { m_newValue = 1.0; } if (m_newWhen < 0.0) { m_newWhen = 0.0; } if (m_newWhen < d->rangeMin) { m_newWhen = double(d->rangeMin.universal_frame()); } else if (d->rangeMax != qint64(-1) && m_newWhen > d->rangeMax) { m_newWhen = double(d->rangeMax.universal_frame()); } // NOTE: this obviously only makes sense when the Node == GainEnvelope Node // Use a delegate (or something similar) in the future that set's the correct value. float dbFactor = coefficient_to_dB(m_newValue); cpointer().get_viewport()->set_holdcursor_text(QByteArray::number(dbFactor, 'f', 2).append(" dB")); cpointer().get_viewport()->set_holdcursor_pos(d->mousepos + QPoint(d->curveView->get_sheetview()->hscrollbar_value(), d->curveView->get_sheetview()->vscrollbar_value()) - QPoint(16, 16)); return do_action(); } CurveView::CurveView(SheetView* sv, ViewItem* parentViewItem, Curve* curve) : ViewItem(parentViewItem, curve) , m_curve(curve) { setZValue(parentViewItem->zValue() + 1); m_sv = sv; load_theme_data(); m_blinkColorDirection = 1; m_blinkingNode = 0; m_startoffset = TimeRef(); m_guicurve = new Curve(0); m_guicurve->set_sheet(sv->get_sheet()); apill_foreach(CurveNode* node, CurveNode, m_curve->get_nodes()) { add_curvenode_view(node); } connect(&m_blinkTimer, SIGNAL(timeout()), this, SLOT(update_blink_color())); connect(m_curve, SIGNAL(nodeAdded(CurveNode*)), this, SLOT(add_curvenode_view(CurveNode*))); connect(m_curve, SIGNAL(nodeRemoved(CurveNode*)), this, SLOT(remove_curvenode_view(CurveNode*))); connect(m_curve, SIGNAL(nodePositionChanged()), this, SLOT(node_moved())); connect(m_sv->get_sheet(), SIGNAL(modeChanged()), this, SLOT(set_view_mode())); setAcceptsHoverEvents(true); set_view_mode(); } CurveView::~ CurveView( ) { m_guicurve->clear_curve(); delete m_guicurve; } static bool smallerpoint(const QPointF& left, const QPointF& right) { return left.x() < right.x(); } void CurveView::paint( QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget ) { Q_UNUSED(widget); PENTER2; int xstart = (int) option->exposedRect.x(); int pixelcount = (int) option->exposedRect.width()+1; int height = int(m_boundingRect.height()); int offset = int(m_startoffset / m_sv->timeref_scalefactor); QPen pen; if (m_sv->get_sheet()->get_mode() == Sheet::EFFECTS) { pen.setColor(themer()->get_color("Curve:active")); } else { pen.setColor(themer()->get_color("Curve:inactive")); } painter->save(); painter->setPen(pen); painter->setClipRect(m_boundingRect); if (m_nodeViews.size() == 1) { int y = int(height - (m_nodeViews.first()->value * height)); painter->drawLine(xstart, y, xstart + pixelcount, y); painter->restore(); return; } if (m_nodeViews.first()->when > xstart) { int y = int(height - (m_nodeViews.first()->value * height)); int length = int(m_nodeViews.first()->when) - xstart - offset; if (length > 0) { painter->drawLine(xstart, y, xstart + length, y); xstart += length; pixelcount -= length; } if (pixelcount <= 0) { painter->restore(); return; } } if (m_nodeViews.last()->when < (xstart + pixelcount + offset)) { int y = int(height - (m_nodeViews.last()->value * height)); int x = int(m_nodeViews.last()->when) - offset; int length = (xstart + pixelcount) - int(m_nodeViews.last()->when) + offset; if (length > 0) { painter->drawLine(x, y, x + length - 1, y); pixelcount -= length; } if (pixelcount <= 0) { painter->restore(); return; } } // Path's need an additional pixel righ/left to be painted correctly. // FadeView get_curve adjusts for this, if changing these // values, also change the adjustment in FadeView::get_curve() !!! pixelcount += 2; xstart -= 1; if (xstart < 0) { xstart = 0; } painter->setRenderHint(QPainter::Antialiasing); QPolygonF polygon; float vector[pixelcount]; // printf("range: %d\n", (int)m_nodeViews.last()->pos().x()); m_guicurve->get_vector(xstart + offset, xstart + pixelcount + offset, vector, pixelcount); for (int i=0; ix(); if ( (x > xstart) && x < (xstart + pixelcount)) { polygon << QPointF( x + view->boundingRect().width() / 2, (height - (view->get_curve_node()->get_value() * height)) ); } } // Which means we have to sort the polygon *sigh* (rather cpu costly, but what can I do?) qSort(polygon.begin(), polygon.end(), smallerpoint); /* for (int i=0; idrawPath(path); if (xstart <= 100) { painter->setFont(themer()->get_font("CurveView:fontscale:label")); painter->drawText(10, (int)(m_boundingRect.height() - 14), "Gain Curve"); } painter->restore(); } int CurveView::get_vector(int xstart, int pixelcount, float* arg) { if (m_guicurve->get_nodes().size() == 1 && ((CurveNode*)m_guicurve->get_nodes().first())->value == 1.0) { return 0; } m_guicurve->get_vector(xstart, xstart + pixelcount, arg, pixelcount); return 1; } void CurveView::add_curvenode_view(CurveNode* node) { CurveNodeView* nodeview = new CurveNodeView(m_sv, this, node, m_guicurve); m_nodeViews.append(nodeview); AddRemove* cmd = (AddRemove*) m_guicurve->add_node(nodeview, false); cmd->set_instantanious(true); Command::process_command(cmd); qSort(m_nodeViews.begin(), m_nodeViews.end(), Curve::smallerNode); update_softselected_node(cpointer().pos()); update(); } void CurveView::remove_curvenode_view(CurveNode* node) { apill_foreach(CurveNodeView* nodeview, CurveNodeView, m_nodeViews) { if (nodeview->get_curve_node() == node) { m_nodeViews.removeAll(nodeview); if (nodeview == m_blinkingNode) { update_softselected_node(cpointer().pos()); } AddRemove* cmd = (AddRemove*) m_guicurve->remove_node(nodeview, false); cmd->set_instantanious(true); Command::process_command(cmd); scene()->removeItem(nodeview); delete nodeview; update(); return; } } } void CurveView::calculate_bounding_rect() { int y = m_parentViewItem->get_childview_y_offset(); m_boundingRect = QRectF(0, 0, m_parentViewItem->boundingRect().width(), m_parentViewItem->get_height()); setPos(0, y); ViewItem::calculate_bounding_rect(); } void CurveView::hoverEnterEvent ( QGraphicsSceneHoverEvent * event ) { Q_UNUSED(event); m_blinkTimer.start(40); } void CurveView::hoverLeaveEvent ( QGraphicsSceneHoverEvent * event ) { Q_UNUSED(event); if (ie().is_holding()) { event->ignore(); return; } m_blinkTimer.stop(); if (m_blinkingNode) { m_blinkingNode->set_color(themer()->get_color("CurveNode:default")); m_blinkingNode->reset_size(); m_blinkingNode = 0; } } void CurveView::hoverMoveEvent ( QGraphicsSceneHoverEvent * event ) { QPoint point((int)event->pos().x(), (int)event->pos().y()); update_softselected_node(point); if (m_blinkingNode) { setCursor(themer()->get_cursor("CurveNode")); } else { setCursor(themer()->get_cursor("AudioClip")); } // printf("mouse x,y pos %d,%d\n", point.x(), point.y()); // printf("\n"); } void CurveView::update_softselected_node( QPoint pos , bool force) { if (ie().is_holding() && !force) { return; } CurveNodeView* prevNode = m_blinkingNode; m_blinkingNode = m_nodeViews.first(); if (! m_blinkingNode) return; foreach(CurveNodeView* nodeView, m_nodeViews) { QPoint nodePos((int)nodeView->pos().x(), (int)nodeView->pos().y()); // printf("node x,y pos %d,%d\n", nodePos.x(), nodePos.y()); int nodeDist = (pos - nodePos).manhattanLength(); int blinkNodeDist = (pos - QPoint((int)m_blinkingNode->x(), (int)m_blinkingNode->y())).manhattanLength(); if (nodeDist < blinkNodeDist) { m_blinkingNode = nodeView; } } if ((pos - QPoint(4, 4) - QPoint((int)m_blinkingNode->x(), (int)m_blinkingNode->y())).manhattanLength() > NODE_SOFT_SELECTION_DISTANCE) { m_blinkingNode = 0; } if (prevNode && (prevNode != m_blinkingNode) ) { prevNode->set_color(themer()->get_color("CurveNode:default")); prevNode->update(); prevNode->reset_size(); if (m_blinkingNode) { m_blinkingNode->set_selected(); } } if (!prevNode && m_blinkingNode) { m_blinkingNode->set_selected(); m_blinkDarkness = 100; } } void CurveView::update_blink_color() { if (!m_blinkingNode) { return; } m_blinkDarkness += (6 * m_blinkColorDirection); if (m_blinkDarkness >= 100) { m_blinkColorDirection *= -1; m_blinkDarkness = 100; } else if (m_blinkDarkness <= 40) { m_blinkColorDirection *= -1; m_blinkDarkness = 40; } QColor blinkColor = themer()->get_color("CurveNode:blink"); m_blinkingNode->set_color(blinkColor.light(m_blinkDarkness)); m_blinkingNode->update(); } Command* CurveView::add_node() { PENTER; QPointF point = mapFromScene(cpointer().scene_pos()); emit curveModified(); double when = point.x() * double(m_sv->timeref_scalefactor) + m_startoffset.universal_frame(); double value = (m_boundingRect.height() - point.y()) / m_boundingRect.height(); CurveNode* node = new CurveNode(m_curve, when, value); return m_curve->add_node(node); } Command* CurveView::remove_node() { PENTER; QPointF origPos(mapFromScene(QPoint(cpointer().on_first_input_event_scene_x(), cpointer().on_first_input_event_scene_y()))); emit curveModified(); update_softselected_node(QPoint((int)origPos.x(), (int)origPos.y()), true); if (m_blinkingNode) { CurveNode* node = m_blinkingNode->get_curve_node(); m_blinkingNode = 0; return m_curve->remove_node(node); } return ie().did_not_implement(); } Command* CurveView::drag_node() { PENTER; QPointF origPos(mapFromScene(QPoint(cpointer().on_first_input_event_scene_x(), cpointer().on_first_input_event_scene_y()))); update_softselected_node(QPoint((int)origPos.x(), (int)origPos.y()), true); if (m_blinkingNode) { TimeRef min(qint64(0)); TimeRef max(qint64(-1)); APILinkedList nodeList = m_curve->get_nodes(); CurveNode* node = m_blinkingNode->get_curve_node(); int index = nodeList.indexOf(node); emit curveModified(); if (index > 0) { min = qint64(((CurveNode*)nodeList.at(index-1))->get_when() + 1); } if (nodeList.size() > (index + 1)) { max = qint64(((CurveNode*)nodeList.at(index+1))->get_when() - 1); } return new DragNode(m_blinkingNode->get_curve_node(), this, m_sv->timeref_scalefactor, min, max, tr("Drag Node")); } return ie().did_not_implement(); } Command * CurveView::drag_node_vertical_only() { DragNode* drag = qobject_cast(drag_node()); if (!drag) { return 0; } drag->set_vertical_only(); return drag; } void CurveView::node_moved( ) { if (!m_blinkingNode) { update(); return; } CurveNodeView* prev = 0; CurveNodeView* next = 0; int index = m_nodeViews.indexOf(m_blinkingNode); int xleft = (int) m_blinkingNode->x(), xright = (int) m_blinkingNode->x(); int leftindex = index; int count = 0; if (m_blinkingNode == m_nodeViews.first()) { xleft = 0; } else { while ( leftindex > 0 && count < 2) { leftindex--; count++; } prev = m_nodeViews.at(leftindex); } count = 0; int rightindex = index; if (m_blinkingNode == m_nodeViews.last()) { xright = (int) m_boundingRect.width(); } else { while (rightindex < (m_nodeViews.size() - 1) && count < 2) { rightindex++; count++; } next = m_nodeViews.at(rightindex); } if (prev) xleft = (int) prev->x(); if (next) xright = (int) next->x(); update(xleft, 0, xright - xleft + 3, m_boundingRect.height()); } void CurveView::set_view_mode() { if (m_sv->get_sheet()->get_mode() == Sheet::EFFECTS) { show(); } else { hide(); } } void CurveView::load_theme_data() { calculate_bounding_rect(); } void CurveView::set_start_offset(const TimeRef& offset) { m_startoffset = offset; } bool CurveView::has_nodes() const { return m_guicurve->get_nodes().size() > 1 ? true : false; } float CurveView::get_default_value() { return ((CurveNode*)m_guicurve->get_nodes().first())->value; } Command * CurveView::remove_all_nodes() { CommandGroup* group = new CommandGroup(m_curve, tr("Clear Nodes")); apill_foreach(CurveNode* node, CurveNode, m_curve->get_nodes()) { group->add_command(m_curve->remove_node(node)); } return group; } traverso-0.49.4/src/sheetcanvas/MarkerView.cpp000644 001750 001750 00000012231 11163362147 021635 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "MarkerView.h" #include "SheetView.h" #include "LineView.h" #include "Themer.h" #include "ClipsViewPort.h" #include "PositionIndicator.h" #include #include #include #include #include #include #include #include "Debugger.h" MarkerView::MarkerView(Marker* marker, SheetView* sv, ViewItem* parentView) : ViewItem(parentView, marker) , m_dragging(false) { PENTERCONS2; m_sv = sv; m_marker = marker; m_line = new LineView(this); set_active(false); m_posIndicator = 0; QFontMetrics fm(themer()->get_font("Timeline:marker")); m_ascent = fm.ascent(); m_width = fm.width("NI"); // use any two letters to set the width of the marker indicator m_line->setPos(m_width / 2, m_ascent); load_theme_data(); connect(m_marker, SIGNAL(positionChanged()), this, SLOT(update_position())); connect(m_marker, SIGNAL(descriptionChanged()), this, SLOT(update_drawing())); connect(m_marker, SIGNAL(indexChanged()), this, SLOT(update_drawing())); } void MarkerView::paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget) { Q_UNUSED(option); Q_UNUSED(widget); painter->save(); int xstart = (int)option->exposedRect.x(); int clipx = (int)mapToParent(xstart, 0).x(); if (clipx < 0) { painter->setClipRect(-clipx, 0, (int)m_boundingRect.width(), (int)m_boundingRect.height()); } painter->setRenderHint(QPainter::Antialiasing); painter->setFont(themer()->get_font("Timeline:fontscale:marker")); painter->setPen(QColor(Qt::black)); painter->setBrush(m_fillColor); const QPointF pts[3] = { QPointF(0, 0), QPointF(m_width + 0.5, 0), QPointF((m_width+ 0.5)/2, m_ascent) }; painter->drawPolygon(pts, 3); if (m_marker->get_type() == Marker::ENDMARKER) { painter->drawText(m_width + 1, m_ascent-2, m_marker->get_description()); } else { if (m_marker->get_description().length() > 0) { painter->drawText(m_width + 1, m_ascent-2, QString("%1: %2").arg(m_marker->get_index()).arg(m_marker->get_description())); } else { painter->drawText(m_width + 1, m_ascent-2, QString("%1").arg(m_marker->get_index())); } } if (m_dragging) { m_posIndicator->set_value(timeref_to_text(TimeRef((x() + m_width / 2) * m_sv->timeref_scalefactor), m_sv->timeref_scalefactor)); } painter->restore(); } void MarkerView::calculate_bounding_rect() { prepareGeometryChange(); update_position(); QString desc; if (m_marker->get_type() == Marker::ENDMARKER) { desc = m_marker->get_description(); } else { desc = QString("%1: %2").arg(m_marker->get_index()).arg(m_marker->get_description()); } QFontMetrics fm(themer()->get_font("Timeline:fontscale:marker")); int descriptionwidth = fm.width(desc) + 1; m_line->set_bounding_rect(QRectF(0, 0, 1, m_sv->get_clips_viewport()->sceneRect().height())); m_line->setPos(m_width / 2, m_ascent); m_boundingRect = QRectF(-1, 0, m_width + descriptionwidth, m_ascent); } void MarkerView::update_position() { // markerwidth / 2 == center of markerview ! setPos((m_marker->get_when() / m_sv->timeref_scalefactor) - (m_width / 2), 0); } int MarkerView::position() { return (int)(pos().x() + m_width / 2); } void MarkerView::set_position(int i) { setPos(i - m_width / 2, 0); } void MarkerView::load_theme_data() { if (m_marker->get_type() == Marker::ENDMARKER) { m_fillColor = themer()->get_color("Marker:end"); } else { m_fillColor = themer()->get_color("Marker:default"); } calculate_bounding_rect(); } void MarkerView::set_active(bool b) { m_active = b; if (b) { if (m_marker->get_type() == Marker::ENDMARKER) { m_fillColor = themer()->get_color("Marker:blinkend"); } else { m_fillColor = themer()->get_color("Marker:blink"); } m_line->set_color(QColor(0, 0, 0, 140)); } else { if (m_marker->get_type() == Marker::ENDMARKER) { m_fillColor = themer()->get_color("Marker:end"); } else { m_fillColor = themer()->get_color("Marker:default"); } m_line->set_color(QColor(0, 0, 0, 45)); } m_line->update(); update(); } void MarkerView::update_drawing() { calculate_bounding_rect(); update(); } void MarkerView::set_dragging(bool dragging) { if (dragging) { if (! m_posIndicator) { m_posIndicator = new PositionIndicator(this); m_posIndicator->set_position(15, 0); } } else { if (m_posIndicator) { scene()->removeItem(m_posIndicator); delete m_posIndicator; m_posIndicator = 0; } } m_dragging = dragging; } traverso-0.49.4/src/sheetcanvas/PanelLed.h000644 001750 001750 00000002652 11163362147 020720 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2006 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: PanelLed.h,v 1.1 2008/01/21 16:17:29 r_sijrier Exp $ */ #ifndef PANEL_LED_VIEW_H #define PANEL_LED_VIEW_H #include #include class TrackPanelView; class PanelLed : public QObject { Q_OBJECT public: PanelLed(TrackPanelView* view, int xpos, char* on, char* off); ~PanelLed(); void paint(QPainter *painter); void set_on_type(char* type); void set_of_type(char* type); void set_xpos(int x); private: int m_xpos; bool m_isOn; QString onType; QString offType; public slots: void ison_changed(bool isOn); }; #endif //eof traverso-0.49.4/src/sheetcanvas/ClipsViewPort.h000644 001750 001750 00000003045 11163362147 022003 0ustar00remonremon000000 000000 /* Copyright (C) 2006-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef CLIPS_VIEW_PORT_H #define CLIPS_VIEW_PORT_H #include #include #include #include "ViewPort.h" class SheetWidget; class Import; class ClipsViewPort : public ViewPort { Q_OBJECT public: ClipsViewPort(QGraphicsScene* scene, SheetWidget* sw); ~ClipsViewPort() {}; void get_pointed_context_items(QList &list); protected: void resizeEvent(QResizeEvent* e); void paintEvent( QPaintEvent* e); void dragEnterEvent(QDragEnterEvent *event); void dropEvent(QDropEvent *event); void dragMoveEvent(QDragMoveEvent *event); private: SheetWidget* m_sw; QList m_imports; QList m_resourcesImport; Track* importTrack; }; #endif //eof traverso-0.49.4/src/sheetcanvas/TrackPanelViewPort.h000644 001750 001750 00000002351 11163362147 022754 0ustar00remonremon000000 000000 /* Copyright (C) 2006 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: TrackPanelViewPort.h,v 1.1 2008/01/21 16:17:30 r_sijrier Exp $ */ #ifndef TRACK_PANEL_VIEW_PORT_H #define TRACK_PANEL_VIEW_PORT_H #include "ViewPort.h" class SheetWidget; class TrackPanelViewPort : public ViewPort { public: TrackPanelViewPort(QGraphicsScene* scene, SheetWidget* sw); ~TrackPanelViewPort() {}; void get_pointed_context_items(QList &list); private: SheetWidget* m_sw; }; #endif //eof traverso-0.49.4/src/sheetcanvas/Cursors.cpp000644 001750 001750 00000021521 11163362147 021223 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "Cursors.h" #include "SheetView.h" #include "ClipsViewPort.h" #include "AudioDevice.h" #include #include #include #include #include #include // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" #define ANIME_DURATION 1000 #define AUTO_SCROLL_MARGIN 0.05 // autoscroll when within 5% of the clip view port PlayHead::PlayHead(SheetView* sv, Sheet* sheet, ClipsViewPort* vp) : ViewItem(0, sheet) , m_sheet(sheet) , m_vp(vp) { m_sv = sv; check_config(); connect(&(config()), SIGNAL(configChanged()), this, SLOT(check_config())); // TODO: Make duration scale with scalefactor? (nonlinerly?) m_animation.setDuration(ANIME_DURATION); m_animation.setCurveShape(QTimeLine::EaseInOutCurve); connect(m_sheet, SIGNAL(transportStarted()), this, SLOT(play_start())); connect(m_sheet, SIGNAL(transportStopped()), this, SLOT(play_stop())); connect(&m_playTimer, SIGNAL(timeout()), this, SLOT(update_position())); connect(&m_animation, SIGNAL(frameChanged(int)), this, SLOT(set_animation_value(int))); connect(&m_animation, SIGNAL(finished()), this, SLOT(animation_finished())); setZValue(99); } PlayHead::~PlayHead( ) { PENTERDES2; } void PlayHead::check_config( ) { m_mode = (PlayHeadMode) config().get_property("PlayHead", "Scrollmode", ANIMATED_FLIP_PAGE).toInt(); m_follow = config().get_property("PlayHead", "Follow", true).toBool(); m_followDisabled = false; } void PlayHead::paint( QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget ) { Q_UNUSED(option); Q_UNUSED(widget); QColor color; if (m_sheet->is_transport_rolling()) { color = themer()->get_color("Playhead:active"); } else { color = themer()->get_color("Playhead:inactive"); } painter->fillRect(1, 0, (int)m_boundingRect.width() - 2, (int)m_boundingRect.height(), color); } void PlayHead::play_start() { show(); m_followDisabled = false; m_playTimer.start(20); if (m_animation.state() == QTimeLine::Running) { m_animation.stop(); m_animation.setCurrentTime(0); } } void PlayHead::play_stop() { m_playTimer.stop(); if (m_animation.state() == QTimeLine::Running) { m_animation.stop(); } // just one more update so the playhead can paint itself // in the correct color. update(); } void PlayHead::disable_follow() { m_followDisabled = true; } void PlayHead::enable_follow() { m_followDisabled = false; // This function is called after the sheet finished a seek action. // if the sheet is still playing, update our position, and start moving again! if (m_sheet->is_transport_rolling()) { play_start(); } } void PlayHead::update_position() { QPointF newPos(m_sheet->get_transport_location() / m_sv->timeref_scalefactor, 1); qreal playBufferTimePositionCompensation = 0; if (m_sheet->is_transport_rolling()) { playBufferTimePositionCompensation = audiodevice().get_buffer_latency() / m_sv->timeref_scalefactor; } qreal newXPos = newPos.x() - playBufferTimePositionCompensation; if (newXPos < 0.0) { newXPos = 0.0; } newPos.setX(newXPos); if (int(newPos.x()) != int(pos().x()) && (m_animation.state() != QTimeLine::Running)) { setPos(newPos); } else { return; } if ( ! m_follow || m_followDisabled || ! m_sheet->is_transport_rolling()) { return; } int vpWidth = m_vp->viewport()->width(); // When timeref_scalefactor is below 5120, the playhead moves faster then teh view scrolls // so it's better to keep the view centered around the playhead. if (m_mode == CENTERED || (m_sv->timeref_scalefactor <= 10280) ) { // For some reason on some systems the event of // setting the new position doesn't result in // updating the area of the old cursor position // when directly updating the scrollbars afterwards. // processing the event stack manually solves this. qApp->processEvents(); m_sv->set_hscrollbar_value(int(scenePos().x()) - (int)(0.5 * vpWidth)); return; } QPoint vppoint = m_vp->mapFromScene(pos()); if (vppoint.x() < 0 || (vppoint.x() > vpWidth)) { // If the playhead is _not_ in the viewports range, center it in the middle! m_sv->set_hscrollbar_value(int(scenePos().x()) - (int)(0.5 * vpWidth)); } else if (vppoint.x() > ( vpWidth * (1.0 - AUTO_SCROLL_MARGIN) )) { // If the playhead is in the viewports range, and is nearing the end // either start the animated flip page, or flip the page and place the // playhead cursor ~ 1/10 from the left viewport border if (m_mode == ANIMATED_FLIP_PAGE) { if (m_animation.state() != QTimeLine::Running) { m_animFrameRange = (int)(vpWidth * (1.0 - (AUTO_SCROLL_MARGIN * 2))); m_animation.setFrameRange(0, m_animFrameRange); m_animationScrollStartPos = m_sv->hscrollbar_value(); m_animScaleFactor = m_sv->timeref_scalefactor; //during the animation, we stop the play update timer // to avoid unnecessary update/paint events play_stop(); m_animation.setCurrentTime(0); m_animation.start(); } } else { m_sv->set_hscrollbar_value((int) (int(scenePos().x()) - (AUTO_SCROLL_MARGIN * vpWidth)) ); } } } void PlayHead::set_animation_value(int value) { // When the scalefactor changed, stop the animation here as it's no longer valid to run // and reset the animation timeline time back to 0. if (m_animScaleFactor != m_sv->timeref_scalefactor) { m_animation.stop(); m_animation.setCurrentTime(0); animation_finished(); return; } QPointF newPos(m_sheet->get_transport_location() / m_sv->timeref_scalefactor, 0); // calculate the animation x diff. int diff = m_animation.currentValue() * m_animFrameRange; // compensate for the playhead movement. m_animationScrollStartPos += newPos.x() - pos().x(); int newXPos = (int)(m_animationScrollStartPos + diff); if (newPos != pos()) { setPos(newPos); } if (m_sv->hscrollbar_value() != newXPos) { // For some reason on some systems the event of // setting the new position doesn't result in // updating the area of the old cursor position // when directly updating the scrollbars afterwards. // processing the event stack manually solves this. qApp->processEvents(); m_sv->set_hscrollbar_value(newXPos); } } void PlayHead::animation_finished() { if (m_sheet->is_transport_rolling()) { play_start(); } } void PlayHead::set_bounding_rect( QRectF rect ) { m_boundingRect = rect; } bool PlayHead::is_active() { return m_playTimer.isActive(); } void PlayHead::set_active(bool active) { if (active) { play_start(); } else { play_stop(); } } void PlayHead::set_mode( PlayHeadMode mode ) { m_mode = mode; } void PlayHead::toggle_follow( ) { m_follow = ! m_follow; } /**************************************************************/ /* WorkCursor */ /**************************************************************/ WorkCursor::WorkCursor(SheetView* sv, Sheet* sheet) : ViewItem(0, sheet) , m_sheet(sheet) , m_sv(sv) { setZValue(100); } WorkCursor::~WorkCursor( ) { PENTERDES2; } void WorkCursor::paint( QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget ) { Q_UNUSED(option); Q_UNUSED(widget); if (m_pix.height() != int(m_boundingRect.height())) { update_background(); } painter->drawPixmap(0, 0, int(m_boundingRect.width()), int(m_boundingRect.height()), m_pix); } void WorkCursor::update_position() { setPos(m_sheet->get_work_location() / m_sv->timeref_scalefactor, 1); } void WorkCursor::set_bounding_rect( QRectF rect ) { m_boundingRect = rect; } void WorkCursor::update_background() { m_pix = QPixmap(int(m_boundingRect.width()), int(m_boundingRect.height())); m_pix.fill(Qt::transparent); QPainter p(&m_pix); QPen pen; pen.setWidth(4); pen.setStyle(Qt::DashDotLine); pen.setColor(themer()->get_color("Workcursor:default")); p.setPen(pen); p.drawLine(0, 0, int(m_boundingRect.width()), int(m_boundingRect.height())); } traverso-0.49.4/src/sheetcanvas/AudioClipView.cpp000644 001750 001750 00000077250 12357335671 022311 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2009 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include #include #include #include #include "AudioClipView.h" #include "SheetView.h" #include "TrackView.h" #include "FadeView.h" #include "CurveView.h" #include "AudioClip.h" #include "ReadSource.h" #include "InputEngine.h" #include "ContextPointer.h" #include "Sheet.h" #include "ResourcesManager.h" #include "ProjectManager.h" #include "Peak.h" #include "Information.h" #include "Themer.h" #include #include #include #include #include "PluginChain.h" #include #include "dialogs/AudioClipEditDialog.h" #include "Fade.h" #include "AudioDevice.h" // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" AudioClipView::AudioClipView(SheetView* sv, TrackView* parent, AudioClip* clip ) : ViewItem(parent, clip) , m_tv(parent) , m_clip(clip) { PENTERCONS; setZValue(parent->zValue() + 1); m_sv = sv; m_sheet = m_clip->get_sheet(); load_theme_data(); create_brushes(); create_clipinfo_string(); m_waitingForPeaks = false; m_progress = 0; if (FadeCurve* curve = m_clip->get_fade_in()) { add_new_fadeview(curve); } if (FadeCurve* curve = m_clip->get_fade_out()) { add_new_fadeview(curve); } curveView = new CurveView(m_sv, this, m_clip->get_plugin_chain()->get_fader()->get_curve()); // CurveViews don't 'get' their start offset, it's only a property for AudioClips.. // So to be sure the CurveNodeViews start offset get updated as well, // we call curveviews calculate_bounding_rect() function! curveView->set_start_offset(m_clip->get_source_start_location()); curveView->calculate_bounding_rect(); connect(curveView, SIGNAL(curveModified()), m_sv, SLOT(stop_follow_play_head())); connect(m_clip, SIGNAL(muteChanged()), this, SLOT(repaint())); connect(m_clip, SIGNAL(stateChanged()), this, SLOT(clip_state_changed())); connect(m_clip, SIGNAL(lockChanged()), this, SLOT(repaint())); connect(m_clip, SIGNAL(fadeAdded(FadeCurve*)), this, SLOT(add_new_fadeview( FadeCurve*))); connect(m_clip, SIGNAL(fadeRemoved(FadeCurve*)), this, SLOT(remove_fadeview( FadeCurve*))); connect(m_clip, SIGNAL(positionChanged()), this, SLOT(position_changed())); connect(m_sheet, SIGNAL(modeChanged()), this, SLOT(repaint())); if (m_clip->recording_state() == AudioClip::RECORDING) { start_recording(); connect(m_clip, SIGNAL(recordingFinished(AudioClip*)), this, SLOT(finish_recording())); } // setFlags(ItemIsSelectable | ItemIsMovable); setAcceptsHoverEvents(true); setCursor(themer()->get_cursor("AudioClip")); } AudioClipView::~ AudioClipView() { PENTERDES; } void AudioClipView::paint(QPainter* painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { PENTER2; Q_UNUSED(widget); // printf("AudioClipView:: %s PAINT :: exposed rect is: x=%f, y=%f, w=%f, h=%f\n", QS_C(m_clip->get_name()), option->exposedRect.x(), option->exposedRect.y(), option->exposedRect.width(), option->exposedRect.height()); int xstart = qRound(option->exposedRect.x()); int pixelcount = qRound(option->exposedRect.width()); if (pixelcount == 0) { PWARN("AudioClipView::paint : Exposed rectangle has 0 width ????"); return; } painter->save(); painter->setClipRect(m_boundingRect); if (m_clip->is_readsource_invalid()) { painter->fillRect(xstart, 0, pixelcount, m_height, themer()->get_color("AudioClip:invalidreadsource")); draw_clipinfo_area(painter, xstart, pixelcount); painter->setPen(themer()->get_color("AudioClip:contour")); painter->drawRect(xstart, 0, pixelcount, m_height - 1); painter->setPen(Qt::black); painter->setFont( themer()->get_font("AudioClip:fontscale:title") ); painter->drawText(30, 0, 300, m_height, Qt::AlignVCenter, tr("Click to reset AudioFile !")); painter->restore(); return; } bool mousehover = (option->state & QStyle::State_MouseOver) || m_clip->is_moving(); if (m_drawbackground) { if (m_clip->recording_state() == AudioClip::RECORDING) { painter->fillRect(xstart, 0, pixelcount+1, m_height, m_brushBgRecording); } else { if (m_clip->is_muted()) { if (mousehover) painter->fillRect(xstart, 0, pixelcount+1, m_height, m_brushBgMutedHover); else painter->fillRect(xstart, 0, pixelcount+1, m_height, m_brushBgMuted); } else if (m_clip->is_selected()) { if (mousehover) painter->fillRect(xstart, 0, pixelcount+1, m_height, m_brushBgSelectedHover); else painter->fillRect(xstart, 0, pixelcount+1, m_height, m_brushBgSelected); } else { if (mousehover) painter->fillRect(xstart, 0, pixelcount+1, m_height, m_brushBgHover); else painter->fillRect(xstart, 0, pixelcount+1, m_height, m_brushBg); } } } if (m_clip->is_muted()) { m_waveBrush = m_brushFgMuted; } else { if (m_sheet->get_mode() == Sheet::EDIT) { if (mousehover) m_waveBrush = m_brushFgHover; else m_waveBrush = m_brushFg; } else { if (mousehover) m_waveBrush = m_brushFgEditHover; else m_waveBrush = m_brushFgEdit; } } int channels = m_clip->get_channels(); if (channels > 0) { if (m_waitingForPeaks) { PMESG("Waiting for peaks!"); // Hmm, do we paint here something? // Progress info, I think so.... painter->setPen(Qt::black); QRect r(10, 0, 150, m_height); painter->setFont( themer()->get_font("AudioClip:fontscale:title") ); QString si; si.setNum((int)m_progress); if (m_progress == 100) m_progress = 0; QString buildProcess = "Building Peaks: " + si + "%"; painter->drawText(r, Qt::AlignVCenter, buildProcess); } else if (m_clip->recording_state() == AudioClip::NO_RECORDING) { // PROFILE_START; draw_peaks(painter, option->exposedRect.x(), pixelcount); // PROFILE_END("draw peaks"); } } if (m_height > m_mimimumheightforinfoarea) { draw_clipinfo_area(painter, xstart, pixelcount); } // Draw the db lines at 0 and -6 db if (m_drawDbGrid) { draw_db_lines(painter, xstart, pixelcount); } // Draw the contour painter->setPen(themer()->get_color("AudioClip:contour")); int adjust = 0; float round = (m_boundingRect.width() - int(m_boundingRect.width())); if (round < 0.5) { adjust = 1; } QRect rect(0, 0, m_boundingRect.width() - adjust, m_height - 1); painter->drawRect(rect); // Paint a pixmap if the clip is locked if (m_clip->is_locked()) { int center = (int)(m_clip->get_length() / (2 * m_sv->timeref_scalefactor)); painter->drawPixmap(center - 8, m_height - 20, find_pixmap(":/lock")); } painter->restore(); } void AudioClipView::draw_peaks(QPainter* p, qreal xstart, int pixelcount) { PENTER2; Peak* peak = m_clip->get_peak(); if (!peak) { PERROR("No Peak object available for clip %s", QS_C(m_clip->get_name())); return; } bool microView = m_sheet->get_hzoom() < 64 ? 1 : 0; TimeRef clipstartoffset = m_clip->get_source_start_location(); int channels = m_clip->get_channels(); int peakdatacount = microView ? pixelcount : pixelcount * 2; float* pixeldata[channels]; float curveDefaultValue = 1.0; int mixcurvedata = 0; mixcurvedata |= curveView->has_nodes(); int offset = (int)(m_clip->get_source_start_location() / m_sv->timeref_scalefactor); if (!mixcurvedata) { curveDefaultValue = curveView->get_default_value(); } float curvemixdown[peakdatacount]; if (mixcurvedata) { mixcurvedata |= curveView->get_vector(qRound(xstart) + offset, peakdatacount, curvemixdown); } for (int i = 0; i < m_fadeViews.size(); ++i) { FadeView* view = m_fadeViews.at(i); float fademixdown[peakdatacount]; int fademix = 0; if (mixcurvedata) { fademix = view->get_vector(qRound(xstart), peakdatacount, fademixdown); } else { fademix = view->get_vector(qRound(xstart), peakdatacount, curvemixdown); } if (mixcurvedata && fademix) { for (int j=0; jcalculate_peaks( chan, &pixeldata[chan], TimeRef(xstart * m_sv->timeref_scalefactor) + clipstartoffset, peakdatacount, m_sheet->get_hzoom()); if (peakdatacount != availpeaks) { // PWARN("peakdatacount != availpeaks (%d, %d)", peakdatacount, availpeaks); } if (availpeaks == Peak::NO_PEAK_FILE) { connect(peak, SIGNAL(progress(int)), this, SLOT(update_progress_info(int))); connect(peak, SIGNAL(finished()), this, SLOT (peak_creation_finished())); m_waitingForPeaks = true; peak->start_peak_loading(); return; } if (availpeaks == Peak::PERMANENT_FAILURE || availpeaks == Peak::NO_PEAKDATA_FOUND) { return; } if (m_mergedView && channels == 2 && chan == 0) continue; // pixelcount = std::min(pixelcount, availpeaks); // ClassicView uses both positive and negative values, // rectified view: pick the highest value of both // Merged view: calculate highest value for all channels, // and store it in the first channels pixeldata. if (!microView) { // if Rectified View, calculate max of the minimum and maximum value. if (!m_classicView) { for (int i=0, j=0; i < (pixelcount*2); i+=2, ++j) { pixeldata[chan][j] = - fabs(f_max(pixeldata[chan][i], - pixeldata[chan][i+1])); } } if (m_mergedView && channels == 2) { for (int i = 0; i < (pixelcount*2); ++i) { pixeldata[0][i] = f_max(pixeldata[chan - 1][i], pixeldata[chan][i]); } } } if (mixcurvedata) { int curvemixdownpos = 0; if (m_classicView) { for (int i = 0; i < (pixelcount*2); ++i) { pixeldata[chan][i++] *= curvemixdown[curvemixdownpos]; pixeldata[chan][i] *= curvemixdown[curvemixdownpos]; curvemixdownpos++; } } else { for (int i = 0; i < pixelcount; i++) { pixeldata[chan][i] *= curvemixdown[curvemixdownpos]; curvemixdownpos++; } } } p->save(); // calculate the height of the area available for peak drawing // and if the infoarea is displayed, translate the painter // drawing by dy = m_infoAreaHeight int height; if (m_height >= m_mimimumheightforinfoarea) { p->setMatrix(matrix().translate(0, m_infoAreaHeight), true); height = (m_height - m_infoAreaHeight) / channels; } else { height = m_height / channels; } float scaleFactor = ( (float) height * 0.90 / 2) * m_clip->get_gain() * curveDefaultValue; float ytrans; // Draw channel seperator horizontal lines, if needed. if (channels >= 2 && ! m_mergedView && m_classicView && chan >=1 ) { p->save(); if (m_clip->is_selected()) { p->setPen(themer()->get_color("AudioClip:channelseperator:selected")); } else { p->setPen(themer()->get_color("AudioClip:channelseperator")); } ytrans = height * chan; p->setMatrix(matrix().translate(xstart, ytrans), true); p->drawLine(0, 0, pixelcount, 0); p->restore(); } // Microview, paint waveform as polyline if (microView) { m_polygon.clear(); m_polygon.reserve(pixelcount); int bufferPos = 0; if (m_mergedView) { ytrans = (height / 2) * channels; scaleFactor *= channels; } else { ytrans = (height / 2) + (chan * height); } p->setMatrix(matrix().translate(xstart, ytrans), true); if (m_clip->is_selected()) { p->setPen(themer()->get_color("AudioClip:channelseperator:selected")); } else { p->setPen(themer()->get_color("AudioClip:channelseperator")); } p->drawLine(0, 0, pixelcount, 0); for (int x = 0; x < pixelcount; x++) { m_polygon.append( QPointF(x, -scaleFactor * pixeldata[chan][bufferPos++]) ); } if (themer()->get_property("AudioClip:wavemicroview:antialiased", 0).toInt()) { p->setRenderHints(QPainter::Antialiasing); } p->setPen(themer()->get_color("AudioClip:wavemicroview")); p->drawPolyline(m_polygon); // Macroview, paint waveform with painterpath } else { if (m_fillwave) { p->setBrush(m_waveBrush); } if (m_paintWithOutline) { if (m_sheet->get_mode() == Sheet::EDIT) { p->setPen(themer()->get_color("AudioClip:wavemacroview:outline")); } else { p->setPen(themer()->get_color("AudioClip:wavemacroview:outline:curvemode")); } if (m_clip->is_muted()) { p->setPen(themer()->get_color("AudioClip:wavemacroview:outline:muted")); } } else { p->setPen(Qt::NoPen); } scaleFactor = ( (float) height * 0.90 / (Peak::MAX_DB_VALUE * 2)) * m_clip->get_gain() * curveDefaultValue; if (m_mergedView) { if (m_classicView) { ytrans = (height / 2) * channels; scaleFactor *= channels; } else { ytrans = height * channels; scaleFactor *= channels; } } int bufferpos = 0; if (m_classicView) { if (m_mergedView) { ytrans = (height / 2) * channels; } else { ytrans = (height / 2) + (chan * height); } p->setMatrix(matrix().translate(xstart, ytrans), true); m_polygon.clear(); m_polygon.reserve(pixelcount*2); for (int x = 0; x < pixelcount; x++) { m_polygon.append( QPointF(x, -scaleFactor * pixeldata[chan][bufferpos]) ); bufferpos+=2; } bufferpos -= 1; for (int x = pixelcount - 1; x >= 0; x--) { m_polygon.append( QPointF(x, scaleFactor * pixeldata[chan][bufferpos]) ); bufferpos-=2; } QPainterPath path; path.addPolygon(m_polygon); // PROFILE_START; p->drawPath(path); // PROFILE_END("draw path"); // Draw 'the' -INF line p->setPen(minINFLineColor); p->drawLine(0, 0, pixelcount, 0); } else { scaleFactor = (float) height * 0.95 * m_clip->get_gain() / Peak::MAX_DB_VALUE * curveDefaultValue; ytrans = height + (chan * height); if (m_mergedView) { ytrans = height * channels; scaleFactor *= channels; } p->setMatrix(matrix().translate(xstart, ytrans), true); m_polygon.clear(); m_polygon.reserve(pixelcount + 2); for (int x=0; xdrawPath(path); } } p->restore(); } } void AudioClipView::draw_clipinfo_area(QPainter* p, int xstart, int pixelcount) { // fill info area bg p->fillRect(xstart, 1, pixelcount, m_infoAreaHeight, themer()->get_color("AudioClip:clipinfobackground:inactive")); if (m_height >= m_mimimumheightforinfoarea) { if (xstart < (7 + m_clipInfo.width())) { p->drawPixmap(7, 1, m_clipInfo); } } } void AudioClipView::draw_db_lines(QPainter* p, qreal xstart, int pixelcount) { p->save(); int height; int channels = m_clip->get_channels(); bool microView = m_sheet->get_hzoom() < 64 ? 1 : 0; int linestartpos = xstart; if (xstart < m_lineOffset) linestartpos = m_lineOffset; if ((m_mergedView) || (channels == 0)) { channels = 1; } // calculate the height of one channel if (m_height >= m_mimimumheightforinfoarea) { p->setMatrix(matrix().translate(0, m_infoAreaHeight), true); height = (m_height - m_infoAreaHeight) / channels; } else { height = m_height / channels; } p->setPen(themer()->get_color("AudioClip:db-grid")); p->setFont( themer()->get_font("AudioClip:fontscale:dblines") ); if (m_classicView || microView) { // classicView = non-rectified // translate the painter to set the first channel center line to 0 p->setMatrix(matrix().translate(0, height / 2), true); // determine the distance of the db line from the center line int zeroDb = 0.9 * height / 2; int msixDb = 0.9 * height / 4; // draw the lines above and below the center line, then translate // the painter to the next channel for (int i = 0; i < channels; ++i) { p->drawLine(linestartpos, zeroDb, xstart+pixelcount, zeroDb); p->drawLine(linestartpos, -zeroDb, xstart+pixelcount, -zeroDb); p->drawLine(linestartpos, msixDb, xstart+pixelcount, msixDb); p->drawLine(linestartpos, -msixDb + 1, xstart+pixelcount, -msixDb + 1); if (xstart < m_lineOffset) { p->drawText(0.0, zeroDb - 1 + m_lineVOffset, " 0 dB"); p->drawText(0.0, -zeroDb + m_lineVOffset, " 0 dB"); p->drawText(0.0, msixDb + m_lineVOffset, " -6 dB"); p->drawText(0.0, -msixDb + m_lineVOffset, " -6 dB"); } p->setMatrix(matrix().translate(0, height), true); } } else { // rectified // translate the painter to set the first channel base line to 0 p->setMatrix(matrix().translate(0, height), true); // determine the distance of the db line from the center line int zeroDb = 0.95 * height; int msixDb = 0.95 * height / 2; // draw the lines above the center line, then translate // the painter to the next channel for (int i = 0; i < channels; ++i) { p->drawLine(linestartpos, -zeroDb, xstart+pixelcount, -zeroDb); p->drawLine(linestartpos, -msixDb + 1, xstart+pixelcount, -msixDb + 1); if (xstart < m_lineOffset) { p->drawText(0.0, -zeroDb + m_lineVOffset, " 0 dB"); p->drawText(0.0, -msixDb + m_lineVOffset, " -6 dB"); } p->setMatrix(matrix().translate(0, height), true); } } p->restore(); } void AudioClipView::create_brushes() { // make sure the brushes are made from solid colors (not gradients) if top and bottom color are equal // create brushes for background states QColor bg_colRecTop = themer()->get_color("AudioClip:background:recording:top"); QColor bg_colRecBottom = themer()->get_color("AudioClip:background:recording:Bottom"); if (bg_colRecTop == bg_colRecBottom) { m_brushBgRecording = QBrush(bg_colRecTop); } else { QLinearGradient bg_gradientRec(QPoint(0, 0), QPoint(0, m_height)); bg_gradientRec.setSpread(QGradient::RepeatSpread); bg_gradientRec.setColorAt(0, bg_colRecTop); bg_gradientRec.setColorAt(1, bg_colRecBottom); m_brushBgRecording = QBrush(bg_gradientRec); } QColor bg_colMutedTop = themer()->get_color("AudioClip:background:muted:top"); QColor bg_colMutedBottom = themer()->get_color("AudioClip:background:muted:bottom"); if (bg_colMutedTop == bg_colMutedBottom) { m_brushBgMuted = QBrush(bg_colMutedTop); } else { QLinearGradient bg_gradientMuted(QPoint(0, 0), QPoint(0, m_height)); bg_gradientMuted.setSpread(QGradient::RepeatSpread); bg_gradientMuted.setColorAt(0, bg_colMutedTop); bg_gradientMuted.setColorAt(1, bg_colMutedBottom); m_brushBgMuted = QBrush(bg_gradientMuted); } QColor bg_colMutedHoverTop = themer()->get_color("AudioClip:background:muted:mousehover:top"); QColor bg_colMutedHoverBottom = themer()->get_color("AudioClip:background:muted:mousehover:bottom"); if (bg_colMutedHoverTop == bg_colMutedHoverBottom) { m_brushBgMutedHover = QBrush(bg_colMutedHoverTop); } else { QLinearGradient bg_gradientMutedHover(QPoint(0, 0), QPoint(0, m_height)); bg_gradientMutedHover.setSpread(QGradient::RepeatSpread); bg_gradientMutedHover.setColorAt(0, bg_colMutedHoverTop); bg_gradientMutedHover.setColorAt(1, bg_colMutedHoverBottom); m_brushBgMutedHover = QBrush(bg_gradientMutedHover); } QColor bg_colSelectedTop = themer()->get_color("AudioClip:background:selected:top"); QColor bg_colSelectedBottom = themer()->get_color("AudioClip:background:selected:bottom"); if (bg_colSelectedTop == bg_colSelectedBottom) { m_brushBgSelected = QBrush(bg_colSelectedTop); } else { QLinearGradient bg_gradientSelected(QPoint(0, 0), QPoint(0, m_height)); bg_gradientSelected.setSpread(QGradient::RepeatSpread); bg_gradientSelected.setColorAt(0, bg_colSelectedTop); bg_gradientSelected.setColorAt(1, bg_colSelectedBottom); m_brushBgSelected = QBrush(bg_gradientSelected); } QColor bg_colSelectedHoverTop = themer()->get_color("AudioClip:background:selected:mousehover:top"); QColor bg_colSelectedHoverBottom = themer()->get_color("AudioClip:background:selected:mousehover:bottom"); if (bg_colSelectedHoverTop == bg_colSelectedHoverBottom) { m_brushBgSelectedHover = QBrush(bg_colSelectedHoverTop); } else { QLinearGradient bg_gradientSelectedHover(QPoint(0, 0), QPoint(0, m_height)); bg_gradientSelectedHover.setSpread(QGradient::RepeatSpread); bg_gradientSelectedHover.setColorAt(0, bg_colSelectedHoverTop); bg_gradientSelectedHover.setColorAt(1, bg_colSelectedHoverBottom); m_brushBgSelectedHover = QBrush(bg_gradientSelectedHover); } QColor bg_colTop = themer()->get_color("AudioClip:background:top"); QColor bg_colBottom = themer()->get_color("AudioClip:background:bottom"); if (bg_colTop == bg_colBottom) { m_brushBg = QBrush(bg_colTop); } else { QLinearGradient bg_gradient(QPoint(0, 0), QPoint(0, m_height)); bg_gradient.setSpread(QGradient::RepeatSpread); bg_gradient.setColorAt(0, bg_colTop); bg_gradient.setColorAt(1, bg_colBottom); m_brushBg = QBrush(bg_gradient); } QColor bg_colHoverTop = themer()->get_color("AudioClip:background:mousehover:top"); QColor bg_colHoverBottom = themer()->get_color("AudioClip:background:mousehover:bottom"); if (bg_colHoverTop == bg_colHoverBottom) { m_brushBgHover = QBrush(bg_colHoverTop); } else { QLinearGradient bg_gradientHover(QPoint(0, 0), QPoint(0, m_height)); bg_gradientHover.setSpread(QGradient::RepeatSpread); bg_gradientHover.setColorAt(0, bg_colHoverTop); bg_gradientHover.setColorAt(1, bg_colHoverBottom); m_brushBgHover = QBrush(bg_gradientHover); } // Foreground (Waveforms) QColor fg_colTop = themer()->get_color("AudioClip:wavemacroview:brush:top"); QColor fg_colBottom = themer()->get_color("AudioClip:wavemacroview:brush:bottom"); if (fg_colTop == fg_colBottom) { m_brushFg = QBrush(fg_colTop); } else { QLinearGradient fg_gradient(QPoint(0, 0), QPoint(0, m_height)); fg_gradient.setSpread(QGradient::RepeatSpread); fg_gradient.setColorAt(0, fg_colTop); fg_gradient.setColorAt(1, fg_colBottom); m_brushFg = QBrush(fg_gradient); } QColor fg_colHoverTop = themer()->get_color("AudioClip:wavemacroview:brush:hover:top"); QColor fg_colHoverBottom = themer()->get_color("AudioClip:wavemacroview:brush:hover:bottom"); if (fg_colHoverTop == fg_colHoverBottom) { m_brushFgHover = QBrush(fg_colHoverTop); } else { QLinearGradient fg_gradientHover(QPoint(0, 0), QPoint(0, m_height)); fg_gradientHover.setSpread(QGradient::RepeatSpread); fg_gradientHover.setColorAt(0, fg_colHoverTop); fg_gradientHover.setColorAt(1, fg_colHoverBottom); m_brushFgHover = QBrush(fg_gradientHover); } QColor fg_colEditTop = themer()->get_color("AudioClip:wavemacroview:brush:curvemode:top"); QColor fg_colEditBottom = themer()->get_color("AudioClip:wavemacroview:brush:curvemode:bottom"); if (fg_colEditTop == fg_colEditBottom) { m_brushFgEdit = QBrush(fg_colEditTop); } else { QLinearGradient fg_gradientEdit(QPoint(0, 0), QPoint(0, m_height)); fg_gradientEdit.setSpread(QGradient::RepeatSpread); fg_gradientEdit.setColorAt(0, fg_colEditTop); fg_gradientEdit.setColorAt(1, fg_colEditBottom); m_brushFgEdit = QBrush(fg_gradientEdit); } QColor fg_colEditHoverTop = themer()->get_color("AudioClip:wavemacroview:brush:curvemode:hover:top"); QColor fg_colEditHoverBottom = themer()->get_color("AudioClip:wavemacroview:brush:curvemode:hover:bottom"); if (fg_colEditHoverTop == fg_colEditHoverBottom) { m_brushFgEditHover = QBrush(fg_colEditHoverTop); } else { QLinearGradient fg_gradientEditHover(QPoint(0, 0), QPoint(0, m_height)); fg_gradientEditHover.setSpread(QGradient::RepeatSpread); fg_gradientEditHover.setColorAt(0, fg_colEditHoverTop); fg_gradientEditHover.setColorAt(1, fg_colEditHoverBottom); m_brushFgEditHover = QBrush(fg_gradientEditHover); } QColor fg_colMutedTop = themer()->get_color("AudioClip:wavemacroview:brush:muted:top"); QColor fg_colMutedBottom = themer()->get_color("AudioClip:wavemacroview:brush:muted:bottom"); if (fg_colMutedTop == fg_colMutedBottom) { m_brushFgMuted = QBrush(fg_colMutedTop); } else { QLinearGradient fg_gradientMuted(QPoint(0, 0), QPoint(0, m_height)); fg_gradientMuted.setSpread(QGradient::RepeatSpread); fg_gradientMuted.setColorAt(0, fg_colMutedTop); fg_gradientMuted.setColorAt(1, fg_colMutedBottom); m_brushFgMuted = QBrush(fg_gradientMuted); } } void AudioClipView::create_clipinfo_string() { PENTER; QString sclipGain = "Gain: "+ coefficient_to_dbstring(m_clip->get_gain()); QFont font = themer()->get_font("AudioClip:fontscale:title"); QFontMetrics fm(font); QString clipinfoString = fm.elidedText(m_clip->get_name(), Qt::ElideMiddle, 150) + " " + sclipGain + " " + QString::number(m_clip->get_rate()) + " Hz"; int clipInfoWidth = fm.boundingRect(clipinfoString).width(); m_clipInfo = QPixmap(clipInfoWidth, m_infoAreaHeight); m_clipInfo.fill(Qt::transparent); QPainter painter(&m_clipInfo); painter.setFont(font); painter.drawText(m_clipInfo.rect(), clipinfoString); } void AudioClipView::update_progress_info( int progress ) { m_progress = progress; update(10, 0, 150, m_height); } void AudioClipView::peak_creation_finished() { m_waitingForPeaks = false; update(); } void AudioClipView::add_new_fadeview( FadeCurve * fade ) { PENTER; FadeView* view = new FadeView(m_sv, this, fade); m_fadeViews.append(view); connect(view, SIGNAL(fadeModified()), m_sv, SLOT(stop_follow_play_head())); } void AudioClipView::remove_fadeview( FadeCurve * fade ) { for (int i = 0; i < m_fadeViews.size(); ++i) { FadeView* view = m_fadeViews.at(i); if (view->get_fade() == fade) { m_fadeViews.takeAt(i); scene()->removeItem(view); delete view; break; } } } void AudioClipView::calculate_bounding_rect() { PENTER4; prepareGeometryChange(); // printf("AudioClipView::calculate_bounding_rect()\n"); set_height(m_tv->get_height()); m_boundingRect = QRectF(0, 0, (m_clip->get_length() / m_sv->timeref_scalefactor), m_height); update_start_pos(); ViewItem::calculate_bounding_rect(); } void AudioClipView::repaint( ) { update(m_boundingRect); } void AudioClipView::set_height( int height ) { m_height = height; create_brushes(); } int AudioClipView::get_childview_y_offset() const { return (m_height >= m_mimimumheightforinfoarea) ? m_infoAreaHeight : 0; } void AudioClipView::update_start_pos() { // printf("AudioClipView::update_start_pos()\n"); setPos(qRound(m_clip->get_track_start_location() / m_sv->timeref_scalefactor), m_tv->get_childview_y_offset()); } Command * AudioClipView::fade_range() { Q_ASSERT(m_sheet); int x = (int) (cpointer().on_first_input_event_scene_x() - scenePos().x()); if (x < (m_boundingRect.width() / 2)) { return clip_fade_in(); } else { return clip_fade_out(); } return 0; } Command * AudioClipView::clip_fade_in( ) { if (! m_clip->get_fade_in()) { // This implicitely creates the fadecurve m_clip->set_fade_in(1); } return new FadeRange(m_clip, m_clip->get_fade_in(), m_sv->timeref_scalefactor); } Command * AudioClipView::clip_fade_out( ) { if (! m_clip->get_fade_out()) { m_clip->set_fade_out(1); } return new FadeRange(m_clip, m_clip->get_fade_out(), m_sv->timeref_scalefactor); } Command * AudioClipView::reset_fade() { Q_ASSERT(m_sheet); int x = (int) (cpointer().on_first_input_event_scene_x() - scenePos().x()); if (x < (m_boundingRect.width() / 2)) { return m_clip->reset_fade_in(); } else { return m_clip->reset_fade_out(); } return 0; } void AudioClipView::position_changed() { // Update the curveview start offset, only needed for left edge dragging // but who cares :) // the calculate_bounding_rect() will update AudioClipViews children, so // the CurveView and it's nodes get updated as well, no need to set // the start offset for those manually! curveView->set_start_offset(m_clip->get_source_start_location()); calculate_bounding_rect(); update(); } void AudioClipView::load_theme_data() { m_drawbackground = themer()->get_property("AudioClip:drawbackground", 1).toInt(); m_infoAreaHeight = themer()->get_property("AudioClip:infoareaheight", 16).toInt(); m_mimimumheightforinfoarea = themer()->get_property("AudioClip:mimimumheightforinfoarea", 45).toInt(); m_classicView = ! config().get_property("Themer", "paintaudiorectified", false).toBool(); m_mergedView = config().get_property("Themer", "paintstereoaudioasmono", false).toBool(); m_fillwave = themer()->get_property("AudioClip:fillwave", 1).toInt(); minINFLineColor = themer()->get_color("AudioClip:channelseperator"); m_paintWithOutline = config().get_property("Themer", "paintwavewithoutline", true).toBool(); m_drawDbGrid = config().get_property("Themer", "drawdbgrid", false).toBool(); calculate_bounding_rect(); QFont dblfont = themer()->get_font("AudioClip:fontscale:dblines"); QFontMetrics fm(dblfont); m_lineOffset = fm.width(" -6 dB "); m_lineVOffset = fm.ascent()/2; } void AudioClipView::hoverEnterEvent(QGraphicsSceneHoverEvent* event) { Q_UNUSED(event) if (ie().is_holding()) { return; } update(m_boundingRect); m_tv->to_front(this); } Command * AudioClipView::select_fade_in_shape( ) { Interface::instance()->select_fade_in_shape(); return 0; } Command * AudioClipView::select_fade_out_shape( ) { Interface::instance()->select_fade_out_shape(); return 0; } void AudioClipView::start_recording() { m_oldRecordingPos = TimeRef(); connect(&m_recordingTimer, SIGNAL(timeout()), this, SLOT(update_recording())); m_recordingTimer.start(750); } void AudioClipView::finish_recording() { m_recordingTimer.stop(); prepareGeometryChange(); m_boundingRect = QRectF(0, 0, (m_clip->get_length() / m_sv->timeref_scalefactor), m_height); curveView->calculate_bounding_rect(); update(); } void AudioClipView::update_recording() { if (m_clip->recording_state() != AudioClip::RECORDING) { return; } TimeRef newPos = m_clip->get_length(); m_boundingRect = QRectF(0, 0, (newPos / m_sv->timeref_scalefactor), m_height); int updatewidth = int((newPos - m_oldRecordingPos) / m_sv->timeref_scalefactor); QRect updaterect = QRect(int(m_oldRecordingPos / m_sv->timeref_scalefactor) - 1, 0, updatewidth + 1, m_height); update(updaterect); m_oldRecordingPos = newPos; } Command * AudioClipView::set_audio_file() { if (m_clip->is_readsource_invalid()) { ReadSource* rs = m_clip->get_readsource(); if ( ! rs ) { return ie().failure(); } QString filename = QFileDialog::getOpenFileName(0, tr("Reset Audio File for Clip: %1").arg(m_clip->get_name()), rs->get_filename(), tr("All files (*);;Audio files (*.wav *.flac)")); if (filename.isEmpty()) { info().information(tr("No file selected!")); return ie().failure(); } if (rs->set_file(filename) < 0) { return ie().failure(); } resources_manager()->set_source_for_clip(m_clip, rs); // FIXME This is a hack. When a ReadSource didn't have a valid file it wasn't added // to DiskIO in AudioClip::set_sheet(). So when resetting the audiofile this solves it, // but it's not the proper place to do so!! m_clip->set_sheet(m_sheet); info().information(tr("Succesfully set AudioClip file to %1").arg(filename)); return ie().succes(); } return ie().did_not_implement(); } Command * AudioClipView::edit_properties() { AudioClipEditDialog editdialog(m_clip, Interface::instance()); editdialog.exec(); return 0; } void AudioClipView::clip_state_changed() { create_clipinfo_string(); update(); } traverso-0.49.4/src/sheetcanvas/FadeView.cpp000644 001750 001750 00000017206 11163362147 021262 0ustar00remonremon000000 000000 /* Copyright (C) 2006 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: FadeView.cpp,v 1.2 2008/05/24 17:27:49 r_sijrier Exp $ */ #include "FadeView.h" #include #include "FadeCurve.h" #include "AudioClipView.h" #include "SheetView.h" #include "Interface.h" #include #include #include #include #include #include #include static const int DOT_SIZE = 6; static const QString DOT_COLOR = "#78817B"; FadeView::FadeView(SheetView* sv, AudioClipView* parent, FadeCurve * fadeCurve ) : ViewItem(parent, fadeCurve) , m_fadeCurve(fadeCurve) { PENTERCONS; m_sv = sv; m_holdactive = false; m_guicurve = new Curve(0); m_guicurve->set_sheet(m_sv->get_sheet()); apill_foreach(CurveNode* node, CurveNode, m_fadeCurve->get_nodes()) { CurveNode* guinode = new CurveNode(m_guicurve, node->get_when() / m_sv->timeref_scalefactor, node->get_value()); AddRemove* cmd = (AddRemove*) m_guicurve->add_node(guinode, false); cmd->set_instantanious(true); Command::process_command(cmd); } load_theme_data(); setAcceptsHoverEvents(true); setCursor(themer()->get_cursor("Fade")); connect(m_fadeCurve, SIGNAL(stateChanged()), this, SLOT(state_changed())); connect(m_fadeCurve, SIGNAL(rangeChanged()), this, SLOT(state_changed())); } FadeView::~ FadeView( ) { PENTERDES; delete m_guicurve; } void FadeView::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { Q_UNUSED(widget); int pixelcount = (int) option->exposedRect.width(); if (pixelcount == 0) { return; } pixelcount += 1; QPolygonF polygon; int xstart = (int)option->exposedRect.x(); int vector_start = xstart; int height = (int)m_boundingRect.height(); float vector[pixelcount]; if (m_fadeCurve->get_fade_type() == FadeCurve::FadeOut && m_guicurve->get_range() > m_parentViewItem->boundingRect().width()) { vector_start += (int) (m_guicurve->get_range() - m_parentViewItem->boundingRect().width()); } m_guicurve->get_vector(vector_start, vector_start + pixelcount, vector, pixelcount); for (int i=0; isave(); painter->setClipRect(m_boundingRect.intersect(m_parentViewItem->boundingRect())); painter->setRenderHint(QPainter::Antialiasing); QPainterPath path; path.addPolygon(polygon); path.lineTo(xstart + 1 + pixelcount, 0); path.lineTo(xstart + 1, 0); path.closeSubpath(); painter->setPen(Qt::NoPen); QColor color = m_fadeCurve->is_bypassed() ? themer()->get_color("Fade:bypassed") : themer()->get_color("Fade:default"); if (option->state & QStyle::State_MouseOver) { color.setAlpha(color.alpha() + 10); } painter->setBrush(color); painter->drawPath(path); if (m_holdactive) { // Calculate and draw control points int h = (int) m_boundingRect.height() - 1; int w = (int) m_boundingRect.width() - 1; QList points = m_fadeCurve->get_control_points(); QPoint p1(int(points.at(1).x() * w + 0.5), h - int(points.at(1).y() * h + 0.5)); QPoint p2(w - int((1.0 - points.at(2).x()) * w + 0.5), int((1.0 - points.at(2).y()) * h + 0.5)); painter->setPen(QColor(DOT_COLOR)); painter->setBrush(QColor(DOT_COLOR)); if (m_fadeCurve->get_fade_type() == FadeCurve::FadeOut) { p1.setX(w - int((1 - points.at(2).x()) * w + 0.5)); p1.setY(h - int((1 - points.at(2).y()) * h + 0.5)); p2.setX(int((points.at(1).x()) * w + 0.5)); p2.setY(int((points.at(1).y()) * h + 0.5)); painter->drawLine(w, h, p1.x(), p1.y()); painter->drawLine(0, 0, p2.x(), p2.y()); } else { painter->drawLine(0, h, p1.x(), p1.y()); painter->drawLine(w, 0, p2.x(), p2.y()); } painter->drawEllipse(p1.x() - DOT_SIZE/2, p1.y() - DOT_SIZE/2, DOT_SIZE, DOT_SIZE); painter->drawEllipse(p2.x() - DOT_SIZE/2, p2.y() - DOT_SIZE/2, DOT_SIZE, DOT_SIZE); } painter->restore(); } int FadeView::get_vector(int xstart, int pixelcount, float * arg) { // If boundingrect width is smaller then a pixel, don't even try if (m_boundingRect.width() < 1.0) { return 0; } if (m_fadeCurve->get_fade_type() == FadeCurve::FadeOut) { // If the fade widt is larger the the clipview, add the difference, // since the 'start' of the fadeview lies beyond the left edge of the clip! if (m_boundingRect.width() > m_parentViewItem->boundingRect().width()) { xstart += (int)(m_boundingRect.width() - m_parentViewItem->boundingRect().width()); } // map the xstart position to the fadeviews x position int mappedx = (int)mapFromParent(QPoint(xstart, 0)).x(); int x = mappedx; float* p = arg; // check if the xstart lies before 'our' first pixel if (mappedx < 0) { x = 0; // substract the difference from the pixelcount pixelcount += mappedx; // point to the mapped location of the buffer. p = arg - mappedx; // and if pixelcount is 0, there is nothing to do! if (pixelcount <= 0) { return 0; } // Any pixels outside of our range shouldn't alter the waveform, // so let's assign 1 to them! for (int i=0; i < - mappedx; ++i) { arg[i] = 1; } } m_guicurve->get_vector(x, x + pixelcount, p, pixelcount); return 1; } if (xstart < m_boundingRect.width()) { m_guicurve->get_vector(xstart, xstart + pixelcount, arg, pixelcount); return 1; } return 0; } void FadeView::calculate_bounding_rect() { APILinkedList guinodes = m_guicurve->get_nodes(); APILinkedList nodes = m_fadeCurve->get_nodes(); APILinkedListNode* node = nodes.first(); APILinkedListNode* guinode = guinodes.first(); while (node) { CurveNode* cnode = (CurveNode*)node; CurveNode* cguinode = (CurveNode*)guinode; cguinode->set_when_and_value(cnode->get_when() / m_sv->timeref_scalefactor, cnode->get_value()); node = node->next; guinode = guinode->next; } double range = m_guicurve->get_range(); m_boundingRect = QRectF( 0, 0, range, m_parentViewItem->get_height() ); if (m_fadeCurve->get_fade_type() == FadeCurve::FadeOut) { int diff = 0; if (m_boundingRect.width() > m_parentViewItem->boundingRect().width()) { diff = (int)(m_boundingRect.width() - m_parentViewItem->boundingRect().width()); } setPos(m_parentViewItem->boundingRect().width() - m_boundingRect.width() + diff, m_parentViewItem->get_childview_y_offset()); } else { setPos(0, m_parentViewItem->get_childview_y_offset()); } } void FadeView::state_changed( ) { PENTER; prepareGeometryChange(); calculate_bounding_rect(); update(); emit fadeModified(); } Command* FadeView::bend() { return new FadeBend(this); } Command* FadeView::strength() { return new FadeStrength(this); } Command* FadeView::select_fade_shape() { if (m_fadeCurve->get_fade_type() == FadeCurve::FadeIn) { Interface::instance()->select_fade_in_shape(); } else { Interface::instance()->select_fade_out_shape(); } return 0; } void FadeView::set_holding(bool hold) { m_holdactive = hold; update(m_boundingRect); } void FadeView::load_theme_data() { calculate_bounding_rect(); } traverso-0.49.4/src/sheetcanvas/AudioClipView.h000755 001750 001750 00000010063 11163362147 021736 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2009 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef AUDIO_CLIP_VIEW_H #define AUDIO_CLIP_VIEW_H #include "ViewItem.h" #include #include #include #include #include class AudioClip; class Sheet; class FadeCurve; class CurveView; class SheetView; class TrackView; class FadeView; class Peak; class AudioClipView : public ViewItem { Q_OBJECT Q_CLASSINFO("fade_range", tr("Closest: Adjust Length")) Q_CLASSINFO("clip_fade_in", tr("In: Adjust Length")) Q_CLASSINFO("clip_fade_out", tr("Out: Adjust Length")) Q_CLASSINFO("select_fade_in_shape", tr("In: Select Preset")); Q_CLASSINFO("select_fade_out_shape", tr("Out: Select Preset")); Q_CLASSINFO("reset_fade", tr("Closest: Delete")); Q_CLASSINFO("set_audio_file", tr("Reset Audio File")); Q_CLASSINFO("edit_properties", tr("Edit Properties")); public: AudioClipView(SheetView* view, TrackView* parent, AudioClip* clip); ~AudioClipView(); void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); void set_height(int height); AudioClip* get_clip() const {return m_clip;} int get_height() const; int get_childview_y_offset() const; void calculate_bounding_rect(); void load_theme_data(); protected: void hoverEnterEvent ( QGraphicsSceneHoverEvent * event ); private: TrackView* m_tv; QList m_fadeViews; AudioClip* m_clip; Sheet* m_sheet; CurveView* curveView; QPolygonF m_polygon; QPixmap m_clipInfo; QTimer m_recordingTimer; float m_progress; int m_peakloadingcount; bool m_waitingForPeaks; bool m_mergedView; bool m_classicView; bool m_paintWithOutline; bool m_drawDbGrid; int m_height; int m_infoAreaHeight; int m_mimimumheightforinfoarea; int m_lineOffset; int m_lineVOffset; TimeRef m_oldRecordingPos; // theme data int m_drawbackground; int m_fillwave; QColor m_backgroundColorTop; QColor m_backgroundColorBottom; QColor m_backgroundColorMouseHoverTop; QColor m_backgroundColorMouseHoverBottom; QColor minINFLineColor; QBrush m_waveBrush; QBrush m_brushBgRecording; QBrush m_brushBgMuted; QBrush m_brushBgMutedHover; QBrush m_brushBgSelected; QBrush m_brushBgSelectedHover; QBrush m_brushBg; QBrush m_brushBgHover; QBrush m_brushFg; QBrush m_brushFgHover; QBrush m_brushFgMuted; QBrush m_brushFgEdit; QBrush m_brushFgEditHover; void create_clipinfo_string(); void draw_clipinfo_area(QPainter* painter, int xstart, int pixelcount); void draw_db_lines(QPainter* painter, qreal xstart, int pixelcount); void draw_peaks(QPainter* painter, qreal xstart, int pixelcount); void create_brushes(); friend class FadeView; public slots: void add_new_fadeview(FadeCurve* fade); void remove_fadeview(FadeCurve* fade); void repaint(); void update_start_pos(); void position_changed(); Command* fade_range(); Command* clip_fade_in(); Command* clip_fade_out(); Command* select_fade_in_shape(); Command* select_fade_out_shape(); Command* reset_fade(); Command* set_audio_file(); Command* edit_properties(); private slots: void update_progress_info(int progress); void peak_creation_finished(); void start_recording(); void finish_recording(); void update_recording(); void clip_state_changed(); }; inline int AudioClipView::get_height() const { int height; (m_height > m_mimimumheightforinfoarea) ? height = m_height - m_infoAreaHeight : height = m_height; return height; } #endif //eof traverso-0.49.4/src/sheetcanvas/SheetWidget.cpp000644 001750 001750 00000017515 11163362147 022007 0ustar00remonremon000000 000000 /* Copyright (C) 2006-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "SheetWidget.h" #include "TrackPanelViewPort.h" #include "ClipsViewPort.h" #include "TimeLineViewPort.h" #include "SheetView.h" #include "Themer.h" #include "Config.h" #include #include "Utils.h" #include "ContextPointer.h" #include "Mixer.h" // #if defined (QT_OPENGL_SUPPORT) // #include // #endif #include #include #include SheetPanelGain::SheetPanelGain(ViewItem* parent, Sheet* sheet) : ViewItem(parent, sheet) , m_sheet(sheet) { m_boundingRect = QRectF(0, 0, 180, 9); connect(sheet, SIGNAL(masterGainChanged()), this, SLOT(update_gain())); setAcceptsHoverEvents(true); } void SheetPanelGain::paint( QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget ) { Q_UNUSED(widget); const int height = 9; int sliderWidth = (int)m_boundingRect.width() - 75; float gain = m_sheet->get_gain(); QString sgain = coefficient_to_dbstring(gain); float db = coefficient_to_dB(gain); if (db < -60) { db = -60; } int sliderdbx = (int) (sliderWidth - (sliderWidth*0.3)) - (int) ( ( (-1 * db) / 60 ) * sliderWidth); if (sliderdbx < 0) { sliderdbx = 0; } if (db > 0) { sliderdbx = (int)(sliderWidth*0.7) + (int) ( ( db / 6 ) * (sliderWidth*0.3)); } int cr = (gain >= 1 ? 30 + (int)(100 * gain) : (int)(50 * gain)); int cb = ( gain < 1 ? 150 + (int)(50 * gain) : abs((int)(10 * gain)) ); painter->setPen(themer()->get_color("TrackPanel:text")); painter->setFont(themer()->get_font("TrackPanel:fontscale:gain")); painter->drawText(0, height + 1, "GAIN"); painter->drawRect(30, 1, sliderWidth, height); bool mousehover = (option->state & QStyle::State_MouseOver); QColor color(cr,0,cb); if (mousehover) { color = color.light(140); } painter->fillRect(31, 2, sliderdbx, height-1, color); painter->drawText(sliderWidth + 35, height, sgain); } Command* SheetPanelGain::gain_increment() { m_sheet->set_gain(m_sheet->get_gain() + 0.05); return 0; } Command* SheetPanelGain::gain_decrement() { m_sheet->set_gain(m_sheet->get_gain() - 0.05); return 0; } SheetPanelView::SheetPanelView(QGraphicsScene* scene, Sheet* sheet) : ViewItem(0, 0) , m_sheet(sheet) { scene->addItem(this); m_gainview = new SheetPanelGain(this, m_sheet); m_gainview->setPos(10, 16); m_boundingRect = QRectF(0, 0, 200, TIMELINE_HEIGHT); } void SheetPanelView::paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget) { int xstart = (int)option->exposedRect.x(); int pixelcount = (int)option->exposedRect.width(); painter->setPen(themer()->get_color("TrackPanel:text")); painter->setFont(themer()->get_font("TrackPanel:fontscale:led")); painter->drawText(10, 11, "Sheet: " + m_sheet->get_title()); QColor color = QColor(Qt::darkGray);//themer()->get_color("Track:cliptopoffset"); painter->setPen(color); painter->fillRect(xstart, TIMELINE_HEIGHT - 2, pixelcount, 2, color); painter->fillRect(199, 0, 1, TIMELINE_HEIGHT, color); } class SheetPanelViewPort : public ViewPort { public: SheetPanelViewPort(QGraphicsScene* scene, SheetWidget* sw); ~SheetPanelViewPort() {}; void get_pointed_context_items(QList &list) { QList itemlist = items(cpointer().on_first_input_event_x(), cpointer().on_first_input_event_y()); foreach(QGraphicsItem* item, itemlist) { if (ViewItem::is_viewitem(item)) { list.append((ViewItem*)item); } } list.removeAll(m_spv); list.append(m_sv); } void set_sheet_view(SheetView* sv) { m_sv = sv; m_spv = new SheetPanelView(scene(), m_sheet); m_spv->setPos(-200, -TIMELINE_HEIGHT); } private: Sheet* m_sheet; SheetView* m_sv; SheetPanelView* m_spv; }; SheetPanelViewPort::SheetPanelViewPort(QGraphicsScene * scene, SheetWidget * sw) : ViewPort(scene, sw) { setSceneRect(-200, -TIMELINE_HEIGHT, 200, 0); m_sheet = sw->get_sheet(); setMaximumHeight(TIMELINE_HEIGHT); setMinimumHeight(TIMELINE_HEIGHT); setMinimumWidth(200); setMaximumWidth(200); setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setBackgroundBrush(themer()->get_color("SheetPanel:background")); } SheetWidget::SheetWidget(Sheet* sheet, QWidget* parent) : QFrame(parent) , m_sheet(sheet) { if (!m_sheet) { return; } m_scene = new QGraphicsScene(); m_vScrollBar = new QScrollBar(this); m_hScrollBar = new QScrollBar(this); m_hScrollBar->setOrientation(Qt::Horizontal); m_trackPanel = new TrackPanelViewPort(m_scene, this); m_clipsViewPort = new ClipsViewPort(m_scene, this); m_timeLine = new TimeLineViewPort(m_scene, this); m_sheetPanelVP = new SheetPanelViewPort(m_scene, this); m_mainLayout = new QGridLayout(this); m_mainLayout->addWidget(m_sheetPanelVP, 0, 0); m_mainLayout->addWidget(m_timeLine, 0, 1); m_mainLayout->addWidget(m_trackPanel, 1, 0); m_mainLayout->addWidget(m_clipsViewPort, 1, 1); m_mainLayout->addWidget(m_hScrollBar, 2, 1); m_mainLayout->addWidget(m_vScrollBar, 1, 2); m_mainLayout->setMargin(0); m_mainLayout->setSpacing(0); setLayout(m_mainLayout); m_sv = new SheetView(this, m_clipsViewPort, m_trackPanel, m_timeLine, sheet); m_timeLine->set_sheetview(m_sv); m_sheetPanelVP->set_sheet_view(m_sv); connect(m_clipsViewPort->horizontalScrollBar(), SIGNAL(valueChanged(int)), m_timeLine->horizontalScrollBar(), SLOT(setValue(int))); connect(m_timeLine->horizontalScrollBar(), SIGNAL(valueChanged(int)), m_clipsViewPort->horizontalScrollBar(), SLOT(setValue(int))); connect(m_clipsViewPort->verticalScrollBar(), SIGNAL(valueChanged(int)), m_trackPanel->verticalScrollBar(), SLOT(setValue(int))); connect(m_trackPanel->verticalScrollBar(), SIGNAL(valueChanged(int)), m_clipsViewPort->verticalScrollBar(), SLOT(setValue(int))); connect(themer(), SIGNAL(themeLoaded()), this, SLOT(load_theme_data()), Qt::QueuedConnection); // m_usingOpenGL = false; // set_use_opengl(config().get_property("Interface", "OpenGL", false).toBool()); setFrameStyle(QFrame::StyledPanel | QFrame::Sunken); cpointer().set_current_viewport(m_clipsViewPort); m_clipsViewPort->setFocus(); } SheetWidget::~ SheetWidget() { PENTERDES; if (!m_sheet) { return; } delete m_scene; } QSize SheetWidget::minimumSizeHint() const { return QSize(400, 200); } QSize SheetWidget::sizeHint() const { return QSize(700, 600); } // void SheetWidget::set_use_opengl( bool useOpenGL ) // { // if (!m_sheet) { // return; // } // // if (useOpenGL != m_usingOpenGL) { // #if defined (QT_OPENGL_SUPPORT) // m_clipsViewPort->setViewport(useOpenGL ? new QGLWidget(QGLFormat(QGL::SampleBuffers)) : new QWidget); // m_trackPanel->setViewport(useOpenGL ? new QGLWidget(QGLFormat(QGL::SampleBuffers)) : new QWidget); // #endif // } // m_usingOpenGL = useOpenGL; // } void SheetWidget::load_theme_data() { QList list = m_scene->items(); for (int i = 0; i < list.size(); ++i) { ViewItem* item = qgraphicsitem_cast(list.at(i)); if (item) { item->load_theme_data(); } } } Sheet * SheetWidget::get_sheet() const { return m_sheet; } SheetView * SheetWidget::get_sheetview() const { return m_sv; } traverso-0.49.4/src/sheetcanvas/dialogs/000755 001750 001750 00000000000 11163362200 020466 5ustar00remonremon000000 000000 traverso-0.49.4/src/sheetcanvas/dialogs/AudioClipEditDialog.h000644 001750 001750 00000004531 11163362147 024453 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef AUDIOCLIP_EDIT_DIALOG_H #define AUDIOCLIP_EDIT_DIALOG_H #include "ui_AudioClipEditDialog.h" #include #include #include #include "defines.h" class AudioClip; class AudioClipEditDialog : public QDialog, protected Ui::AudioClipEditDialog { Q_OBJECT public: AudioClipEditDialog(AudioClip* clip, QWidget* parent); ~AudioClipEditDialog() {} private: AudioClip* m_clip; QDomNode m_origState; TimeRef qtime_to_timeref(const QTime& time); QTime timeref_to_qtime(const TimeRef& ref); bool locked; private slots: void external_processing(); void clip_state_changed(); void save_changes(); void cancel_changes(); void clip_position_changed(); void gain_spinbox_value_changed(double value); void fadein_length_changed(); void fadein_edit_changed(const QTime& time); void fadein_mode_changed(); void fadein_mode_edit_changed(int index); void fadein_bending_changed(); void fadein_bending_edit_changed(double value); void fadein_strength_changed(); void fadein_strength_edit_changed(double value); void fadein_linear(); void fadein_default(); void fadeout_edit_changed(const QTime& time); void fadeout_length_changed(); void fadeout_mode_changed(); void fadeout_mode_edit_changed(int index); void fadeout_bending_changed(); void fadeout_bending_edit_changed(double value); void fadeout_strength_changed(); void fadeout_strength_edit_changed(double value); void fadeout_linear(); void fadeout_default(); void clip_start_edit_changed(const QTime& time); void clip_length_edit_changed(const QTime& time); void update_clip_end(); void fade_curve_added(); }; #endif traverso-0.49.4/src/sheetcanvas/dialogs/AudioClipEditDialog.cpp000644 001750 001750 00000027566 11163362147 025023 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "AudioClipEditDialog.h" #include "AudioClip.h" #include "FadeCurve.h" #include "ProjectManager.h" #include "Project.h" #include "ReadSource.h" #include "Utils.h" #include "Mixer.h" #include "Command.h" #include "AudioClipExternalProcessing.h" #include "InputEngine.h" #include "AudioDevice.h" #define TIME_FORMAT "hh:mm:ss.zzz" AudioClipEditDialog::AudioClipEditDialog(AudioClip* clip, QWidget* parent) : QDialog(parent), m_clip(clip) { setupUi(this); locked = false; // Used for cancelling the changes on Cancel button activated QDomDocument tempDoc; m_origState = clip->get_state(tempDoc); clipStartEdit->setDisplayFormat(TIME_FORMAT); clipLengthEdit->setDisplayFormat(TIME_FORMAT); fadeInEdit->setDisplayFormat(TIME_FORMAT); fadeOutEdit->setDisplayFormat(TIME_FORMAT); fadeInModeBox->insertItem(1, "Bended"); fadeInModeBox->insertItem(2, "S-Shape"); fadeInModeBox->insertItem(3, "Long"); fadeOutModeBox->insertItem(1, "Bended"); fadeOutModeBox->insertItem(2, "S-Shape"); fadeOutModeBox->insertItem(3, "Long"); // Used to set gain and name clip_state_changed(); // used for length, track start position clip_position_changed(); // detect and set fade params fade_curve_added(); connect(clip, SIGNAL(stateChanged()), this, SLOT(clip_state_changed())); connect(clip, SIGNAL(positionChanged()), this, SLOT(clip_position_changed())); connect(clip, SIGNAL(fadeAdded(FadeCurve*)), this, SLOT(fade_curve_added())); connect(clipGainSpinBox, SIGNAL(valueChanged(double)), this, SLOT(gain_spinbox_value_changed(double))); connect(clipStartEdit, SIGNAL(timeChanged(const QTime&)), this, SLOT(clip_start_edit_changed(const QTime&))); connect(clipLengthEdit, SIGNAL(timeChanged(const QTime&)), this, SLOT(clip_length_edit_changed(const QTime&))); connect(fadeInEdit, SIGNAL(timeChanged(const QTime&)), this, SLOT(fadein_edit_changed(const QTime&))); connect(fadeInModeBox, SIGNAL(currentIndexChanged(int)), this, SLOT(fadein_mode_edit_changed(int))); connect(fadeInBendingBox, SIGNAL(valueChanged(double)), this, SLOT(fadein_bending_edit_changed(double))); connect(fadeInStrengthBox, SIGNAL(valueChanged(double)), this, SLOT(fadein_strength_edit_changed(double))); connect(fadeInLinearButton, SIGNAL(clicked()), this, SLOT(fadein_linear())); connect(fadeInDefaultButton, SIGNAL(clicked()), this, SLOT(fadein_default())); connect(fadeOutEdit, SIGNAL(timeChanged(const QTime&)), this, SLOT(fadeout_edit_changed(const QTime&))); connect(fadeOutModeBox, SIGNAL(currentIndexChanged(int)), this, SLOT(fadeout_mode_edit_changed(int))); connect(fadeOutBendingBox, SIGNAL(valueChanged(double)), this, SLOT(fadeout_bending_edit_changed(double))); connect(fadeOutStrengthBox, SIGNAL(valueChanged(double)), this, SLOT(fadeout_strength_edit_changed(double))); connect(fadeOutLinearButton, SIGNAL(clicked()), this, SLOT(fadeout_linear())); connect(fadeOutDefaultButton, SIGNAL(clicked()), this, SLOT(fadeout_default())); connect(externalProcessingButton, SIGNAL(clicked()), this, SLOT(external_processing())); connect(buttonBox, SIGNAL(accepted()), this, SLOT(save_changes())); connect(buttonBox, SIGNAL(rejected()), this, SLOT(cancel_changes())); } void AudioClipEditDialog::external_processing() { Command::process_command(new AudioClipExternalProcessing(m_clip)); } void AudioClipEditDialog::clip_state_changed() { if (m_clip->get_name() != clipNameLineEdit->text()) { setWindowTitle(m_clip->get_name()); clipNameLineEdit->setText(m_clip->get_name()); } clipGainSpinBox->setValue(coefficient_to_dB(m_clip->get_gain())); sourceLineEdit->setText(m_clip->get_readsource()->get_filename()); sourceLineEdit->setToolTip(m_clip->get_readsource()->get_filename()); } void AudioClipEditDialog::save_changes() { hide(); QString name = clipNameLineEdit->text(); if (!name.isEmpty()) { m_clip->set_name(name); } else { clipNameLineEdit->setText(m_clip->get_name()); } } void AudioClipEditDialog::cancel_changes() { hide(); m_clip->set_state(m_origState); } void AudioClipEditDialog::gain_spinbox_value_changed(double value) { float gain = dB_to_scale_factor(value); m_clip->set_gain(gain); } void AudioClipEditDialog::clip_position_changed() { if (locked) return; QTime clipLengthTime = timeref_to_qtime(m_clip->get_length()); clipLengthEdit->setTime(clipLengthTime); QTime clipStartTime = timeref_to_qtime(m_clip->get_track_start_location()); clipStartEdit->setTime(clipStartTime); update_clip_end(); } void AudioClipEditDialog::fadein_length_changed() { if (ie().is_holding()) return; if (locked) return; TimeRef ref(qint64(m_clip->get_fade_in()->get_range())); QTime fadeTime = timeref_to_qtime(ref); fadeInEdit->setTime(fadeTime); } void AudioClipEditDialog::fadeout_length_changed() { if (locked) return; TimeRef ref(qint64(m_clip->get_fade_out()->get_range())); QTime fadeTime = timeref_to_qtime(ref); fadeOutEdit->setTime(fadeTime); } void AudioClipEditDialog::fadein_edit_changed(const QTime& time) { // Hmm, we can't distinguish between hand editing the time edit // or moving the clip with the mouse! In the latter case this function // causes trouble when moving the right edge with the mouse! // This 'fixes' it ..... if (ie().is_holding()) return; locked = true; double range = double(qtime_to_timeref(time).universal_frame()); if (range == 0) { m_clip->set_fade_in(1); } else { m_clip->set_fade_in(range); } locked = false; } void AudioClipEditDialog::fadeout_edit_changed(const QTime& time) { if (ie().is_holding()) return; locked = true; double range = double(qtime_to_timeref(time).universal_frame()); if (range == 0) { m_clip->set_fade_out(1); } else { m_clip->set_fade_out(range); } locked = false; } void AudioClipEditDialog::clip_length_edit_changed(const QTime& time) { if (ie().is_holding()) return; locked = true; TimeRef ref = qtime_to_timeref(time); if (ref >= m_clip->get_source_length()) { ref = m_clip->get_source_length(); QTime clipLengthTime = timeref_to_qtime(ref); clipLengthEdit->setTime(clipLengthTime); } m_clip->set_right_edge(ref + m_clip->get_track_start_location()); update_clip_end(); locked = false; } void AudioClipEditDialog::clip_start_edit_changed(const QTime& time) { if (ie().is_holding()) return; locked = true; m_clip->set_track_start_location(qtime_to_timeref(time)); update_clip_end(); locked = false; } void AudioClipEditDialog::fadein_mode_changed() { if (locked) return; int m = m_clip->get_fade_in()->get_mode(); fadeInModeBox->setCurrentIndex(m); } void AudioClipEditDialog::fadeout_mode_changed() { if (locked) return; int m = m_clip->get_fade_out()->get_mode(); fadeOutModeBox->setCurrentIndex(m); } void AudioClipEditDialog::fadein_bending_changed() { if (locked) return; fadeInBendingBox->setValue(m_clip->get_fade_in()->get_bend_factor()); } void AudioClipEditDialog::fadeout_bending_changed() { if (locked) return; fadeOutBendingBox->setValue(m_clip->get_fade_out()->get_bend_factor()); } void AudioClipEditDialog::fadein_strength_changed() { if (locked) return; fadeInStrengthBox->setValue(m_clip->get_fade_in()->get_strength_factor()); } void AudioClipEditDialog::fadeout_strength_changed() { if (locked) return; fadeOutStrengthBox->setValue(m_clip->get_fade_out()->get_strength_factor()); } void AudioClipEditDialog::fadein_mode_edit_changed(int index) { if (!m_clip->get_fade_in()) return; locked = true; m_clip->get_fade_in()->set_mode(index); locked = false; } void AudioClipEditDialog::fadeout_mode_edit_changed(int index) { if (!m_clip->get_fade_out()) return; locked = true; m_clip->get_fade_out()->set_mode(index); locked = false; } void AudioClipEditDialog::fadein_bending_edit_changed(double value) { if (!m_clip->get_fade_in()) return; locked = true; m_clip->get_fade_in()->set_bend_factor(value); locked = false; } void AudioClipEditDialog::fadeout_bending_edit_changed(double value) { if (!m_clip->get_fade_out()) return; locked = true; m_clip->get_fade_out()->set_bend_factor(value); locked = false; } void AudioClipEditDialog::fadein_strength_edit_changed(double value) { if (!m_clip->get_fade_in()) return; locked = true; m_clip->get_fade_in()->set_strength_factor(value); locked = false; } void AudioClipEditDialog::fadeout_strength_edit_changed(double value) { if (!m_clip->get_fade_out()) return; locked = true; m_clip->get_fade_out()->set_strength_factor(value); locked = false; } void AudioClipEditDialog::fadein_linear() { if (!m_clip->get_fade_in()) return; fadeInBendingBox->setValue(0.5); fadeInStrengthBox->setValue(0.5); } void AudioClipEditDialog::fadein_default() { if (!m_clip->get_fade_in()) return; fadeInBendingBox->setValue(0.0); fadeInStrengthBox->setValue(0.5); } void AudioClipEditDialog::fadeout_linear() { if (!m_clip->get_fade_out()) return; fadeOutBendingBox->setValue(0.5); fadeOutStrengthBox->setValue(0.5); } void AudioClipEditDialog::fadeout_default() { if (!m_clip->get_fade_out()) return; fadeOutBendingBox->setValue(0.0); fadeOutStrengthBox->setValue(0.5); } TimeRef AudioClipEditDialog::qtime_to_timeref(const QTime & time) { TimeRef ref(time.hour() * ONE_HOUR_UNIVERSAL_SAMPLE_RATE + time.minute() * ONE_MINUTE_UNIVERSAL_SAMPLE_RATE + time.second() * UNIVERSAL_SAMPLE_RATE + (time.msec() * UNIVERSAL_SAMPLE_RATE) / 1000); return ref; } QTime AudioClipEditDialog::timeref_to_qtime(const TimeRef& ref) { qint64 remainder; int hours, mins, secs, msec; qint64 universalframe = ref.universal_frame(); hours = universalframe / (ONE_HOUR_UNIVERSAL_SAMPLE_RATE); remainder = universalframe - (hours * ONE_HOUR_UNIVERSAL_SAMPLE_RATE); mins = remainder / ( ONE_MINUTE_UNIVERSAL_SAMPLE_RATE ); remainder = remainder - (mins * ONE_MINUTE_UNIVERSAL_SAMPLE_RATE ); secs = remainder / UNIVERSAL_SAMPLE_RATE; remainder -= secs * UNIVERSAL_SAMPLE_RATE; msec = remainder * 1000 / UNIVERSAL_SAMPLE_RATE; QTime time(hours, mins, secs, msec); return time; } void AudioClipEditDialog::fade_curve_added() { if (m_clip->get_fade_in()) { fadein_length_changed(); fadein_mode_changed(); fadein_bending_changed(); fadein_strength_changed(); connect(m_clip->get_fade_in(), SIGNAL(rangeChanged()), this, SLOT(fadein_length_changed())); connect(m_clip->get_fade_in(), SIGNAL(modeChanged()), this, SLOT(fadein_mode_changed())); connect(m_clip->get_fade_in(), SIGNAL(bendValueChanged()), this, SLOT(fadein_bending_changed())); connect(m_clip->get_fade_in(), SIGNAL(strengthValueChanged()), this, SLOT(fadein_strength_changed())); } if (m_clip->get_fade_out()) { fadeout_length_changed(); fadeout_mode_changed(); fadeout_bending_changed(); fadeout_strength_changed(); connect(m_clip->get_fade_out(), SIGNAL(rangeChanged()), this, SLOT(fadeout_length_changed())); connect(m_clip->get_fade_out(), SIGNAL(modeChanged()), this, SLOT(fadeout_mode_changed())); connect(m_clip->get_fade_out(), SIGNAL(bendValueChanged()), this, SLOT(fadeout_bending_changed())); connect(m_clip->get_fade_out(), SIGNAL(strengthValueChanged()), this, SLOT(fadeout_strength_changed())); } } void AudioClipEditDialog::update_clip_end() { TimeRef clipEndLocation = m_clip->get_track_start_location() + m_clip->get_length(); QTime clipEndTime = timeref_to_qtime(clipEndLocation); clipEndLineEdit->setText(clipEndTime.toString(TIME_FORMAT)); } traverso-0.49.4/src/sheetcanvas/LineView.h000644 001750 001750 00000002530 11163362147 020751 0ustar00remonremon000000 000000 /* Copyright (C) 2006-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef LINE_VIEW_H #define LINE_VIEW_H #include "ViewItem.h" class LineView : public ViewItem { Q_OBJECT public: LineView(ViewItem* parent) : ViewItem(parent, 0) { setZValue(parent->zValue() + 1); m_boundingRect = QRectF(0, 0, 1, parent->boundingRect().height()); } void set_bounding_rect(QRectF rect) {m_boundingRect = rect;} void set_color(QColor color) {m_color = color;} void paint(QPainter* painter, const QStyleOptionGraphicsItem*, QWidget*) { painter->setPen(m_color); QLineF line(0, 0, 0, m_boundingRect.height()); painter->drawLine(line); } private: QColor m_color; }; #endif traverso-0.49.4/src/sheetcanvas/ui/000755 001750 001750 00000000000 11163362200 017461 5ustar00remonremon000000 000000 traverso-0.49.4/src/sheetcanvas/ui/AudioClipEditDialog.ui000644 001750 001750 00000026333 11163362147 023640 0ustar00remonremon000000 000000 AudioClipEditDialog 0 0 500 285 Dialog 6 9 0 Clip Parameters 100 0 Source Name Gain Track start Length End false -120.000000000000000 30.000000000000000 0.200000000000000 hh:mm:ss.sss hh:mm:ss.sss QFrame::StyledPanel QFrame::Sunken TextLabel Qt::Horizontal 261 20 External Processing Fades 6 9 Fade In 9 6 1.000000000000000 0.050000000000000 1.000000000000000 0.050000000000000 Mode Bending Length Strength &Linear &Default Fade Out 9 6 1.000000000000000 0.050000000000000 Bending Mode Length Strength 1.000000000000000 0.050000000000000 &Linear &Default Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok traverso-0.49.4/src/sheetcanvas/TrackView.h000755 001750 001750 00000004303 11163362147 021131 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2006 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef TRACK_VIEW_H #define TRACK_VIEW_H #include "ViewItem.h" class Track; class AudioClip; class AudioClipView; class TrackPanelView; class PluginChainView; class TrackView : public ViewItem { Q_OBJECT Q_CLASSINFO("edit_properties", tr("Edit properties")) Q_CLASSINFO("add_new_plugin", tr("Add new Plugin")) Q_CLASSINFO("select_bus", tr("Select Bus")) Q_CLASSINFO("insert_silence", tr("Insert Silence")) public: TrackView(SheetView* sv, Track* track); ~TrackView(); void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); Track* get_track() const; QList* get_clipviews() {return &m_clipViews;} TrackPanelView* get_trackpanel_view() const; int get_childview_y_offset() const; void move_to(int x, int y); int get_height(); void set_height(int height); void calculate_bounding_rect(); void load_theme_data(); void to_front(AudioClipView* view); private: Track* m_track; QList m_clipViews; TrackPanelView* m_panel; PluginChainView* m_pluginChainView; int m_height; int m_paintBackground; int m_cliptopmargin; int m_clipbottommargin; int m_topborderwidth; int m_bottomborderwidth; friend class TrackPanelView; public slots: Command* edit_properties(); Command* add_new_plugin(); Command* select_bus(); Command* insert_silence(); private slots: void add_new_audioclipview(AudioClip* clip); void remove_audioclipview(AudioClip* clip); }; #endif //eof traverso-0.49.4/src/sheetcanvas/TimeLineView.h000644 001750 001750 00000005717 11163362147 021602 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef TIME_LINE_VIEW_H #define TIME_LINE_VIEW_H #include "ViewItem.h" #include #include class SheetView; class TimeLine; class MarkerView; class Marker; class DragMarker : public Command { Q_OBJECT Q_CLASSINFO("move_left", tr("Move Left")) Q_CLASSINFO("move_right", tr("Move right")) public: DragMarker(MarkerView* mview, qint64 scalefactor, const QString& des); int prepare_actions(); int do_action(); int undo_action(); int finish_hold(); int begin_hold(); void cancel_action(); int jog(); private : Marker* m_marker; TimeRef m_origWhen; TimeRef m_newWhen; struct Data { MarkerView* view; qint64 scalefactor; bool bypassjog; int jogBypassPos; }; Data* d; public slots: void move_left(bool autorepeat); void move_right(bool autorepeat); }; class TimeLineView : public ViewItem { Q_OBJECT Q_CLASSINFO("add_marker", tr("Add Marker")) Q_CLASSINFO("add_marker_at_playhead", tr("Add Marker at Playhead")) Q_CLASSINFO("remove_marker", tr("Remove Marker")) Q_CLASSINFO("drag_marker", tr("Drag Marker")) Q_CLASSINFO("clear_markers", tr("Clear all Markers")) Q_CLASSINFO("playhead_to_marker", tr("Playhead to Marker")) public: TimeLineView(SheetView* view); ~TimeLineView(); void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); void calculate_bounding_rect(); void load_theme_data(); protected: void hoverEnterEvent ( QGraphicsSceneHoverEvent * event ); void hoverLeaveEvent ( QGraphicsSceneHoverEvent * event ); void hoverMoveEvent ( QGraphicsSceneHoverEvent * event ); private: QList m_markerViews; TimeLine* m_timeline; MarkerView* m_blinkingMarker; QColor m_blinkColor; QHash m_zooms; Command* add_marker_at(const TimeRef when); void update_softselected_marker(QPoint pos); public slots: void hzoom_changed(); public slots: Command* add_marker(); Command* add_marker_at_playhead(); Command* remove_marker(); Command* drag_marker(); Command* clear_markers(); Command* playhead_to_marker(); private slots: void add_new_marker_view(Marker* marker); void remove_marker_view(Marker* marker); }; #endif //eof traverso-0.49.4/src/sheetcanvas/Cursors.h000644 001750 001750 00000004711 11163362147 020672 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef CURSORS_H #define CURSORS_H #include "ViewItem.h" #include #include class Sheet; class SheetView; class ClipsViewPort; class PlayHead : public ViewItem { Q_OBJECT public: PlayHead(SheetView* sv, Sheet* sheet, ClipsViewPort* vp); ~PlayHead(); void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); void set_bounding_rect(QRectF rect); bool is_active(); void set_active(bool active); enum PlayHeadMode { FLIP_PAGE, CENTERED, ANIMATED_FLIP_PAGE }; void set_mode(PlayHeadMode mode); void toggle_follow(); private: Sheet* m_sheet; QTimer m_playTimer; QTimeLine m_animation; ClipsViewPort* m_vp; bool m_follow; bool m_followDisabled; PlayHeadMode m_mode; int m_animationScrollStartPos; int m_animFrameRange; qreal m_animScaleFactor; private slots: void check_config(); void play_start(); void play_stop(); void set_animation_value(int); void animation_finished(); public slots: void update_position(); void enable_follow(); // enable/disable follow only do anything if following is void disable_follow(); // enabled in the config }; class WorkCursor : public ViewItem { Q_OBJECT public: WorkCursor(SheetView* sv, Sheet* sheet); ~WorkCursor(); void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); void set_bounding_rect(QRectF rect); private: Sheet* m_sheet; SheetView* m_sv; QPixmap m_pix; void update_background(); public slots: void update_position(); }; #endif //eof traverso-0.49.4/src/sheetcanvas/SheetView.cpp000644 001750 001750 00000044516 11163362147 021477 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-11 USA. */ #include #include "InputEngine.h" #include "Sheet.h" #include "SnapList.h" #include "Track.h" #include "ContextPointer.h" #include "Themer.h" #include "SheetView.h" #include "SheetWidget.h" #include "TrackView.h" #include "TrackPanelView.h" #include "Cursors.h" #include "ClipsViewPort.h" #include "TimeLineViewPort.h" #include "TimeLineView.h" #include "TrackPanelViewPort.h" #include "AddRemove.h" #include "Zoom.h" #include "PlayHeadMove.h" #include "WorkCursorMove.h" #include "AudioDevice.h" #include class Shuttle : public Command { public : Shuttle(SheetView* sv) : Command("Shuttle"), m_sv(sv) {} int begin_hold() { m_sv->update_shuttle_factor(); m_sv->start_shuttle(true); return 1; } int finish_hold() { m_sv->start_shuttle(false); return 1; } int jog() { m_sv->update_shuttle_factor(); return 1; } private : SheetView* m_sv; }; static bool smallerTrackView(const TrackView* left, const TrackView* right ) { return left->get_track()->get_sort_index() < right->get_track()->get_sort_index(); } SheetView::SheetView(SheetWidget* sheetwidget, ClipsViewPort* viewPort, TrackPanelViewPort* tpvp, TimeLineViewPort* tlvp, Sheet* sheet) : ViewItem(0, sheet) { setZValue(1); m_sheet = sheet; m_clipsViewPort = viewPort; m_tpvp = tpvp; m_tlvp = tlvp; m_vScrollBar = sheetwidget->m_vScrollBar; m_hScrollBar = sheetwidget->m_hScrollBar; m_actOnPlayHead = true; m_viewportReady = false; m_clipsViewPort->scene()->addItem(this); m_playCursor = new PlayHead(this, m_sheet, m_clipsViewPort); m_workCursor = new WorkCursor(this, m_sheet); connect(m_sheet, SIGNAL(workingPosChanged()), m_workCursor, SLOT(update_position())); connect(m_sheet, SIGNAL(transportStarted()), this, SLOT(follow_play_head())); connect(m_sheet, SIGNAL(transportPosSet()), this, SLOT(transport_position_set())); connect(m_sheet, SIGNAL(workingPosChanged()), this, SLOT(stop_follow_play_head())); m_clipsViewPort->scene()->addItem(m_playCursor); m_clipsViewPort->scene()->addItem(m_workCursor); m_clipsViewPort->setSceneRect(0, 0, MAX_CANVAS_WIDTH, MAX_CANVAS_HEIGHT); m_tlvp->setSceneRect(0, -TIMELINE_HEIGHT, MAX_CANVAS_WIDTH, 0); m_tpvp->setSceneRect(-200, 0, 0, MAX_CANVAS_HEIGHT); // Set up the viewports scale factor, and our timeref_scalefactor / m_peakCacheZoomFactor // Needed for our childs TrackView, AudioClipView, TimeLines MarkerViews etc which are created below. scale_factor_changed(); sheet_mode_changed(); connect(m_sheet, SIGNAL(hzoomChanged()), this, SLOT(scale_factor_changed())); connect(m_sheet, SIGNAL(tempFollowChanged(bool)), this, SLOT(set_follow_state(bool))); connect(m_sheet, SIGNAL(trackAdded(Track*)), this, SLOT(add_new_trackview(Track*))); connect(m_sheet, SIGNAL(trackRemoved(Track*)), this, SLOT(remove_trackview(Track*))); connect(m_sheet, SIGNAL(lastFramePositionChanged()), this, SLOT(update_scrollbars())); connect(m_sheet, SIGNAL(modeChanged()), this, SLOT(sheet_mode_changed())); connect(&m_shuttletimer, SIGNAL(timeout()), this, SLOT (update_shuttle())); connect(m_hScrollBar, SIGNAL(sliderMoved(int)), this, SLOT(stop_follow_play_head())); connect(m_hScrollBar, SIGNAL(actionTriggered(int)), this, SLOT(hscrollbar_action(int))); connect(m_hScrollBar, SIGNAL(valueChanged(int)), this, SLOT(hscrollbar_value_changed(int))); connect(m_vScrollBar, SIGNAL(valueChanged(int)), m_clipsViewPort->verticalScrollBar(), SLOT(setValue(int))); m_shuttleCurve = new Curve(0); m_shuttleCurve->set_sheet(m_sheet); m_dragShuttleCurve = new Curve(0); m_dragShuttleCurve->set_sheet(m_sheet); // Use these variables to fine tune the scroll behavior float whens[7] = {0.0, 0.2, 0.3, 0.4, 0.6, 0.9, 1.2}; float values[7] = {0.0, 0.15, 0.3, 0.8, 0.95, 1.5, 8.0}; // Use these variables to fine tune the scroll during drag behavior float dragWhens[7] = {0.0, 0.9, 0.94, 0.98, 1.0, 1.1, 1.3}; float dragValues[7] = {0.0, 0.0, 0.2, 0.5, 0.85, 1.1, 2.0}; for (int i=0; i<7; ++i) { AddRemove* cmd = (AddRemove*) m_dragShuttleCurve->add_node(new CurveNode(m_dragShuttleCurve, dragWhens[i], dragValues[i]), false); cmd->set_instantanious(true); Command::process_command(cmd); cmd = (AddRemove*) m_shuttleCurve->add_node(new CurveNode(m_shuttleCurve, whens[i], values[i]), false); cmd->set_instantanious(true); Command::process_command(cmd); } } SheetView::~SheetView() { delete m_dragShuttleCurve; delete m_shuttleCurve; } void SheetView::scale_factor_changed( ) { timeref_scalefactor = qint64(m_sheet->get_hzoom() * (UNIVERSAL_SAMPLE_RATE / 44100)); m_tlvp->scale_factor_changed(); layout_tracks(); } void SheetView::sheet_mode_changed() { int mode = m_sheet->get_mode(); m_clipsViewPort->set_current_mode(mode); m_tlvp->set_current_mode(mode); m_tpvp->set_current_mode(mode); } TrackView* SheetView::get_trackview_under( QPointF point ) { TrackView* view = 0; QList views = m_clipsViewPort->items(m_clipsViewPort->mapFromScene(point)); for (int i=0; i(views.at(i)); if (view) { return view; } } return 0; } void SheetView::add_new_trackview(Track* track) { TrackView* view = new TrackView(this, track); m_trackViews.append(view); int sortIndex = track->get_sort_index(); if (sortIndex < 0) { sortIndex = m_trackViews.size(); track->set_sort_index(sortIndex); } else { foreach(TrackView* view, m_trackViews) { if (view->get_track()->get_sort_index() == sortIndex) { sortIndex = m_trackViews.size(); track->set_sort_index(sortIndex); break; } } } qSort(m_trackViews.begin(), m_trackViews.end(), smallerTrackView); for(int i=0; iget_track()->set_sort_index(i); } if (m_trackViews.size() > 1) { int height = m_trackViews.at(m_trackViews.size()-2)->get_track()->get_height(); m_trackViews.at(m_trackViews.size()-1)->get_track()->set_height(height); } layout_tracks(); } void SheetView::remove_trackview(Track* track) { foreach(TrackView* view, m_trackViews) { if (view->get_track() == track) { TrackPanelView* tpv = view->get_trackpanel_view(); scene()->removeItem(tpv); scene()->removeItem(view); m_trackViews.removeAll(view); delete view; delete tpv; break; } } for(int i=0; iget_track()->set_sort_index(i); } layout_tracks(); } void SheetView::update_scrollbars() { int width = (int)(m_sheet->get_last_location() / timeref_scalefactor) - (m_clipsViewPort->width() / 4); if (width < m_clipsViewPort->width() / 4) { width = m_clipsViewPort->width() / 4; } m_hScrollBar->setRange(0, width); m_hScrollBar->setSingleStep(m_clipsViewPort->width() / 10); m_hScrollBar->setPageStep(m_clipsViewPort->width()); m_vScrollBar->setRange(0, m_sceneHeight - m_clipsViewPort->height() / 2); m_vScrollBar->setSingleStep(m_clipsViewPort->height() / 10); m_vScrollBar->setPageStep(m_clipsViewPort->height()); m_playCursor->set_bounding_rect(QRectF(0, 0, 4, m_vScrollBar->maximum() + m_clipsViewPort->height())); m_playCursor->update_position(); m_workCursor->set_bounding_rect(QRectF(0, 0, 1, m_vScrollBar->maximum() + m_clipsViewPort->height())); m_workCursor->update_position(); set_snap_range(m_hScrollBar->value()); } void SheetView::hscrollbar_value_changed(int value) { // This slot is called when the hscrollbar value changes, // which can be due shuttling or playhead scrolling the page. // In that very case, we do NOT set the hscrollbar value AGAIN // but in case of a non-shuttle command, we call ie().jog to give the // command the opportunity to update (Gain-cursor position for example) // itself for the changed viewport / mouse coordinates. // FIXME This is NOT a solution to set hold-cursors at the correct // position in the viewport when it's scrolled programatically !!!!! if (ie().is_holding()) { Shuttle* s = dynamic_cast(ie().get_holding_command()); if (!s) { ie().jog(); } } else { m_clipsViewPort->horizontalScrollBar()->setValue(value); } set_snap_range(m_hScrollBar->value()); } void SheetView::vzoom(qreal factor) { PENTER; for (int i=0; iget_track(); int height = track->get_height(); height = (int) (height * factor); if (height > m_trackMaximumHeight) { height = m_trackMaximumHeight; } else if (height < m_trackMinimumHeight) { height = m_trackMinimumHeight; } track->set_height(height); } layout_tracks(); } void SheetView::hzoom(qreal factor) { PENTER; m_sheet->set_hzoom(m_sheet->get_hzoom() * factor); center(); } void SheetView::layout_tracks() { if (m_trackViews.isEmpty() || !m_viewportReady) return; int verticalposition = m_trackTopIndent; for (int i=0; icalculate_bounding_rect(); view->move_to(0, verticalposition); verticalposition += (view->get_track()->get_height() + m_trackSeperatingHeight); } m_sceneHeight = verticalposition; update_scrollbars(); } Command* SheetView::center() { PENTER2; TimeRef centerX; if (m_sheet->is_transport_rolling() && m_actOnPlayHead) { centerX = m_sheet->get_transport_location(); } else { centerX = m_sheet->get_work_location(); } int x = qRound(centerX / timeref_scalefactor); set_hscrollbar_value(x - m_clipsViewPort->width() / 2); return (Command*) 0; } void SheetView::transport_position_set() { if (!m_sheet->is_transport_rolling()) center_playhead(); } void SheetView::stop_follow_play_head() { m_sheet->set_temp_follow_state(false); } void SheetView::follow_play_head() { m_sheet->set_temp_follow_state(true); } void SheetView::set_follow_state(bool state) { if (state) { m_actOnPlayHead = true; m_playCursor->enable_follow(); m_playCursor->update_position(); } else { m_actOnPlayHead = false; m_playCursor->disable_follow(); } } Command* SheetView::shuttle() { return new Shuttle(this); } void SheetView::start_shuttle(bool start, bool drag) { if (start) { m_shuttletimer.start(40); m_dragShuttle = drag; m_shuttleYfactor = m_shuttleXfactor = 0; stop_follow_play_head(); } else { m_shuttletimer.stop(); } } void SheetView::set_shuttle_factor_values(int x, int y) { m_shuttleXfactor = x; m_shuttleYfactor = y; } void SheetView::update_shuttle_factor() { float vec[2]; int direction = 1; float normalizedX = (float) cpointer().x() / m_clipsViewPort->width(); if (normalizedX < 0.5) { normalizedX = 0.5 - normalizedX; normalizedX *= 2; direction = -1; } else if (normalizedX > 0.5) { normalizedX = normalizedX - 0.5; normalizedX *= 2; if (normalizedX > 1.0) { normalizedX *= 1.15; } } if (m_dragShuttle) { m_dragShuttleCurve->get_vector(normalizedX, normalizedX + 0.01, vec, 2); } else { m_shuttleCurve->get_vector(normalizedX, normalizedX + 0.01, vec, 2); } if (direction > 0) { m_shuttleXfactor = (int) (vec[0] * 30); } else { m_shuttleXfactor = (int) (vec[0] * -30); } direction = 1; float normalizedY = (float) cpointer().y() / m_clipsViewPort->height(); if (normalizedY < 0) normalizedY = 0; if (normalizedY > 1) normalizedY = 1; if (normalizedY > 0.35 && normalizedY < 0.65) { normalizedY = 0; } else if (normalizedY < 0.5) { normalizedY = 0.5 - normalizedY; direction = -1; } else if (normalizedY > 0.5) { normalizedY = normalizedY - 0.5; } normalizedY *= 2; if (m_dragShuttle) { m_dragShuttleCurve->get_vector(normalizedY, normalizedY + 0.01, vec, 2); } else { m_shuttleCurve->get_vector(normalizedY, normalizedY + 0.01, vec, 2); } int yscale; if (m_trackViews.size()) { yscale = int(mean_track_height() / 10); } else { yscale = int(m_clipsViewPort->viewport()->height() / 10); } if (direction > 0) { m_shuttleYfactor = (int) (vec[0] * yscale); } else { m_shuttleYfactor = (int) (vec[0] * -yscale); } if (m_dragShuttle) { m_shuttleYfactor *= 4; } } int SheetView::mean_track_height() { int total =0; int mean = 0; foreach(TrackView* view, m_trackViews) { total += view->get_height(); } mean = total / m_trackViews.size(); return mean; } void SheetView::update_shuttle() { int x = m_clipsViewPort->horizontalScrollBar()->value() + m_shuttleXfactor; set_hscrollbar_value(x); int y = m_clipsViewPort->verticalScrollBar()->value() + m_shuttleYfactor; set_vscrollbar_value(y); if (m_shuttleXfactor != 0 || m_shuttleYfactor != 0) { ie().jog(); } } Command* SheetView::goto_begin() { stop_follow_play_head(); m_sheet->set_work_at(TimeRef()); center(); return (Command*) 0; } Command* SheetView::goto_end() { stop_follow_play_head(); TimeRef lastlocation = m_sheet->get_last_location(); m_sheet->set_work_at(lastlocation); center(); return (Command*) 0; } TrackPanelViewPort* SheetView::get_trackpanel_view_port( ) const { return m_tpvp; } ClipsViewPort * SheetView::get_clips_viewport() const { return m_clipsViewPort; } Command * SheetView::touch( ) { QPointF point = m_clipsViewPort->mapToScene(QPoint(cpointer().on_first_input_event_x(), cpointer().on_first_input_event_y())); m_sheet->set_work_at(TimeRef(point.x() * timeref_scalefactor)); return 0; } Command * SheetView::touch_play_cursor( ) { QPointF point = m_clipsViewPort->mapToScene(QPoint(cpointer().on_first_input_event_x(), cpointer().on_first_input_event_y())); m_sheet->set_transport_pos(TimeRef(point.x() * timeref_scalefactor)); return 0; } Command * SheetView::play_to_begin( ) { m_sheet->set_transport_pos(TimeRef()); return 0; } Command * SheetView::play_cursor_move( ) { return new PlayHeadMove(m_playCursor, this); } Command * SheetView::work_cursor_move( ) { return new WorkCursorMove(m_playCursor, this); } void SheetView::set_snap_range(int start) { // printf("SheetView::set_snap_range\n"); m_sheet->get_snap_list()->set_range(TimeRef(start * timeref_scalefactor), TimeRef((start + m_clipsViewPort->viewport()->width()) * timeref_scalefactor), timeref_scalefactor); } Command* SheetView::scroll_up( ) { PENTER3; set_vscrollbar_value(m_clipsViewPort->verticalScrollBar()->value() - int(mean_track_height() * 0.75)); return (Command*) 0; } Command* SheetView::scroll_down( ) { PENTER3; set_vscrollbar_value(m_clipsViewPort->verticalScrollBar()->value() + int(mean_track_height() * 0.75)); return (Command*) 0; } Command* SheetView::scroll_right() { PENTER3; stop_follow_play_head(); set_hscrollbar_value(m_clipsViewPort->horizontalScrollBar()->value() + 50); return (Command*) 0; } Command* SheetView::scroll_left() { PENTER3; stop_follow_play_head(); set_hscrollbar_value(m_clipsViewPort->horizontalScrollBar()->value() - 50); return (Command*) 0; } int SheetView::hscrollbar_value() const { return m_clipsViewPort->horizontalScrollBar()->value(); } void SheetView::hscrollbar_action(int action) { if (action == QAbstractSlider::SliderPageStepAdd || action == QAbstractSlider::SliderPageStepSub) { stop_follow_play_head(); } } int SheetView::vscrollbar_value() const { return m_clipsViewPort->verticalScrollBar()->value(); } void SheetView::load_theme_data() { m_trackSeperatingHeight = themer()->get_property("Sheet:track:seperatingheight", 0).toInt(); m_trackMinimumHeight = themer()->get_property("Sheet:track:minimumheight", 16).toInt(); m_trackMaximumHeight = themer()->get_property("Sheet:track:maximumheight", 300).toInt(); m_trackTopIndent = themer()->get_property("Sheet:track:topindent", 6).toInt(); m_clipsViewPort->setBackgroundBrush(themer()->get_color("Sheet:background")); m_tpvp->setBackgroundBrush(themer()->get_color("TrackPanel:background")); layout_tracks(); } Command * SheetView::add_marker() { return m_tlvp->get_timeline_view()->add_marker(); } Command * SheetView::add_marker_at_playhead() { return m_tlvp->get_timeline_view()->add_marker_at_playhead(); } Command * SheetView::playhead_to_workcursor( ) { TimeRef worklocation = m_sheet->get_work_location(); m_sheet->set_transport_pos(worklocation); if (!m_sheet->is_transport_rolling()) { center(); } return (Command*) 0; } Command * SheetView::center_playhead( ) { TimeRef centerX = m_sheet->get_transport_location(); set_hscrollbar_value(int(centerX / timeref_scalefactor - m_clipsViewPort->width() / 2)); follow_play_head(); return (Command*) 0; } void SheetView::set_hscrollbar_value(int value) { m_clipsViewPort->horizontalScrollBar()->setValue(value); m_hScrollBar->setValue(value); m_sheet->set_scrollbar_xy(m_hScrollBar->value(), m_vScrollBar->value()); } void SheetView::set_vscrollbar_value(int value) { if (value > m_vScrollBar->maximum()) { value = m_vScrollBar->maximum(); } m_clipsViewPort->verticalScrollBar()->setValue(value); m_vScrollBar->setValue(value); m_sheet->set_scrollbar_xy(m_hScrollBar->value(), m_vScrollBar->value()); } void SheetView::clipviewport_resize_event() { // Once the ClipViewPort has been initialed, and _resized_ // only _then_ we know _our_ size, at which time it makes // sense to populate the view with tracks. if (!m_viewportReady) { // fill the view with trackviews, add_new_trackview() // doesn't yet layout the new tracks. foreach(Track* track, m_sheet->get_tracks()) { add_new_trackview(track); } // layout_track() now will do it's work when it is called m_viewportReady = true; // this will call layout_tracks() for us too // which will continue now, due m_viewportReady is true now load_theme_data(); // Everything is in place to scroll to the last position // we were at, at closing this view. int x, y; m_sheet->get_scrollbar_xy(x, y); set_hscrollbar_value(x); set_vscrollbar_value(y); } else { // if the viewport was resized, and everything was setup allready // it suffices to recalculate the scrollbar values. update_scrollbars(); } } traverso-0.49.4/src/sheetcanvas/TrackPanelView.h000644 001750 001750 00000006272 11163362147 022115 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: TrackPanelView.h,v 1.1 2008/01/21 16:17:30 r_sijrier Exp $ */ #ifndef TRACK_PANEL_VIEW_H #define TRACK_PANEL_VIEW_H #include "ViewItem.h" class Track; class TrackView; class TrackPanelViewPort; class PanelLed; class TrackPanelView; class TrackPanelGain : public ViewItem { Q_OBJECT public: TrackPanelGain(TrackPanelView* parent, Track* track); TrackPanelGain(){} void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); void set_width(int width); public slots: Command* gain_increment(); Command* gain_decrement(); private: Track* m_track; }; class TrackPanelPan : public ViewItem { Q_OBJECT public: TrackPanelPan(TrackPanelView* parent, Track* track); TrackPanelPan(){} void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); void set_width(int width); public slots: Command* pan_left(); Command* pan_right(); private: Track* m_track; }; class TrackPanelLed : public ViewItem { Q_OBJECT public: TrackPanelLed(TrackPanelView* view, const QString& name, const QString& toggleslot); void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); void set_bounding_rect(QRectF rect); private: Track* m_track; QString m_name; QString m_toggleslot; bool m_isOn; public slots: void ison_changed(bool isOn); Command* toggle(); }; class TrackPanelBus : public ViewItem { Q_OBJECT public: TrackPanelBus(TrackPanelView* view, Track* track, int busType); TrackPanelBus(){} void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); enum { BUSIN, BUSOUT }; private: Track* m_track; int m_type; QString m_busName; QPixmap m_pix; public slots: void bus_changed(); }; class TrackPanelView : public ViewItem { Q_OBJECT public: TrackPanelView(TrackView* trackView); ~TrackPanelView(); void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); void calculate_bounding_rect(); Track* get_track() const {return m_track;} private: Track* m_track; TrackView* m_tv; TrackPanelViewPort* m_viewPort; TrackPanelGain* m_gainView; TrackPanelPan* m_panView; TrackPanelLed* muteLed; TrackPanelLed* soloLed; TrackPanelLed* recLed; TrackPanelBus* inBus; TrackPanelBus* outBus; void draw_panel_track_name(QPainter* painter); void layout_panel_items(); private slots: void update_gain(); void update_pan(); void update_track_name(); }; #endif //eof traverso-0.49.4/src/traverso/000755 001750 001750 00000000000 12360571554 016423 5ustar00remonremon000000 000000 traverso-0.49.4/src/traverso/CMakeLists.txt000644 001750 001750 00000017572 12360571554 021177 0ustar00remonremon000000 000000 INCLUDE_DIRECTORIES( ${CMAKE_SOURCE_DIR}/src/audiofileio/decode ${CMAKE_SOURCE_DIR}/src/audiofileio/encode ${CMAKE_SOURCE_DIR}/src/commands ${CMAKE_SOURCE_DIR}/src/common ${CMAKE_SOURCE_DIR}/src/core ${CMAKE_SOURCE_DIR}/src/engine ${CMAKE_SOURCE_DIR}/src/plugins ${CMAKE_SOURCE_DIR}/src/plugins/LV2 ${CMAKE_SOURCE_DIR}/src/plugins/native ${CMAKE_SOURCE_DIR}/src/sheetcanvas ${QT_QTGUI_INCLUDE_DIR} ${QT_QTXML_INCLUDE_DIR} ) SET(TRAVERSO_GUI_SOURCES ${CMAKE_SOURCE_DIR}/src/common/fpu.cc Main.cpp Interface.cpp Traverso.cpp dialogs/settings/Pages.cpp dialogs/settings/SettingsDialog.cpp dialogs/project/ProjectManagerDialog.cpp dialogs/InsertSilenceDialog.cpp dialogs/MarkerDialog.cpp dialogs/BusSelectorDialog.cpp dialogs/project/NewSheetDialog.cpp dialogs/project/NewProjectDialog.cpp dialogs/project/OpenProjectDialog.cpp dialogs/project/NewTrackDialog.cpp dialogs/project/ImportClipsDialog.cpp dialogs/RestoreProjectBackupDialog.cpp dialogs/PluginSelectorDialog.cpp dialogs/ProjectConverterDialog.cpp dialogs/ExportDialog.cpp dialogs/CDWritingDialog.cpp widgets/BusMonitor.cpp widgets/CorrelationMeterWidget.cpp widgets/ExportFormatOptionsWidget.cpp widgets/InfoWidgets.cpp widgets/MessageWidget.cpp widgets/MeterWidget.cpp widgets/ResourcesWidget.cpp widgets/SpectralMeterWidget.cpp widgets/TransportConsoleWidget.cpp widgets/VUMeter.cpp ) SET(TRAVERSO_UI_FILES ui/AudioSourcesManagerWidget.ui ui/ExportFormatOptionsWidget.ui ui/SpectralMeterConfigWidget.ui ui/AudioDriverConfigPage.ui ui/AlsaDevicesPage.ui ui/PaDriverPage.ui ui/KeyboardConfigPage.ui ui/BehaviorConfigPage.ui ui/RecordingConfigPage.ui ui/AppearenceConfigPage.ui ui/PerformanceConfigPage.ui ui/SheetManagerDialog.ui ui/ProjectManagerDialog.ui ui/QuickStart.ui ui/MarkerDialog.ui ui/BusSelectorDialog.ui ui/OpenProjectDialog.ui ui/NewProjectDialog.ui ui/NewSheetDialog.ui ui/NewTrackDialog.ui ui/ResourcesWidget.ui ui/InsertSilenceDialog.ui ui/RestoreProjectBackupDialog.ui ui/ProjectConverterDialog.ui ui/ExportDialog.ui ui/CDWritingDialog.ui ui/ImportClipsDialog.ui ) SET(TRAVERSO_GUI_MOC_CLASSES Interface.h Traverso.h dialogs/BusSelectorDialog.h dialogs/CDWritingDialog.h dialogs/ExportDialog.h dialogs/InsertSilenceDialog.h dialogs/MarkerDialog.h dialogs/PluginSelectorDialog.h dialogs/ProjectConverterDialog.h dialogs/RestoreProjectBackupDialog.h dialogs/project/NewSheetDialog.h dialogs/project/NewTrackDialog.h dialogs/project/NewProjectDialog.h dialogs/project/ImportClipsDialog.h dialogs/project/OpenProjectDialog.h dialogs/project/ProjectManagerDialog.h dialogs/settings/SettingsDialog.h dialogs/settings/Pages.h widgets/BusMonitor.h widgets/CorrelationMeterWidget.h widgets/ExportFormatOptionsWidget.h widgets/InfoWidgets.h widgets/ResourcesWidget.h widgets/MessageWidget.h widgets/MeterWidget.h widgets/SpectralMeterWidget.h widgets/TransportConsoleWidget.h widgets/VUMeter.h ) QT4_ADD_RESOURCES(TRAVERSO_RESOURCES ../../resources/traverso.qrc ) QT4_WRAP_CPP(TRAVERSO_GUI_MOC_SOURCES ${TRAVERSO_GUI_MOC_CLASSES}) QT4_WRAP_UI(TRAVERSO_GUI_UI_SOURCES ${TRAVERSO_UI_FILES}) IF(AUTOPACKAGE_BUILD) find_program(RELAYTOOL_EXECUTABLE NAMES relaytool) IF(RELAYTOOL_EXECUTABLE) execute_process( COMMAND relaytool --multilink libjack.so.0 libjack-0.100.0.so.0 --relay jack -ljack OUTPUT_VARIABLE relaytool_invoke_result RESULT_VARIABLE relaytool_failed ) string(REGEX REPLACE "\n" "" relaytool_invoke_result "${relaytool_invoke_result}") string(REGEX REPLACE " +$" "" relaytool_invoke_result "${relaytool_invoke_result}") SET(JACK_STUB ../../${relaytool_invoke_result}) execute_process( COMMAND relaytool --relay FLAC -lFLAC OUTPUT_VARIABLE relaytool_invoke_result RESULT_VARIABLE relaytool_failed ) string(REGEX REPLACE "\n" "" relaytool_invoke_result "${relaytool_invoke_result}") string(REGEX REPLACE " +$" "" relaytool_invoke_result "${relaytool_invoke_result}") SET(FLAC_STUB ../../${relaytool_invoke_result}) execute_process( COMMAND relaytool --relay mad -lmad OUTPUT_VARIABLE relaytool_invoke_result RESULT_VARIABLE relaytool_failed ) string(REGEX REPLACE "\n" "" relaytool_invoke_result "${relaytool_invoke_result}") string(REGEX REPLACE " +$" "" relaytool_invoke_result "${relaytool_invoke_result}") SET(MAD_STUB ../../${relaytool_invoke_result}) execute_process( COMMAND relaytool --relay mp3lame -lmp3lame OUTPUT_VARIABLE relaytool_invoke_result RESULT_VARIABLE relaytool_failed ) string(REGEX REPLACE "\n" "" relaytool_invoke_result "${relaytool_invoke_result}") string(REGEX REPLACE " +$" "" relaytool_invoke_result "${relaytool_invoke_result}") SET(LAME_STUB ../../${relaytool_invoke_result}) execute_process( COMMAND relaytool --relay ogg -logg OUTPUT_VARIABLE relaytool_invoke_result RESULT_VARIABLE relaytool_failed ) string(REGEX REPLACE "\n" "" relaytool_invoke_result "${relaytool_invoke_result}") string(REGEX REPLACE " +$" "" relaytool_invoke_result "${relaytool_invoke_result}") SET(OGG_STUB ../../${relaytool_invoke_result}) execute_process( COMMAND relaytool --relay vorbis -lvorbis OUTPUT_VARIABLE relaytool_invoke_result RESULT_VARIABLE relaytool_failed ) string(REGEX REPLACE "\n" "" relaytool_invoke_result "${relaytool_invoke_result}") string(REGEX REPLACE " +$" "" relaytool_invoke_result "${relaytool_invoke_result}") SET(VORBIS_STUB ../../${relaytool_invoke_result}) execute_process( COMMAND relaytool --relay vorbisfile -lvorbisfile OUTPUT_VARIABLE relaytool_invoke_result RESULT_VARIABLE relaytool_failed ) string(REGEX REPLACE "\n" "" relaytool_invoke_result "${relaytool_invoke_result}") string(REGEX REPLACE " +$" "" relaytool_invoke_result "${relaytool_invoke_result}") SET(VORBISFILE_STUB ../../${relaytool_invoke_result}) execute_process( COMMAND relaytool --relay vorbisenc -lvorbisenc OUTPUT_VARIABLE relaytool_invoke_result RESULT_VARIABLE relaytool_failed ) string(REGEX REPLACE "\n" "" relaytool_invoke_result "${relaytool_invoke_result}") string(REGEX REPLACE " +$" "" relaytool_invoke_result "${relaytool_invoke_result}") SET(VORBIS_ENC_STUB ../../${relaytool_invoke_result}) MESSAGE(${VORBIS_ENC_STUB}) ENDIF(RELAYTOOL_EXECUTABLE) ELSE(AUTOPACKAGE_BUILD) SET(JACK_LIB jack) SET(FLAC_LIB FLAC) SET(MAD_LIB mad) SET(LAME_LIB mp3lame) SET(OGG_LIB ogg) SET(VORBIS_LIB vorbis) SET(VORBIS_FILE_LIB vorbisfile) SET(VORBIS_ENC_LIB vorbisenc) ENDIF(AUTOPACKAGE_BUILD) ADD_EXECUTABLE(traverso ${TRAVERSO_GUI_SOURCES} ${TRAVERSO_GUI_UI_SOURCES} ${TRAVERSO_GUI_MOC_SOURCES} ${TRAVERSO_RESOURCES} ${JACK_STUB} ${FLAC_STUB} ${MAD_STUB} ${LAME_STUB} ${OGG_STUB} ${VORBIS_STUB} ${VORBISFILE_STUB} ${VORBIS_ENC_STUB} ) TARGET_LINK_LIBRARIES(traverso ${QT_LIBRARIES} ${QT_QTXML_LIBRARY} traversosheetcanvas traversocore traversoaudiofileio traversoaudiobackend traversoplugins tcp_traversocommands traversocommands samplerate sndfile wavpack ${OGG_LIB} ${VORBIS_LIB} ${VORBIS_FILE_LIB} ${VORBIS_ENC_LIB} ${FLAC_LIB} fftw3 # rt ) IF(HAVE_PORTAUDIO) TARGET_LINK_LIBRARIES(traverso portaudio ) ENDIF(HAVE_PORTAUDIO) IF(HAVE_PULSEAUDIO) TARGET_LINK_LIBRARIES(traverso pulse ) ENDIF(HAVE_PULSEAUDIO) IF(HAVE_LILV) TARGET_LINK_LIBRARIES(traverso ${LIBLILV_LIBRARIES} ) ENDIF(HAVE_LILV) IF(HAVE_MP3_DECODING) TARGET_LINK_LIBRARIES(traverso ${MAD_LIB} ) ENDIF(HAVE_MP3_DECODING) IF(HAVE_MP3_ENCODING) TARGET_LINK_LIBRARIES(traverso ${LAME_LIB} ) ENDIF(HAVE_MP3_ENCODING) # IF(HAVE_OPENGL) # TARGET_LINK_LIBRARIES(traverso # ${QT_QTOPENGL_LIBRARY} # ) # ENDIF(HAVE_OPENGL) IF(HAVE_ALSA) TARGET_LINK_LIBRARIES(traverso asound ) ENDIF(HAVE_ALSA) IF(HAVE_JACK) TARGET_LINK_LIBRARIES(traverso ${JACK_LIB} ) ENDIF(HAVE_JACK) TARGET_LINK_LIBRARIES(traverso dl ) IF(USE_PCH) ADD_DEPENDENCIES(traverso precompiled_headers) ENDIF(USE_PCH) SET(EXE_NAME "traverso${TAG_VERSION}") INSTALL(TARGETS ${EXE_NAME} RUNTIME DESTINATION bin) traverso-0.49.4/src/traverso/precompile.h000755 001750 001750 00000001355 11163362147 020736 0ustar00remonremon000000 000000 #include #include #include // All moc genereated code has this include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include traverso-0.49.4/src/traverso/Main.cpp000755 001750 001750 00000007454 12357214143 020022 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2009 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include #include #include #include #include #include #include "Config.h" #include "Traverso.h" #include "Main.h" #include "../config.h" #include #include // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" Traverso* traverso; int signalcount = 0; #if defined (Q_WS_X11) || defined (Q_WS_MAC) void catch_signal(int sig_num) { if (!signalcount) { ++signalcount; traverso->shutdown(sig_num); exit(0); } else { printf("Catched multiple signals, aborting !\n"); kill (-getpgrp(), SIGABRT); exit(-1); } } #endif #if defined (STATIC_BUILD) Q_IMPORT_PLUGIN(tcp_traversocommands); #endif int main( int argc, char **argv ) { TRACE_OFF(); MEM_ON(); #if defined (Q_WS_X11) || defined (Q_WS_MAC) signal(SIGINT, catch_signal); signal(SIGSEGV, catch_signal); #endif TraversoDebugger::set_debug_level(TraversoDebugger::OFF); if (argc > 1) { for (int i=1; iinstallTranslator(&traversoTranslator); traverso->exec(); delete traverso; MEM_OFF(); printf("Thank you for using Traverso !\n"); return 0; } traverso-0.49.4/src/traverso/Traverso.h000755 001750 001750 00000002541 11163362147 020402 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2006 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: Traverso.h,v 1.10 2007/10/27 17:57:16 r_sijrier Exp $ */ #ifndef Traverso_H #define Traverso_H #include #include class Traverso : public QApplication { Q_OBJECT public : Traverso(int &argc, char **argv ); ~Traverso(); void shutdown(int signal); protected: void saveState ( QSessionManager& manager ); void commitData ( QSessionManager& manager ); private : void init_sse(); void setup_fpu(); void prepare_audio_device(); private slots: void create_interface(); }; #endif traverso-0.49.4/src/traverso/Main.h000755 001750 001750 00000001431 11163362147 017456 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2009 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef MAIN_H #define MAIN_H #endif traverso-0.49.4/src/traverso/Interface.h000755 001750 001750 00000015134 11163362147 020477 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef INTERFACE_H #define INTERFACE_H #include #include class Sheet; class Track; class Project; class BusMonitor; class InfoBox; class ViewPort; class ContextItem; class Command; class QLabel; class ExportDialog; class CDWritingDialog; class QStackedWidget; class QHBoxLayout; class QVBoxLayout; class QUndoView; class QDockWidget; class QToolBar; class QToolButton; class ResourcesWidget; class ResourcesInfoWidget; class SheetWidget; class CorrelationMeterWidget; class SpectralMeterWidget; class TransportConsoleWidget; class SettingsDialog; class ProjectManagerDialog; class OpenProjectDialog; class InfoToolBar; class SysInfoToolBar; class InsertSilenceDialog; class MarkerDialog; class BusSelectorDialog; class NewSheetDialog; class NewTrackDialog; class NewProjectDialog; class Ui_QuickStartDialog; class RestoreProjectBackupDialog; class ProgressToolBar; struct MenuData; class Interface : public QMainWindow { Q_OBJECT Q_CLASSINFO("show_export_widget", tr("Show Export Dialog")) Q_CLASSINFO("show_context_menu", tr("Show Context Menu")) Q_CLASSINFO("about_traverso", tr("About Traverso")) Q_CLASSINFO("show_project_manager_dialog", tr("Show Project Management Dialog")) Q_CLASSINFO("full_screen", tr("Full Screen")) Q_CLASSINFO("export_keymap", tr("Export keymap")) Q_CLASSINFO("start_transport", tr("Play")) Q_CLASSINFO("set_recordable_and_start_transport", tr("Record")); public : Interface(); ~Interface(); static Interface* instance(); void select_fade_in_shape(); void select_fade_out_shape(); void show_busselector(Track* track); void set_insertsilence_track(Track* track); protected: void keyPressEvent ( QKeyEvent* e); void keyReleaseEvent ( QKeyEvent* e); void closeEvent ( QCloseEvent * event ); QSize sizeHint () const; void changeEvent(QEvent *event); bool eventFilter(QObject *obj, QEvent *ev); private: QStackedWidget* centerAreaWidget; QHash m_sheetWidgets; SheetWidget* currentSheetWidget; QList currentProjectViewPortList; QHash m_contextMenus; ExportDialog* m_exportDialog; CDWritingDialog* m_cdWritingDialog; QUndoView* historyWidget; QDockWidget* historyDW; QDockWidget* busMonitorDW; QDockWidget* AudioSourcesDW; ResourcesWidget* audiosourcesview; QDockWidget* correlationMeterDW; CorrelationMeterWidget* correlationMeter; TransportConsoleWidget* transportConsole; QDockWidget* spectralMeterDW; SpectralMeterWidget* spectralMeter; SettingsDialog* m_settingsdialog; ProjectManagerDialog* m_projectManagerDialog; OpenProjectDialog* m_openProjectDialog; InsertSilenceDialog* m_insertSilenceDialog; SysInfoToolBar* m_sysinfo; ProgressToolBar* m_progressBar; BusSelectorDialog* m_busSelector; NewSheetDialog* m_newSheetDialog; NewTrackDialog* m_newTrackDialog; NewProjectDialog* m_newProjectDialog; QDialog* m_quickStart; RestoreProjectBackupDialog* m_restoreProjectBackupDialog; Project* m_project; bool m_isFollowing; BusMonitor* busMonitor; QToolBar* mainToolBar; QToolBar* m_projectToolBar; QToolBar* m_editToolBar; QToolButton* openGlButton; QAction* m_projectSaveAction; QAction* m_projectSheetManagerAction; QAction* m_projectExportAction; QAction* m_sheetMenuAction; QAction* m_snapAction; QAction* m_followAction; QAction* m_effectAction; QMenu* m_encodingMenu; QMenu* m_resampleQualityMenu; QMenu* m_projectMenu; QMenu* m_sheetMenu; QMenu* m_editMenu; QMenu* m_viewMenu; QMenu* m_settingsMenu; QMenu* m_helpMenu; QList m_currentSheetActions; void create_menus(); void save_config_and_emit_message(const QString& message); static Interface* m_instance; QMenu* create_context_menu(QObject* item, QList* list = 0); QMenu* create_fade_selector_menu(const QString& fadeTypeName); public slots : void set_project(Project* project); void show_sheet(Sheet* sheet); void show_settings_dialog(); void show_settings_dialog_sound_system_page(); void open_help_browser(); void process_context_menu_action(QAction* action); void set_fade_in_shape(QAction* action); void set_fade_out_shape(QAction* action); void config_changed(); void import_audio(); void show_restore_project_backup_dialog(); void change_recording_format_to_wav(); void change_recording_format_to_wav64(); void change_recording_format_to_wavpack(); void change_resample_quality_to_best(); void change_resample_quality_to_high(); void change_resample_quality_to_medium(); void change_resample_quality_to_fast(); Command* full_screen(); Command* about_traverso(); Command* quick_start(); Command* export_keymap(); Command* get_keymap(QString &); Command* show_export_widget(); Command* show_cd_writing_dialog(); Command* show_context_menu(); Command* show_open_project_dialog(); Command* show_project_manager_dialog(); Command* show_restore_project_backup_dialog(QString projectdir); Command* show_insertsilence_dialog(); Command* show_marker_dialog(); Command* show_newsheet_dialog(); Command* show_newtrack_dialog(); Command* show_newproject_dialog(); Command* start_transport(); Command* set_recordable_and_start_transport(); private slots: void delete_sheetwidget(Sheet*); void project_dir_change_detected(); void project_load_failed(QString project, QString reason); void project_file_mismatch(QString rootdir, QString projectname); void snap_state_changed(bool state); void update_snap_state(); void effect_state_changed(bool state); void update_effects_state(); void follow_state_changed(bool state); void update_follow_state(); void update_temp_follow_state(bool state); void sheet_selector_update_sheets(); void sheet_selected(); void sheet_selector_sheet_added(Sheet*); void sheet_selector_sheet_removed(Sheet*); }; #include class DigitalClock : public QLCDNumber { Q_OBJECT public: DigitalClock(QWidget *parent = 0); private slots: void showTime(); }; #endif // eof traverso-0.49.4/src/traverso/Interface.cpp000755 001750 001750 00000140324 11163362147 021032 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "../config.h" #include #include "libtraversosheetcanvas.h" #include #include #include #include #include #include #include #include #include #include #include #include #include "Interface.h" #include "ProjectManager.h" #include "ViewPort.h" #include "FadeCurve.h" #include "Config.h" #include "Plugin.h" #include "Import.h" #include "TimeLine.h" #include "AudioFileCopyConvert.h" #include "../sheetcanvas/SheetWidget.h" #include "ui_QuickStart.h" #include "widgets/BusMonitor.h" #include "widgets/InfoWidgets.h" #include "widgets/ResourcesWidget.h" #include "widgets/CorrelationMeterWidget.h" #include "widgets/SpectralMeterWidget.h" #include "widgets/TransportConsoleWidget.h" #include "dialogs/settings/SettingsDialog.h" #include "dialogs/project/ProjectManagerDialog.h" #include "dialogs/project/OpenProjectDialog.h" #include "dialogs/project/NewProjectDialog.h" #include "dialogs/project/NewSheetDialog.h" #include "dialogs/project/NewTrackDialog.h" #include "dialogs/MarkerDialog.h" #include "dialogs/BusSelectorDialog.h" #include "dialogs/InsertSilenceDialog.h" #include "dialogs/RestoreProjectBackupDialog.h" #include "dialogs/ProjectConverterDialog.h" #include "dialogs/ExportDialog.h" #include "dialogs/CDWritingDialog.h" #include "dialogs/project/ImportClipsDialog.h" // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" class HistoryWidget : public QUndoView { public: HistoryWidget(QUndoGroup* group, QWidget* parent) : QUndoView(group, parent) { } protected: QSize sizeHint() const { return QSize(120, 140); } QSize minimumSizeHint() const { return QSize(90, 90); } }; Interface* Interface::m_instance = 0; Interface* Interface::instance() { if (m_instance == 0) { m_instance = new Interface(); } return m_instance; } Interface::Interface() : QMainWindow( 0 ) { PENTERCONS; setWindowTitle("Traverso"); setMinimumSize(400, 300); setWindowIcon(QPixmap (":/windowicon") ); // setMaximumWidth(1024); // setMaximumHeight(768); // CenterAreaWidget centerAreaWidget = new QStackedWidget(this); setCentralWidget(centerAreaWidget); // HistoryView historyDW = new QDockWidget(tr("History"), this); historyDW->setObjectName("HistoryDockWidget"); historyWidget = new HistoryWidget(pm().get_undogroup(), historyDW); historyWidget->setFocusPolicy(Qt::NoFocus); historyDW->setWidget(historyWidget); addDockWidget(Qt::RightDockWidgetArea, historyDW); // AudioSources View AudioSourcesDW = new QDockWidget(tr("Resources Bin"), this); AudioSourcesDW->setObjectName("AudioSourcesDockWidget"); audiosourcesview = new ResourcesWidget(AudioSourcesDW); audiosourcesview->setFocusPolicy(Qt::NoFocus); AudioSourcesDW->setWidget(audiosourcesview); addDockWidget(Qt::TopDockWidgetArea, AudioSourcesDW); AudioSourcesDW->hide(); // Meter Widgets correlationMeterDW = new QDockWidget(tr("Correlation Meter"), this); correlationMeterDW->setObjectName("CorrelationMeterDockWidget"); correlationMeter = new CorrelationMeterWidget(correlationMeterDW); correlationMeter->setFocusPolicy(Qt::NoFocus); correlationMeterDW->setWidget(correlationMeter); addDockWidget(Qt::TopDockWidgetArea, correlationMeterDW); correlationMeterDW->hide(); spectralMeterDW = new QDockWidget(tr("FFT Spectrum"), this); spectralMeterDW->setObjectName("SpectralMeterDockWidget"); spectralMeter = new SpectralMeterWidget(spectralMeterDW); spectralMeter->setFocusPolicy(Qt::NoFocus); spectralMeterDW->setWidget(spectralMeter); addDockWidget(Qt::TopDockWidgetArea, spectralMeterDW); spectralMeterDW->hide(); // BusMonitor busMonitorDW = new QDockWidget("VU Meters", this); busMonitorDW->setObjectName("VU Meters"); busMonitor = new BusMonitor(busMonitorDW); busMonitorDW->setWidget(busMonitor); addDockWidget(Qt::RightDockWidgetArea, busMonitorDW); m_sysinfo = new SysInfoToolBar(this); m_sysinfo->setObjectName("System Info Toolbar"); addToolBar(Qt::BottomToolBarArea, m_sysinfo); m_progressBar = new ProgressToolBar(this); m_progressBar->setObjectName("Progress Toolbar"); addToolBar(Qt::BottomToolBarArea, m_progressBar); m_progressBar->hide(); m_projectToolBar = new QToolBar(this); m_projectToolBar->setObjectName("Project Toolbar"); addToolBar(m_projectToolBar); m_editToolBar = new QToolBar(this); m_editToolBar->setObjectName("Edit Toolbar"); addToolBar(m_editToolBar); transportConsole = new TransportConsoleWidget(this); transportConsole->setObjectName("Transport Console"); #if defined (Q_WS_MAC) addToolBar(Qt::BottomToolBarArea, transportConsole); #else addToolBar(Qt::TopToolBarArea, transportConsole); #endif if (config().get_property("Themer", "textundericons", false).toBool()) { m_projectToolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); m_editToolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); } int iconsize = config().get_property("Themer", "iconsize", "22").toInt(); m_projectToolBar->setIconSize(QSize(iconsize, iconsize)); m_editToolBar->setIconSize(QSize(iconsize, iconsize)); // Some default values. currentSheetWidget = 0; m_exportDialog = 0; m_cdWritingDialog = 0; m_settingsdialog = 0; m_projectManagerDialog = 0; m_openProjectDialog = 0; m_newProjectDialog = 0; m_insertSilenceDialog = 0; m_busSelector = 0; m_newSheetDialog = 0; m_newTrackDialog = 0; m_quickStart = 0; m_restoreProjectBackupDialog = 0; create_menus(); /** Read in the Interface settings and apply them */ resize(config().get_property("Interface", "size", QSize(900, 600)).toSize()); move(config().get_property("Interface", "pos", QPoint(200, 200)).toPoint()); restoreState(config().get_property("Interface", "windowstate", "").toByteArray()); // Connections to core: connect(&pm(), SIGNAL(projectLoaded(Project*)), this, SLOT(set_project(Project*))); connect(&pm(), SIGNAL(aboutToDelete(Sheet*)), this, SLOT(delete_sheetwidget(Sheet*))); connect(&pm(), SIGNAL(unsupportedProjectDirChangeDetected()), this, SLOT(project_dir_change_detected())); connect(&pm(), SIGNAL(projectLoadFailed(QString,QString)), this, SLOT(project_load_failed(QString,QString))); connect(&pm(), SIGNAL(projectFileVersionMismatch(QString,QString)), this, SLOT(project_file_mismatch(QString,QString)), Qt::QueuedConnection); cpointer().add_contextitem(this); connect(&config(), SIGNAL(configChanged()), this, SLOT(config_changed())); connect(&config(), SIGNAL(configChanged()), this, SLOT(update_follow_state())); update_follow_state(); setUnifiedTitleAndToolBarOnMac(true); } Interface::~Interface() { PENTERDES; if (m_exportDialog) { delete m_exportDialog; } config().set_property("Interface", "size", size()); config().set_property("Interface", "fullScreen", isFullScreen()); config().set_property("Interface", "pos", pos()); config().set_property("Interface", "windowstate", saveState()); } void Interface::set_project(Project* project) { PENTER; m_project = project; if ( project ) { connect(project, SIGNAL(currentSheetChanged(Sheet*)), this, SLOT(show_sheet(Sheet*))); connect(project, SIGNAL(projectLoadFinished()), this, SLOT(sheet_selector_update_sheets())); connect(m_project, SIGNAL(sheetAdded(Sheet*)), this, SLOT(sheet_selector_sheet_added(Sheet*))); connect(m_project, SIGNAL(sheetRemoved(Sheet*)), this, SLOT(sheet_selector_sheet_removed(Sheet*))); setWindowTitle(project->get_title() + " - Traverso"); m_projectSaveAction->setEnabled(true); m_projectSheetManagerAction->setEnabled(true); m_projectExportAction->setEnabled(true); m_sheetMenuAction->setEnabled(true); // the project's sheets will be deleted _after_ // the project has been deleted, which will happen after this // function returns. When the sheets have been disconnected from the // audiodevice, delete_sheetwidget(Sheet* sheet) is called for all the sheets // in the project. Meanwhile, disable updates of the SheetWidgets (and implicitily // all their childrens) to avoid the (unlikely) situation of a paint event that // refers to data that was part of the then deleted project! // The reason to not delete the SheetWidgets right now is that the newly loaded project // now will be able to create and show it's sheetcanvas first, which improves the // users experience a lot! foreach(SheetWidget* sw, m_sheetWidgets) { sw->setUpdatesEnabled(false); } } else { m_projectSaveAction->setEnabled(false); m_projectSheetManagerAction->setEnabled(false); m_projectExportAction->setEnabled(false); m_sheetMenuAction->setEnabled(false); setWindowTitle("Traverso"); // No project loaded, the currently loaded project will be deleted after this // function returns, if the sheetcanvas is still painting (due playback e.g.) we // could get a crash due canvas items refering to data that was managed by the project. // so let's delete the SheetWidgets before the project is deleted! if (m_sheetWidgets.contains(0)) { delete m_sheetWidgets.take(0); } foreach(SheetWidget* sw, m_sheetWidgets) { delete_sheetwidget(sw->get_sheet()); } } } void Interface::delete_sheetwidget(Sheet* sheet) { SheetWidget* sw = m_sheetWidgets.value(sheet); if (sw) { m_sheetWidgets.remove(sheet); centerAreaWidget->removeWidget(sw); delete sw; } } void Interface::show_sheet(Sheet* sheet) { PENTER; SheetWidget* sheetWidget = 0; if (!sheet) { Project* project = pm().get_project(); if (project && project->get_sheets().size() == 0) { sheetWidget = m_sheetWidgets.value(0); if (!sheetWidget) { sheetWidget = new SheetWidget(0, centerAreaWidget); centerAreaWidget->addWidget(sheetWidget); m_sheetWidgets.insert(0, sheetWidget); } } m_snapAction->setEnabled(false); m_effectAction->setEnabled(false); m_followAction->setEnabled(false); } else { sheetWidget = m_sheetWidgets.value(sheet); connect(sheet, SIGNAL(snapChanged()), this, SLOT(update_snap_state())); connect(sheet, SIGNAL(modeChanged()), this, SLOT(update_effects_state())); connect(sheet, SIGNAL(tempFollowChanged(bool)), this, SLOT(update_temp_follow_state(bool))); connect(sheet, SIGNAL(transportStopped()), this, SLOT(update_follow_state())); update_snap_state(); update_effects_state(); m_snapAction->setEnabled(true); m_effectAction->setEnabled(true); m_followAction->setEnabled(true); } if (!sheetWidget) { sheetWidget = new SheetWidget(sheet, centerAreaWidget); centerAreaWidget->addWidget(sheetWidget); m_sheetWidgets.insert(sheet, sheetWidget); } currentSheetWidget = sheetWidget; centerAreaWidget->setCurrentIndex(centerAreaWidget->indexOf(sheetWidget)); sheetWidget->setFocus(); if (sheet) { pm().get_undogroup()->setActiveStack(sheet->get_history_stack()); } } Command* Interface::about_traverso() { PENTER; QString text(tr("Traverso %1 (built with Qt %2)\n\n" "A multitrack audio recording and editing program.\n\n" "Look in the Help menu for more info.\n\n" "Traverso is brought to you by R. Sijrier and others,\n" "including all the people from the Free Software world\n" "who contributed the important technologies on which\n" "Traverso is based (Gcc, Qt, Xorg, Linux, and so on)" ).arg(VERSION).arg(QT_VERSION_STR)); QMessageBox::about ( this, tr("About Traverso"), text); return (Command*) 0; } Command* Interface::quick_start() { PENTER; if (m_quickStart == 0) { m_quickStart = new QDialog(); Ui_QuickStartDialog *qsd = new Ui_QuickStartDialog(); qsd->setupUi(m_quickStart); } m_quickStart->show(); return (Command*) 0; } Command* Interface::full_screen() { if (isFullScreen()) showNormal(); else showFullScreen(); return (Command*) 0; } void Interface::keyPressEvent( QKeyEvent * e) { ie().catch_key_press(e); e->ignore(); } void Interface::keyReleaseEvent( QKeyEvent * e) { ie().catch_key_release(e); e->ignore(); } bool Interface::eventFilter(QObject * obj, QEvent * event) { QMenu* menu = qobject_cast(obj); // If the installed filter was for a QMenu, we need to // delegate key releases to the InputEngine, e.g. a hold // action would never finish if we release the hold key // on the open Menu, resulting in weird behavior! if (menu) { if (event->type() == QEvent::KeyRelease) { QKeyEvent *keyEvent = static_cast(event); ie().catch_key_release(keyEvent); return true; } else if (event->type() == QEvent::MouseMove) { // Also send mouse move events to the current viewport // so in case we close the Menu, and _do_not_move_the_mouse // and perform an action, it could be delegated to the wrong ViewItem! // Obviously we don't want to send this event when the InputEngine is still // in holding mode, to avoid jog() being called for the active HoldCommand! QMouseEvent* mouseEvent = static_cast(event); ViewPort* vp = cpointer().get_viewport(); if (vp && !ie().is_holding()) { vp->mouseMoveEvent(mouseEvent); } } else { return false; } } return false; } void Interface::changeEvent(QEvent *event) { switch (event->type()) { case QEvent::ActivationChange: case QEvent::WindowStateChange: // clean up the ie after Alt-Tab // if problems remain, maybe ie().reset() will help... ie().clear_modifier_keys(); default: break; } // pass the event on to the parent class QMainWindow::changeEvent(event); } Command * Interface::show_export_widget( ) { if (m_cdWritingDialog && !m_cdWritingDialog->isHidden()) { return 0; } if (! m_exportDialog) { m_exportDialog = new ExportDialog(this); } if (m_exportDialog->isHidden()) { m_exportDialog->show(); } return (Command*) 0; } Command * Interface::show_cd_writing_dialog( ) { if (m_exportDialog && !m_exportDialog->isHidden()) { return 0; } if (! m_cdWritingDialog) { m_cdWritingDialog = new CDWritingDialog(this); } if (m_cdWritingDialog->isHidden()) { m_cdWritingDialog->show(); } return (Command*) 0; } void Interface::create_menus( ) { QAction* action; m_projectMenu = menuBar()->addMenu(tr("&Project")); action = m_projectMenu->addAction(tr("&New...")); action->setIcon(find_pixmap(":/new")); action->setShortcuts(QKeySequence::New); m_projectToolBar->addAction(action); connect(action, SIGNAL(triggered(bool)), this, SLOT(show_newproject_dialog())); action = m_projectMenu->addAction(tr("&Open...")); action->setIcon(QIcon(":/open")); action->setShortcuts(QKeySequence::Open); m_projectToolBar->addAction(action); connect(action, SIGNAL(triggered(bool)), this, SLOT(show_open_project_dialog())); action = m_projectMenu->addAction(tr("&Save")); m_projectSaveAction = action; action->setShortcuts(QKeySequence::Save); action->setIcon(QIcon(":/save")); m_projectToolBar->addAction(action); connect(action, SIGNAL(triggered(bool)), &pm(), SLOT(save_project())); m_projectMenu->addSeparator(); action = m_projectMenu->addAction(tr("&Manage Project...")); m_projectSheetManagerAction = action; QList list; list.append(QKeySequence("F4")); m_projectSheetManagerAction->setShortcuts(list); m_projectSheetManagerAction->setIcon(QIcon(":/projectmanager")); m_projectToolBar->addAction(m_projectSheetManagerAction); connect(action, SIGNAL(triggered(bool)), this, SLOT(show_project_manager_dialog())); action = m_projectMenu->addAction(tr("&Export...")); m_projectExportAction = action; list.clear(); list.append(QKeySequence("F9")); m_projectExportAction->setShortcuts(list); m_projectExportAction->setIcon(QIcon(":/export")); m_projectToolBar->addAction(m_projectExportAction); connect(action, SIGNAL(triggered(bool)), this, SLOT(show_export_widget())); action = m_projectMenu->addAction(tr("&CD Writing...")); list.clear(); list.append(QKeySequence("F8")); action->setShortcuts(list); action->setIcon(QIcon(":/write-cd")); m_projectToolBar->addAction(action); connect(action, SIGNAL(triggered(bool)), this, SLOT(show_cd_writing_dialog())); action = m_projectMenu->addAction(tr("&Restore Backup...")); list.clear(); list.append(QKeySequence("F10")); action->setShortcuts(list); action->setIcon(QIcon(":/restore")); m_projectToolBar->addAction(action); connect(action, SIGNAL(triggered(bool)), this, SLOT(show_restore_project_backup_dialog())); m_projectMenu->addSeparator(); action = m_projectMenu->addAction(tr("&Quit")); list.clear(); // FIXME using CTRL + Q gives a warning about deleting an object in it's event handler!!!!!! list.append(QKeySequence("CTRL+Q")); action->setShortcuts(list); action->setIcon(QIcon(":/exit")); connect(action, SIGNAL(triggered( bool )), &pm(), SLOT(exit())); m_editMenu = menuBar()->addMenu(tr("&Edit")); action = m_editMenu->addAction(tr("Undo")); action->setIcon(QIcon(":/undo")); action->setShortcuts(QKeySequence::Undo); m_editToolBar->addAction(action); connect(action, SIGNAL(triggered( bool )), &pm(), SLOT(undo())); action = m_editMenu->addAction(tr("Redo")); action->setIcon(QIcon(":/redo")); action->setShortcuts(QKeySequence::Redo); m_editToolBar->addAction(action); connect(action, SIGNAL(triggered( bool )), &pm(), SLOT(redo())); m_editMenu->addSeparator(); m_editToolBar->addSeparator(); action = m_editMenu->addAction(tr("Import &Audio...")); action->setIcon(QIcon(":/import-audio")); m_editToolBar->addAction(action); connect(action, SIGNAL(triggered()), this, SLOT(import_audio())); action = m_editMenu->addAction(tr("Insert Si&lence...")); action->setIcon(QIcon(":/import-silence")); m_editToolBar->addAction(action); connect(action, SIGNAL(triggered()), this, SLOT(show_insertsilence_dialog())); m_editMenu->addSeparator(); m_editToolBar->addSeparator(); m_snapAction = m_editMenu->addAction(tr("&Snap")); m_snapAction->setIcon(QIcon(":/snap")); m_snapAction->setCheckable(true); m_snapAction->setToolTip(tr("Snap items to edges of other items while dragging.")); m_editToolBar->addAction(m_snapAction); connect(m_snapAction, SIGNAL(triggered(bool)), this, SLOT(snap_state_changed(bool))); m_followAction = m_editMenu->addAction(tr("S&croll Playback")); m_followAction->setIcon(QIcon(":/follow")); m_followAction->setCheckable(true); m_followAction->setToolTip(tr("Keep play cursor in view while playing or recording.")); m_editToolBar->addAction(m_followAction); connect(m_followAction, SIGNAL(triggered(bool)), this, SLOT(follow_state_changed(bool))); m_effectAction = m_editMenu->addAction(tr("&Show Effects")); m_effectAction->setIcon(QIcon(":/effects")); m_effectAction->setCheckable(true); m_effectAction->setToolTip(tr("Show effect plugins and automation curves on tracks")); m_editToolBar->addAction(m_effectAction); connect(m_effectAction, SIGNAL(triggered(bool)), this, SLOT(effect_state_changed(bool))); m_viewMenu = menuBar()->addMenu(tr("&View")); m_viewMenu->addAction(historyDW->toggleViewAction()); m_viewMenu->addAction(busMonitorDW->toggleViewAction()); m_viewMenu->addAction(AudioSourcesDW->toggleViewAction()); action = m_viewMenu->addAction(tr("Marker Editor...")); connect(action, SIGNAL(triggered(bool)), this, SLOT(show_marker_dialog())); m_viewMenu->addSeparator(); m_viewMenu->addAction(correlationMeterDW->toggleViewAction()); m_viewMenu->addAction(spectralMeterDW->toggleViewAction()); m_viewMenu->addSeparator(); QAction* toolbars = m_viewMenu->addAction("ToolBars"); toolbars->setEnabled(false); m_viewMenu->addSeparator(); m_viewMenu->addAction(transportConsole->toggleViewAction()); transportConsole->toggleViewAction()->setText(tr("Transport Console")); // if unifiedTitleAndToolBarOnMac == true we don't want the main toolbars // to be hidden. thus only add the menu entries on systems != OS X #if !defined (Q_WS_MAC) m_viewMenu->addAction(m_projectToolBar->toggleViewAction()); m_projectToolBar->toggleViewAction()->setText(tr("Project")); m_viewMenu->addAction(m_editToolBar->toggleViewAction()); m_editToolBar->toggleViewAction()->setText(tr("Edit")); #endif m_viewMenu->addAction(m_sysinfo->toggleViewAction()); m_sysinfo->toggleViewAction()->setText(tr("System Information")); m_sheetMenu = menuBar()->addMenu(tr("&Sheet")); m_sheetMenuAction = m_sheetMenu->menuAction(); action = m_sheetMenu->addAction(tr("New &Sheet(s)...")); action->setIcon(QIcon(":/new-sheet")); connect(action, SIGNAL(triggered()), this, SLOT(show_newsheet_dialog())); action = m_sheetMenu->addAction(tr("New &Track(s)...")); connect(action, SIGNAL(triggered()), this, SLOT(show_newtrack_dialog())); m_sheetMenu->addSeparator(); m_settingsMenu = menuBar()->addMenu(tr("Se&ttings")); m_encodingMenu = m_settingsMenu->addMenu(tr("&Recording File Format")); action = m_encodingMenu->addAction("WAVE"); action->setData("wav"); connect(action, SIGNAL(triggered(bool)), this, SLOT(change_recording_format_to_wav())); action = m_encodingMenu->addAction("WavPack"); action->setData("wavpack"); connect(action, SIGNAL(triggered( bool )), this, SLOT(change_recording_format_to_wavpack())); action = m_encodingMenu->addAction("WAVE-64"); action->setData("w64"); connect(action, SIGNAL(triggered( bool )), this, SLOT(change_recording_format_to_wav64())); m_resampleQualityMenu = m_settingsMenu->addMenu(tr("&Resample Quality")); action = m_resampleQualityMenu->addAction(tr("Best")); action->setData(0); connect(action, SIGNAL(triggered(bool)), this, SLOT(change_resample_quality_to_best())); action = m_resampleQualityMenu->addAction(tr("High")); action->setData(1); connect(action, SIGNAL(triggered(bool)), this, SLOT(change_resample_quality_to_high())); action = m_resampleQualityMenu->addAction(tr("Medium")); action->setData(2); connect(action, SIGNAL(triggered(bool)), this, SLOT(change_resample_quality_to_medium())); action = m_resampleQualityMenu->addAction(tr("Fast")); action->setData(3); connect(action, SIGNAL(triggered(bool)), this, SLOT(change_resample_quality_to_fast())); // fake a config changed 'signal-slot' action, to set the encoding menu icons config_changed(); m_settingsMenu->addSeparator(); action = m_settingsMenu->addAction(tr("&Preferences...")); connect(action, SIGNAL(triggered( bool )), this, SLOT(show_settings_dialog())); m_helpMenu = menuBar()->addMenu(tr("&Help")); action = m_helpMenu->addAction(tr("&Getting Started")); connect(action, SIGNAL(triggered(bool)), this, SLOT(quick_start())); action = m_helpMenu->addAction(tr("&User Manual")); action->setIcon(style()->standardIcon(QStyle::SP_DialogHelpButton)); connect(action, SIGNAL(triggered(bool)), this, SLOT(open_help_browser())); action = m_helpMenu->addAction(tr("&About Traverso")); connect(action, SIGNAL(triggered(bool)), this, SLOT(about_traverso())); } void Interface::process_context_menu_action( QAction * action ) { QStringList strings = action->data().toStringList(); QString name = strings.first(); ie().broadcast_action_from_contextmenu(name); } Command * Interface::show_context_menu( ) { QList items; // In case of a holding action, show the menu for the holding command! // If not, show the menu for the topmost context item, and it's // siblings as submenus if (ie().is_holding()) { Command* holding = ie().get_holding_command(); if (holding) { items.append(holding); } } else { items = cpointer().get_context_items(); // Filter out classes that don't need to show up in the menu foreach(QObject* item, items) { QString className = item->metaObject()->className(); if ( ( ! className.contains("View")) || className.contains("ViewPort") ) { items.removeAll(item); } } } if (items.isEmpty()) { printf("Interface:: No items under mouse to show context menu for!\n"); return 0; } // 'Store' the contextitems under the mouse cursor, so the InputEngine // dispatches the 'keyfact' from the menu to the 'pointed' objects! cpointer().set_contextmenu_items(cpointer().get_context_items()); QMenu* toplevelmenu = 0; QAction* action = 0; for (int i=0; imetaObject()->className(); if (i==0) { toplevelmenu = m_contextMenus.value(className); if ( ! toplevelmenu ) { printf("Interface: No menu for %s, creating new one\n", QS_C(className)); toplevelmenu = create_context_menu(item); if (! toplevelmenu ) { if (items.size() > 1) { toplevelmenu = new QMenu(); } else { return 0; } } m_contextMenus.insert(className, toplevelmenu); connect(toplevelmenu, SIGNAL(triggered(QAction*)), this, SLOT(process_context_menu_action(QAction*))); } else { break; } } else { // Create submenus toplevelmenu->addSeparator(); QMenu* menu = create_context_menu(item); if (! menu) { continue; } action = toplevelmenu->insertMenu(action, menu); QString name = className.remove("View"); action->setText(QObject::tr(QS_C(name))); } } // It's impossible there is NO toplevelmenu, but oh well... if (toplevelmenu) { toplevelmenu->exec(QCursor::pos()); } return 0; } QString create_keyfact_string(QString& keyfact, QList modifiers) { QString modifierkey = ""; foreach(int key, modifiers) { if (keyfact.contains("+)")) continue; if (key == Qt::Key_Alt) { modifierkey += "ALT+"; } else if (key == Qt::Key_Control) { modifierkey += "CTRL+"; } else { QKeySequence seq(key); modifierkey += seq.toString() + " +"; } } if (!modifierkey.isEmpty()) { modifierkey.prepend("("); modifierkey.append(")"); } return modifierkey + " " + keyfact; } Command * Interface::export_keymap() { QTextStream out; QFile data(QDir::homePath() + "/traversokeymap.html"); if (data.open(QFile::WriteOnly | QFile::Truncate)) { out.setDevice(&data); } else { return 0; } QString str; (Command *) get_keymap(str); out << str; data.close(); return 0; } Command * Interface::get_keymap(QString &str) { QMap > objects; QList sheetlist; sheetlist << &Sheet::staticMetaObject; sheetlist << &SheetView::staticMetaObject; QList tracklist; tracklist << &Track::staticMetaObject; tracklist << &TrackView::staticMetaObject; QList cliplist; cliplist << &AudioClip::staticMetaObject; cliplist << &AudioClipView::staticMetaObject; QList curvelist; curvelist << &Curve::staticMetaObject; curvelist << &CurveView::staticMetaObject; QList timelinelist; timelinelist << &TimeLine::staticMetaObject; timelinelist << &TimeLineView::staticMetaObject; QList markerlist; markerlist << &Marker::staticMetaObject; markerlist << &MarkerView::staticMetaObject; QList pluginlist; pluginlist << &Plugin::staticMetaObject; pluginlist << &PluginView::staticMetaObject; QList fadelist; fadelist << &FadeCurve::staticMetaObject; fadelist << &FadeView::staticMetaObject; QList interfacelist; interfacelist << &Interface::staticMetaObject; QList pmlist; pmlist << &ProjectManager::staticMetaObject; objects.insert("Sheet", sheetlist); objects.insert("Track", tracklist); objects.insert("AudioClip", cliplist); objects.insert("Curve", curvelist); objects.insert("TimeLine", timelinelist); objects.insert("Marker", markerlist); objects.insert("Plugin", pluginlist); objects.insert("Fade", fadelist); objects.insert("Interface", interfacelist); objects.insert("ProjectManager", pmlist); str = "

Traverso keymap: " + config().get_property("CCE", "keymap", "default").toString() + "

"; foreach(QList objectlist, objects.values()) { QString name = objects.key(objectlist); str += "

" + name + "

"; str += ""; QStringList result; foreach(const QMetaObject* mo, objectlist) { QList list; ie().create_menudata_for_metaobject(mo, list); QList menulist; QMenu* menu = create_context_menu(0, &list); if (menu) { menulist.append(menu); foreach(QAction* action, menu->actions()) { if (action->menu()) { menulist.append(action->menu()); } } for (int i=0; iactions()) { QStringList strings = action->data().toStringList(); if (strings.size() >= 3) { QString submenuname = ""; if (i > 0) { submenuname = somemenu->menuAction()->text() + "    "; } QString keyfact = strings.at(2); keyfact.replace("<", "<"); result += QString(""; } } } delete menu; } } result.sort(); str += result.join(""); str += "
" + tr("Description") + "" + tr("Key Sequence") + "
") + submenuname + strings.at(1) + "" + keyfact + "


"; } str += ""; return 0; } QMenu* Interface::create_context_menu(QObject* item, QList* menulist) { QList list; if (item) { list = ie().create_menudata_for( item ); } else { list = *menulist; } if (list.size() == 0) { // Empty menu! return 0; } qSort(list.begin(), list.end(), MenuData::smaller); QString name; if (item) { name = QString(item->metaObject()->className()).remove("View").remove("Panel"); } else { name = "noname"; } QMenu* menu = new QMenu(this); menu->installEventFilter(this); QAction* menuAction = menu->addAction(QObject::tr(QS_C(name))); QFont font(themer()->get_font("ContextMenu:fontscale:actions")); font.setBold(true); menuAction->setFont(font); menuAction->setEnabled(false); menu->addSeparator(); menu->setFont(themer()->get_font("ContextMenu:fontscale:actions")); QMap* > submenus; for (int i=0; i* list; if ( ! submenus.contains(data.submenu)) { submenus.insert(data.submenu, new QList()); } list = submenus.value(data.submenu); list->append(data); } else { QString keyfact = create_keyfact_string(data.keysequence, data.modifierkeys); QString text = QString(data.description + " " + keyfact); QAction* action = new QAction(this); action->setText(text); QStringList strings; strings << data.iedata << data.description << keyfact; action->setData(strings); menu->addAction(action); } } // For all submenus, create the Menu, and add // actions, a little code duplication here, adding action to the // menu is also done ~10 lines up ... QList keys = submenus.keys(); foreach(const QString &key, keys) { QList* list = submenus.value(key); qSort(list->begin(), list->end(), MenuData::smaller); QMenu* sub = new QMenu(this); sub->setFont(themer()->get_font("ContextMenu:fontscale:actions")); QFont font(themer()->get_font("ContextMenu:fontscale:actions")); font.setBold(true); sub->menuAction()->setFont(font); QAction* action = menu->insertMenu(0, sub); action->setText(QObject::tr(QS_C(key))); foreach(MenuData data, *list) { QAction* action = new QAction(sub); QString keyfact = create_keyfact_string(data.keysequence, data.modifierkeys); QString text = QString(data.description + " " + keyfact); action->setText(text); QStringList strings; strings << data.iedata << data.description << keyfact; action->setData(strings); sub->addAction(action); } delete list; } return menu; } void Interface::show_busselector(Track* track) { if (! m_busSelector) { m_busSelector = new BusSelectorDialog(this); } m_busSelector->set_current_track(track); m_busSelector->show(); } void Interface::set_insertsilence_track(Track* track) { if (m_insertSilenceDialog) { m_insertSilenceDialog->setTrack(track); } } void Interface::select_fade_in_shape( ) { QMenu* menu = m_contextMenus.value("fadeInSelector"); if (!menu) { menu = create_fade_selector_menu("fadeInSelector"); connect(menu, SIGNAL(triggered(QAction*)), this, SLOT(set_fade_in_shape(QAction*))); } menu->exec(QCursor::pos()); } void Interface::select_fade_out_shape( ) { QMenu* menu = m_contextMenus.value("fadeOutSelector"); if (!menu) { menu = create_fade_selector_menu("fadeOutSelector"); connect(menu, SIGNAL(triggered(QAction*)), this, SLOT(set_fade_out_shape(QAction*))); } menu->exec(QCursor::pos()); } void Interface::set_fade_in_shape( QAction * action ) { QList items = cpointer().get_context_items(); foreach(QObject* obj, items) { AudioClipView* acv = qobject_cast(obj); if (acv) { if (! acv->get_clip()->get_fade_in() ) { acv->get_clip()->set_fade_in(1); } acv->get_clip()->get_fade_in()->set_shape(action->data().toString()); break; } } } void Interface::set_fade_out_shape( QAction * action ) { QList items = cpointer().get_context_items(); foreach(QObject* obj, items) { AudioClipView* acv = qobject_cast(obj); if (acv) { if (! acv->get_clip()->get_fade_out() ) { acv->get_clip()->set_fade_out(1); } acv->get_clip()->get_fade_out()->set_shape(action->data().toString()); break; } } } QMenu* Interface::create_fade_selector_menu(const QString& fadeTypeName) { QMenu* menu = new QMenu(); foreach(QString name, FadeCurve::defaultShapes) { QAction* action = menu->addAction(name); action->setData(name); } m_contextMenus.insert(fadeTypeName, menu); return menu; } void Interface::config_changed() { /* bool toggled = config().get_property("Interface", "OpenGL", false).toBool(); foreach(SheetWidget* widget, m_sheetWidgets) { widget->set_use_opengl(toggled); }*/ QString encoding = config().get_property("Recording", "FileFormat", "wav").toString(); QList actions = m_encodingMenu->actions(); foreach(QAction* action, actions) { if (action->data().toString() == encoding) { action->setIcon(style()->standardIcon(QStyle::SP_DialogApplyButton)); } else { action->setIcon(QIcon()); } } int quality = config().get_property("Conversion", "RTResamplingConverterType", DEFAULT_RESAMPLE_QUALITY).toInt(); actions = m_resampleQualityMenu->actions(); bool useResampling = config().get_property("Conversion", "DynamicResampling", true).toBool(); if (useResampling) { m_resampleQualityMenu->setEnabled(true); } else { m_resampleQualityMenu->setEnabled(false); } foreach(QAction* action, actions) { if (action->data().toInt() == quality) { action->setIcon(style()->standardIcon(QStyle::SP_DialogApplyButton)); } else { action->setIcon(QIcon()); } } switch (config().get_property("Themer", "toolbuttonstyle", 0).toInt()) { case 0: m_projectToolBar->setToolButtonStyle(Qt::ToolButtonIconOnly); m_editToolBar->setToolButtonStyle(Qt::ToolButtonIconOnly); break; case 1: m_projectToolBar->setToolButtonStyle(Qt::ToolButtonTextOnly); m_editToolBar->setToolButtonStyle(Qt::ToolButtonTextOnly); break; case 2: m_projectToolBar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); m_editToolBar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); break; case 3: m_projectToolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); m_editToolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); break; } int iconsize = config().get_property("Themer", "iconsize", "22").toInt(); m_projectToolBar->setIconSize(QSize(iconsize, iconsize)); m_editToolBar->setIconSize(QSize(iconsize, iconsize)); int transportconsolesize = config().get_property("Themer", "transportconsolesize", "22").toInt(); transportConsole->setIconSize(QSize(transportconsolesize, transportconsolesize)); transportConsole->resize(transportConsole->sizeHint()); } void Interface::import_audio() { if (!currentSheetWidget->get_sheet()->get_numtracks()) { return; } QStringList files = QFileDialog::getOpenFileNames(this, tr("Open Audio Files"), config().get_property("Project", "directory", "/directory/unknown").toString(), tr("Audio files (*.wav *.flac *.ogg *.mp3 *.wv *.w64)")); QList tracks = currentSheetWidget->get_sheet()->get_tracks(); Track* track = tracks.first(); bool markers = false; ImportClipsDialog *importClips = new ImportClipsDialog(this); importClips->set_tracks(tracks); if (importClips->exec() == QDialog::Accepted) { if (!importClips->has_tracks()) { delete importClips; return; } track = importClips->get_selected_track(); markers = importClips->get_add_markers(); } // append the clips to the selected track TimeRef position = TimeRef(); if (!track->get_cliplist().isEmpty()) { position = (track->get_cliplist().last())->get_track_end_location(); } TimeLine* tl = currentSheetWidget->get_sheet()->get_timeline(); int n = tl->get_markers().size() + 1; if (tl->has_end_marker()) { n -= 1; } while(!files.isEmpty()) { QString file = files.takeFirst(); Import* import = new Import(file); import->set_track(track); import->set_position(position); QFileInfo fi(file); Marker* m = new Marker(tl, position); m->set_description(QString(tr("%1: %2")).arg(n).arg(fi.baseName())); if (import->create_readsource() != -1) { position += import->readsource()->get_length(); Command::process_command(import); Command::process_command(tl->add_marker(m, true)); } ++n; } if (tl->has_end_marker()) { Marker* m = tl->get_end_marker(); m->set_when(position); } else { Marker* m = new Marker(tl, position, Marker::ENDMARKER); Command::process_command(tl->add_marker(m, true)); } delete importClips; } DigitalClock::DigitalClock(QWidget *parent) : QLCDNumber(parent) { setSegmentStyle(Outline); setFrameStyle(QFrame::StyledPanel); QTimer *timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(showTime())); timer->start(1000); showTime(); setWindowTitle(tr("Digital Clock")); resize(150, 60); } void DigitalClock::showTime() { QTime time = QTime::currentTime(); QString text = time.toString("hh:mm"); if ((time.second() % 2) == 0) text[2] = ' '; display(text); } void Interface::show_settings_dialog() { if (!m_settingsdialog) { m_settingsdialog = new SettingsDialog(this); } m_settingsdialog->show(); } void Interface::show_settings_dialog_sound_system_page() { show_settings_dialog(); m_settingsdialog->show_page("Sound System"); } void Interface::closeEvent(QCloseEvent * event) { event->ignore(); pm().exit(); } Command* Interface::show_project_manager_dialog() { if (! m_projectManagerDialog) { m_projectManagerDialog = new ProjectManagerDialog(this); } m_projectManagerDialog->show(); return 0; } Command* Interface::show_open_project_dialog() { if (!m_openProjectDialog) { m_openProjectDialog = new OpenProjectDialog(this); } m_openProjectDialog->show(); return 0; } Command * Interface::show_newproject_dialog() { if (! m_newProjectDialog ) { m_newProjectDialog = new NewProjectDialog(this); AudioFileCopyConvert* m_converter = m_newProjectDialog->get_converter(); connect(m_converter, SIGNAL(taskStarted(QString)), m_progressBar, SLOT(set_label(QString))); connect(m_converter, SIGNAL(progress(int)), m_progressBar, SLOT(set_progress(int))); connect(m_newProjectDialog, SIGNAL(number_of_files(int)), m_progressBar, SLOT(set_num_files(int))); } m_newProjectDialog->show(); return 0; } Command * Interface::show_insertsilence_dialog() { if (! m_insertSilenceDialog) { m_insertSilenceDialog = new InsertSilenceDialog(this); } m_insertSilenceDialog->setTrack(0); m_insertSilenceDialog->focusInput(); m_insertSilenceDialog->show(); return 0; } Command * Interface::show_marker_dialog() { MarkerDialog* markerDialog = new MarkerDialog(this); markerDialog->exec(); delete markerDialog; return 0; } QSize Interface::sizeHint() const { return QSize(800, 600); } Command* Interface::show_newsheet_dialog() { if (! m_newSheetDialog) { m_newSheetDialog = new NewSheetDialog(this); } m_newSheetDialog->show(); return 0; } Command* Interface::show_newtrack_dialog() { if (! m_newTrackDialog) { m_newTrackDialog = new NewTrackDialog(this); } m_newTrackDialog->show(); return 0; } void Interface::open_help_browser() { info().information(tr("Opening User Manual in external browser!")); QDesktopServices::openUrl(QUrl("http://traverso-daw.org/UserManual")); } void Interface::project_dir_change_detected() { QMessageBox::critical(this, tr("Traverso - Important"), tr("A Project directory changed outside of Traverso. \n\n" "This is NOT supported! Please undo this change now!\n\n" "If you want to rename a Project, use the Project Manager instead!"), QMessageBox::Ok); } Command * Interface::show_restore_project_backup_dialog(QString projectname) { if (! m_restoreProjectBackupDialog) { m_restoreProjectBackupDialog = new RestoreProjectBackupDialog(this); } m_restoreProjectBackupDialog->set_project_name(projectname); m_restoreProjectBackupDialog->show(); return 0; } void Interface::show_restore_project_backup_dialog() { Project* project = pm().get_project(); if (! project ) { return; } show_restore_project_backup_dialog(project->get_title()); } void Interface::project_load_failed(QString project, QString reason) { QMessageBox::critical( this, tr("Traverso - Project load failed"), tr("The requested Project `%1` \ncould not be loaded for the following reason:\n\n'%2'" "\n\nYou will now be given a list of available backups (if any) \n" "to restore the Project from.").arg(project).arg(reason), QMessageBox::Ok); show_restore_project_backup_dialog(project); } void Interface::project_file_mismatch(QString rootdir, QString projectname) { ProjectConverterDialog dialog(this); dialog.set_project(rootdir, projectname); dialog.exec(); } void Interface::change_recording_format_to_wav() { config().set_property("Recording", "FileFormat", "wav"); save_config_and_emit_message(tr("Changed encoding for recording to %1").arg("WAVE")); config().save(); } void Interface::change_recording_format_to_wav64() { config().set_property("Recording", "FileFormat", "w64"); save_config_and_emit_message(tr("Changed encoding for recording to %1").arg("WAVE-64")); } void Interface::change_recording_format_to_wavpack() { config().set_property("Recording", "FileFormat", "wavpack"); save_config_and_emit_message(tr("Changed encoding for recording to %1").arg("WavPack")); } void Interface::change_resample_quality_to_best() { config().set_property("Conversion", "RTResamplingConverterType", 0); save_config_and_emit_message(tr("Changed resample quality to: %1").arg("Best")); } void Interface::change_resample_quality_to_high() { config().set_property("Conversion", "RTResamplingConverterType", 1); save_config_and_emit_message(tr("Changed resample quality to: %1").arg("High")); } void Interface::change_resample_quality_to_medium() { config().set_property("Conversion", "RTResamplingConverterType", 2); save_config_and_emit_message(tr("Changed resample quality to: %1").arg("Medium")); } void Interface::change_resample_quality_to_fast() { config().set_property("Conversion", "RTResamplingConverterType", 3); save_config_and_emit_message(tr("Changed resample quality to: %1").arg("Fast")); } void Interface::save_config_and_emit_message(const QString & message) { info().information(message); config().save(); } Command * Interface::start_transport() { Project* project = pm().get_project(); if (project) { Sheet* sheet = project->get_current_sheet(); if (sheet) { return sheet->start_transport(); } } return 0; } Command * Interface::set_recordable_and_start_transport() { if (m_project) { Sheet* sheet = m_project->get_current_sheet(); if (sheet) { return sheet->set_recordable_and_start_transport(); } } return 0; } // snapping is a global property and should be stored in each sheet void Interface::snap_state_changed(bool state) { if (m_project) { QList sheetlist = m_project->get_sheets(); foreach( Sheet* sheet, sheetlist) { sheet->set_snapping(state); } } } void Interface::update_snap_state() { if (m_project) { bool snapping = m_project->get_current_sheet()->is_snap_on(); m_snapAction->setChecked(snapping); } } // scrolling is a global property but should not be stored in the sheets void Interface::update_follow_state() { m_isFollowing = config().get_property("PlayHead", "Follow", true).toBool(); m_followAction->setChecked(m_isFollowing); } void Interface::update_temp_follow_state(bool state) { if (m_project->get_current_sheet()->is_transport_rolling() && m_isFollowing) { m_followAction->setChecked(state); } } void Interface::follow_state_changed(bool state) { Sheet* sheet = m_project->get_current_sheet(); if (!sheet) { return; } if (!sheet->is_transport_rolling() || !m_isFollowing) { m_isFollowing = state; config().set_property("PlayHead", "Follow", state); config().save(); if (sheet->is_transport_rolling()) { sheet->set_temp_follow_state(state); } } else { sheet->set_temp_follow_state(state); } } // the view mode is a sheet property and should be stored in the sheet void Interface::effect_state_changed(bool state) { Sheet* sheet = m_project->get_current_sheet(); if (state) { sheet->set_effects_mode(); } else { sheet->set_editing_mode(); } } void Interface::update_effects_state() { Sheet* sheet = m_project->get_current_sheet(); if (!sheet) { return; } if (sheet->get_mode() == Sheet::EDIT) { m_effectAction->setChecked(false); } else { m_effectAction->setChecked(true); } } void Interface::sheet_selector_update_sheets() { // empty the list, make sure everything is deleted while(!m_currentSheetActions.isEmpty()) { QAction *action = m_currentSheetActions.takeFirst(); delete action; } if (!m_project) { return; } if (!m_project->get_current_sheet()) { return; } qint64 id = m_project->get_current_sheet()->get_id(); QActionGroup* actiongroup = new QActionGroup(this); actiongroup->setExclusive(true); // create the new actions foreach(Sheet* sheet, m_project->get_sheets()) { QString string = QString::number(m_project->get_sheet_index(sheet->get_id())) + ": " + sheet->get_title(); QAction* action = m_sheetMenu->addAction(string); actiongroup->addAction(action); action->setData(sheet->get_id()); action->setCheckable(true); if (sheet->get_id() == id) { action->setChecked(true); } else { action->setChecked(false); } connect(action, SIGNAL(triggered()), this, SLOT(sheet_selected())); m_currentSheetActions.append(action); } } void Interface::sheet_selected() { // identify the action that was activated QAction *orig = qobject_cast(sender()); if (!orig) { return; } qint64 id = orig->data().toLongLong(); // uncheck all other actions foreach(QAction* action, m_currentSheetActions) { if (action->data().toLongLong() != id) { action->setChecked(false); } } m_project->set_current_sheet(id); } void Interface::sheet_selector_sheet_added(Sheet* sheet) { connect(sheet, SIGNAL(propertyChanged()), this, SLOT(sheet_selector_update_sheets())); sheet_selector_update_sheets(); } void Interface::sheet_selector_sheet_removed(Sheet* sheet) { disconnect(sheet, SIGNAL(propertyChanged()), this, SLOT(sheet_selector_update_sheets())); sheet_selector_update_sheets(); } traverso-0.49.4/src/traverso/traverso.rc000644 001750 001750 00000000130 11163362147 020604 0ustar00remonremon000000 000000 IDI_ICON1 ICON DISCARDABLE "../../resources/images/traverso.ico" traverso-0.49.4/src/traverso/dialogs/000755 001750 001750 00000000000 12357216457 020051 5ustar00remonremon000000 000000 traverso-0.49.4/src/traverso/dialogs/project/000755 001750 001750 00000000000 11163362200 021475 5ustar00remonremon000000 000000 traverso-0.49.4/src/traverso/dialogs/project/OpenProjectDialog.h000644 001750 001750 00000002450 11163362147 025231 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef OPEN_PROJECT_DIALOG_H #define OPEN_PROJECT_DIALOG_H #include "ui_OpenProjectDialog.h" #include class OpenProjectDialog : public QDialog, protected Ui::OpenProjectDialog { Q_OBJECT public: OpenProjectDialog(QWidget* parent = 0); ~OpenProjectDialog(); private slots: void update_projects_list(); void on_loadProjectButton_clicked(); void on_deleteProjectbutton_clicked(); void on_projectDirSelectButton_clicked(); void projectitem_clicked( QTreeWidgetItem* , int ); }; #endif //eof traverso-0.49.4/src/traverso/dialogs/project/ProjectManagerDialog.cpp000644 001750 001750 00000032741 11163362147 026243 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "ProjectManagerDialog.h" #include "libtraversocore.h" #include #include #include #include #include #include #include #include #include // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" ProjectManagerDialog::ProjectManagerDialog( QWidget * parent ) : QDialog(parent) { setupUi(this); treeSheetWidget->setColumnCount(3); treeSheetWidget->header()->resizeSection(0, 160); treeSheetWidget->header()->resizeSection(1, 55); treeSheetWidget->header()->resizeSection(2, 70); QStringList stringList; stringList << "Sheet Name" << "Tracks" << "Length"; treeSheetWidget->setHeaderLabels(stringList); set_project(pm().get_project()); undoButton->setIcon(QIcon(find_pixmap(":/undo"))); redoButton->setIcon(QIcon(find_pixmap(":/redo"))); buttonBox->button(QDialogButtonBox::Ok)->setDefault(true); connect(treeSheetWidget, SIGNAL(itemClicked(QTreeWidgetItem*,int)), this, SLOT(sheetitem_clicked(QTreeWidgetItem*,int))); connect(&pm(), SIGNAL(projectLoaded(Project*)), this, SLOT(set_project(Project*))); } ProjectManagerDialog::~ProjectManagerDialog() {} void ProjectManagerDialog::set_project(Project* project) { m_project = project; if (m_project) { connect(m_project, SIGNAL(sheetAdded(Sheet*)), this, SLOT(update_sheet_list())); connect(m_project, SIGNAL(sheetRemoved(Sheet*)), this, SLOT(update_sheet_list())); connect(m_project->get_history_stack(), SIGNAL(redoTextChanged ( const QString &)), this, SLOT(redo_text_changed(const QString&))); connect(m_project->get_history_stack(), SIGNAL(undoTextChanged ( const QString &)), this, SLOT(undo_text_changed(const QString&))); setWindowTitle("Manage Project - " + m_project->get_title()); descriptionTextEdit->setText(m_project->get_description()); lineEditTitle->setText(m_project->get_title()); lineEditId->setText(m_project->get_discid()); lineEditUPC->setText(m_project->get_upc_ean()); lineEditPerformer->setText(m_project->get_performer()); lineEditArranger->setText(m_project->get_arranger()); lineEditSongwriter->setText(m_project->get_songwriter()); lineEditMessage->setText(m_project->get_message()); comboBoxGenre->setCurrentIndex(m_project->get_genre()); redoButton->setText(m_project->get_history_stack()->redoText()); undoButton->setText(m_project->get_history_stack()->undoText()); } else { setWindowTitle("Manage Project - No Project loaded!"); treeSheetWidget->clear(); descriptionTextEdit->clear(); lineEditTitle->clear(); lineEditId->clear(); lineEditUPC->clear(); lineEditPerformer->clear(); lineEditArranger->clear(); lineEditSongwriter->clear(); lineEditMessage->clear(); comboBoxGenre->setCurrentIndex(0); } update_sheet_list(); } void ProjectManagerDialog::update_sheet_list( ) { if ( ! m_project) { printf("ProjectManagerDialog:: no project ?\n"); return; } treeSheetWidget->clear(); foreach(Sheet* sheet, m_project->get_sheets()) { QString sheetNr = QString::number(m_project->get_sheet_index(sheet->get_id())); QString sheetName = "Sheet " + sheetNr + " - " + sheet->get_title(); QString numberOfTracks = QString::number(sheet->get_numtracks()); QString sheetLength = timeref_to_ms_2(sheet->get_last_location()); QString sheetStatus = sheet->is_changed()?"UnSaved":"Saved"; QString sheetSpaceAllocated = "Unknown"; QTreeWidgetItem* item = new QTreeWidgetItem(treeSheetWidget); item->setTextAlignment(1, Qt::AlignHCenter); item->setTextAlignment(2, Qt::AlignHCenter); item->setText(0, sheetName); item->setText(1, numberOfTracks); item->setText(2, sheetLength); item->setData(0, Qt::UserRole, sheet->get_id()); } } void ProjectManagerDialog::sheetitem_clicked( QTreeWidgetItem* item, int) { if (!item) { return; } Sheet* sheet; qint64 id = item->data(0, Qt::UserRole).toLongLong(); sheet = m_project->get_sheet(id); Q_ASSERT(sheet); selectedSheetName->setText(sheet->get_title()); m_project->set_current_sheet(sheet->get_id()); } void ProjectManagerDialog::on_renameSheetButton_clicked( ) { if( ! m_project) { return; } QTreeWidgetItem* item = treeSheetWidget->currentItem(); if ( ! item) { return; } qint64 id = item->data(0, Qt::UserRole).toLongLong(); Sheet* sheet = m_project->get_sheet(id); Q_ASSERT(sheet); QString newtitle = selectedSheetName->text(); if (newtitle.isEmpty()) { info().information(tr("No new Sheet name was supplied!")); return; } sheet->set_title(newtitle); update_sheet_list(); } void ProjectManagerDialog::on_deleteSheetButton_clicked( ) { QTreeWidgetItem* item = treeSheetWidget->currentItem(); if ( ! item ) { return; } qint64 id = item->data(0, Qt::UserRole).toLongLong(); Command::process_command(m_project->remove_sheet(m_project->get_sheet(id))); } void ProjectManagerDialog::on_createSheetButton_clicked( ) { Interface::instance()->show_newsheet_dialog(); } void ProjectManagerDialog::redo_text_changed(const QString & text) { redoButton->setText(text); } void ProjectManagerDialog::undo_text_changed(const QString & text) { undoButton->setText(text); } void ProjectManagerDialog::on_undoButton_clicked() { if (! m_project ) { return; } m_project->get_history_stack()->undo(); } void ProjectManagerDialog::on_redoButton_clicked() { if (! m_project ) { return; } m_project->get_history_stack()->redo(); } void ProjectManagerDialog::on_sheetsExportButton_clicked() { Interface::instance()->show_export_widget(); } void ProjectManagerDialog::on_exportTemplateButton_clicked() { bool ok; QString text = QInputDialog::getText(this, tr("Save Template"), tr("Enter Template name"), QLineEdit::Normal, "", &ok); if (! ok || text.isEmpty()) { return; } QString fileName = QDir::homePath() + "/.traverso/ProjectTemplates/"; QDir dir; if (! dir.exists(fileName)) { if (! dir.mkdir(fileName)) { info().critical( tr("Unable to create directory %1!").arg(fileName)); return; } } fileName.append(text + ".tpt"); QDomDocument doc(text); if (QFile::exists(fileName)) { QMessageBox::StandardButton button = QMessageBox::question(this, tr("Traverso - Information"), tr("Template with name %1 already exists!\n Do you want to overwrite it?").arg(fileName), QMessageBox::Yes | QMessageBox::No, QMessageBox::No); if (button == QMessageBox::No) { return; } } QFile file(fileName); if (file.open( QIODevice::WriteOnly ) ) { m_project->get_state(doc, true); QTextStream stream(&file); doc.save(stream, 4); file.close(); info().information(tr("Saved Project Template: %1").arg(text)); } else { info().critical( tr("Couldn't open file %1 for writing!").arg(fileName)); } } void ProjectManagerDialog::accept() { if ( ! m_project ) { hide(); return; } QString newtitle = lineEditTitle->text(); if (newtitle != m_project->get_title()) { if (pm().project_exists(newtitle)) { QMessageBox::warning( 0, tr("Traverso - Information"), tr("Project with title '%1' allready exists, please supply a different title!").arg(newtitle), QMessageBox::Ok); return rejected(); } } m_project->set_title(newtitle); m_project->set_description(descriptionTextEdit->toPlainText()); m_project->set_discid(lineEditId->text()); m_project->set_upc_ean(lineEditUPC->text()); m_project->set_performer(lineEditPerformer->text()); m_project->set_arranger(lineEditArranger->text()); m_project->set_songwriter(lineEditSongwriter->text()); m_project->set_message(lineEditMessage->text()); m_project->set_genre(comboBoxGenre->currentIndex()); hide(); } void ProjectManagerDialog::reject() { if ( ! m_project ) { hide(); return; } descriptionTextEdit->setText(m_project->get_description()); lineEditTitle->setText(m_project->get_title()); lineEditId->setText(m_project->get_discid()); lineEditUPC->setText(m_project->get_upc_ean()); lineEditPerformer->setText(m_project->get_performer()); lineEditArranger->setText(m_project->get_arranger()); lineEditSongwriter->setText(m_project->get_songwriter()); lineEditMessage->setText(m_project->get_message()); comboBoxGenre->setCurrentIndex(m_project->get_genre()); hide(); } /* ---------------------------------------------------------------------------------------------- */ /* Here is some stuff about CD-Text. It is difficult to find in the web, so let's archive it here */ /* ---------------------------------------------------------------------------------------------- */ /* @(#)cdtext.h 1.1 02/02/23 Copyright 1999-2002 J. Schilling */ /* * Generic CD-Text support definitions * * Copyright (c) 1999-2002 J. Schilling */ /* * 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, or (at your option) * any later version. ... #define tc_title textcodes[0x00] #define tc_performer textcodes[0x01] #define tc_sheetwriter textcodes[0x02] #define tc_composer textcodes[0x03] #define tc_arranger textcodes[0x04] #define tc_message textcodes[0x05] #define tc_diskid textcodes[0x06] #define tc_genre textcodes[0x07] #define tc_toc textcodes[0x08] #define tc_toc2 textcodes[0x09] #define tc_closed_info textcodes[0x0d] #define tc_isrc textcodes[0x0e] */ /* * binaere Felder sind * Disc ID (Wirklich ???) * Genre ID * TOC * Second TOC * Size information */ /* * Genre codes from Enhanced CD Specification page 21 */ // #define GENRE_UNUSED 0 /* not used */ // #define GENRE_UNDEFINED 1 /* not defined */ // #define GENRE_ADULT_CONTEMP 2 /* Adult Contemporary */ // #define GENRE_ALT_ROCK 3 /* Alternative Rock */ // #define GENRE_CHILDRENS 4 /* Childrens Music */ // #define GENRE_CLASSIC 5 /* Classical */ // #define GENRE_CHRIST_CONTEMP 6 /* Contemporary Christian */ // #define GENRE_COUNTRY 7 /* Country */ // #define GENRE_DANCE 8 /* Dance */ // #define GENRE_EASY_LISTENING 9 /* Easy Listening */ // #define GENRE_EROTIC 10 /* Erotic */ // #define GENRE_FOLK 11 /* Folk */ // #define GENRE_GOSPEL 12 /* Gospel */ // #define GENRE_HIPHOP 13 /* Hip Hop */ // #define GENRE_JAZZ 14 /* Jazz */ // #define GENRE_LATIN 15 /* Latin */ // #define GENRE_MUSICAL 16 /* Musical */ // #define GENRE_NEWAGE 17 /* New Age */ // #define GENRE_OPERA 18 /* Opera */ // #define GENRE_OPERETTA 19 /* Operetta */ // #define GENRE_POP 20 /* Pop Music */ // #define GENRE_RAP 21 /* RAP */ // #define GENRE_REGGAE 22 /* Reggae */ // #define GENRE_ROCK 23 /* Rock Music */ // #define GENRE_RYTHMANDBLUES 24 /* Rhythm & Blues */ // #define GENRE_SOUNDEFFECTS 25 /* Sound Effects */ // #define GENRE_SPOKEN_WORD 26 /* Spoken Word */ // #define GENRE_WORLD_MUSIC 28 /* World Music */ // #define GENRE_RESERVED 29 /* Reserved is 29..32767 */ // #define GENRE_RIAA 32768 /* Registration by RIAA 32768..65535 */ /* * Character codings used in CD-Text data. * Korean and Mandarin Chinese to be defined in sept 1996 */ // #define CC_8859_1 0x00 /* ISO 8859-1 */ // #define CC_ASCII 0x01 /* ISO 646, ASCII (7 bit) */ // #define CC_RESERVED_02 0x02 /* Reserved codes 0x02..0x7f */ // #define CC_KANJI 0x80 /* Music Shift-JIS Kanji */ // #define CC_KOREAN 0x81 /* Korean */ // #define CC_CHINESE 0x82 /* Mandarin Chinese */ // #define CC_RESERVED_83 0x83 /* Reserved codes 0x83..0xFF */ /* * Language codes (currently guessed) */ // #define LANG_ENGLISH 9 //eof traverso-0.49.4/src/traverso/dialogs/project/NewSheetDialog.h000644 001750 001750 00000002325 11163362147 024524 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef NEW_SONG_DIALOG_H #define NEW_SONG_DIALOG_H #include "ui_NewSheetDialog.h" #include class Project; class NewSheetDialog : public QDialog, protected Ui::NewSheetDialog { Q_OBJECT public: NewSheetDialog(QWidget* parent = 0); ~NewSheetDialog() {}; private: Project* m_project; private slots: void accept(); void reject(); void set_project(Project* project); void update_template_combo(); void use_template_checkbox_state_changed(int state); }; #endif traverso-0.49.4/src/traverso/dialogs/project/OpenProjectDialog.cpp000644 001750 001750 00000020522 11163362147 025564 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "OpenProjectDialog.h" #include "ui_OpenProjectDialog.h" #include #include #include #include #include #include #include #include #include #include #include #include // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" OpenProjectDialog::OpenProjectDialog( QWidget * parent ) : QDialog(parent) { setupUi(this); projectListView->setColumnCount(2); update_projects_list(); QStringList stringList; stringList << "Project Name" << "Sheets"; projectListView->setHeaderLabels(stringList); projectListView->header()->resizeSection(0, 160); projectListView->header()->resizeSection(1, 30); connect(&pm(), SIGNAL(currentProjectDirChanged()), this, SLOT(update_projects_list())); connect(&pm(), SIGNAL(projectDirChangeDetected()), this, SLOT(update_projects_list())); connect(projectListView, SIGNAL(itemClicked(QTreeWidgetItem*,int)), this, SLOT(projectitem_clicked(QTreeWidgetItem*,int))); } OpenProjectDialog::~ OpenProjectDialog( ) {} void OpenProjectDialog::update_projects_list() { projectListView->clear(); QString path = config().get_property("Project", "directory", "none").toString(); QDir dir(path); QStringList list = dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot); foreach(const QString &dirname, list) { /************ FROM HERE ****************/ QDomDocument doc("Project"); QString fileToOpen = path + "/" + dirname + "/project.tpf"; QFile file(fileToOpen); if (!file.open(QIODevice::ReadOnly)) { PWARN("OpenProjectDialog:: Cannot open project properties file (%s)", fileToOpen.toAscii().data()); continue; } QString errorMsg; if (!doc.setContent(&file, &errorMsg)) { file.close(); PWARN("OpenProjectDialog:: Cannot set content of XML file (%s)", errorMsg.toAscii().data()); continue; } file.close(); QDomElement docElem = doc.documentElement(); QDomNode propertiesNode = docElem.firstChildElement("Properties"); QDomElement e = propertiesNode.toElement(); QString title = e.attribute( "title", "" ); QString description = e.attribute("description", "No description set"); qint64 id = e.attribute( "id", "" ).toLongLong(); QDomNode sheetsNode = docElem.firstChildElement("Sheets"); QDomNode sheetNode = sheetsNode.firstChild(); int sheetCounter = 0; // count to get Sheets number.... while(!sheetNode.isNull()) { sheetCounter++; sheetNode = sheetNode.nextSibling(); } QString sNumSheets = QString::number(sheetCounter); /*********** TO HERE THIS CODE IS DUPLICATE FROM THAT IN PROJECT.CC :-( Don't know if this is avoidable at all *********/ QTreeWidgetItem* item = new QTreeWidgetItem(projectListView); item->setTextAlignment(0, Qt::AlignLeft); item->setTextAlignment(1, Qt::AlignHCenter); if (title != dirname) { // Let the ProjectManager know that this path is a correct one // so it doesn't start whining when the directory is changed back // to the proper name! pm().add_valid_project_path(path + "/" + title); pm().remove_wrong_project_path(path + "/" + dirname); item->setIcon(0, style()->standardIcon(QStyle::SP_MessageBoxWarning)); QString html; html += tr("

Project directory name %1 is different from the Project title %2!

" "

Did you rename the Project directory ?

Please rename the directory back to the " "Project title %1, and change the Project title with the Project Manager Dialog!

") .arg(dirname).arg(title); item->setToolTip(0, html); } else { QString html = "Project: " + title + "

"; html += tr("Description:") + "
"; html += description + "

"; html += tr("Created on:") + " " + extract_date_time(id).toString() + "
"; html += ""; item->setToolTip(0, html); } item->setText(0, title); item->setText(1, sNumSheets); } } void OpenProjectDialog::projectitem_clicked( QTreeWidgetItem* item, int) { if (item) { selectedProjectName->setText(item->text(0)); } } void OpenProjectDialog::on_loadProjectButton_clicked( ) { // do we have the name of the project to load ? QString title; if (projectListView->currentItem()) { title = projectListView->currentItem()->text(0); } if (title.isEmpty()) { info().warning(tr("No Project selected!") ); info().information(tr("Select a project and click the 'Load' button again") ); return; } Project* project = pm().get_project(); if (project && (project->get_title() == title)) { QMessageBox::StandardButton button = QMessageBox::question(this, "Traverso - Question", "Are you sure you want to reopen the current project ?", QMessageBox::Ok | QMessageBox::Cancel, QMessageBox::Cancel ); if (button == QMessageBox::Cancel) { return; } } // first test if project exists // Note: this shouldn't be needed really, the projects in the view // should exist, but just in case someone removed it, you never know! if (!pm().project_exists(title)) { info().warning(tr("Project %1 does not exist, did you rename or remove the directory what that name ?").arg(title)); return; } if (pm().load_project(title)<0) { PERROR("Could not load project %s", title.toAscii().data()); } hide(); } void OpenProjectDialog::on_deleteProjectbutton_clicked( ) { // do we have the name of the project to delete ? QString title = selectedProjectName->text(); if (title.isEmpty()) { info().information(tr("You must supply a name for the project!") ); return; } // first test if project exists if (!pm().project_exists(title)) { info().warning(tr("Project does not exist! (%1)").arg(title)); return; } switch (QMessageBox::information(this, tr("Traverso - Question"), tr("Are you sure that you want to remove the project %1 ? It's not possible to undo it !").arg(title).toAscii().data(), "Yes", "No", QString::null, 1, -1)) { case 0: pm().remove_project(title); update_projects_list(); break; default: return; break; } return; } void OpenProjectDialog::on_projectDirSelectButton_clicked( ) { QString path = config().get_property("Project", "directory", "").toString(); if (path.isEmpty()) { path = QDir::homePath(); } QDir rootDir(path); rootDir.cdUp(); QString newPath = QFileDialog::getExistingDirectory(this, tr("Choose an existing or create a new Project Directory"), rootDir.canonicalPath()); if (newPath.isEmpty() || newPath.isNull()) { return; } QDir dir; QFileInfo fi(newPath); if (dir.exists(newPath) && !fi.isWritable()) { QMessageBox::warning( 0, tr("Traverso - Warning"), tr("This directory is not writable by you! \n") + tr("Please check permission for this directory or " "choose another one:\n\n %1").arg(newPath) ); return; } if (dir.exists(newPath)) { // QMessageBox::information( interface, tr("Traverso - Information"), tr("Using existing Project directory: %1\n").arg(newPath), "OK", 0 ); } else if (!dir.mkpath(newPath)) { QMessageBox::warning( this, tr("Traverso - Warning"), tr("Unable to create Project directory! \n") + tr("Please check permission for this directory: %1").arg(newPath) ); return; } else { QMessageBox::information( this, tr("Traverso - Information"), tr("Created new Project directory for you here: %1\n").arg(newPath), "OK", 0 ); } pm().set_current_project_dir(newPath); } //eof traverso-0.49.4/src/traverso/dialogs/project/NewProjectDialog.cpp000644 001750 001750 00000024266 11163362147 025425 0ustar00remonremon000000 000000 /* Copyright (C) 2007-2008 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "NewProjectDialog.h" #include "ui_NewProjectDialog.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "Export.h" #include "Information.h" #include "ProjectManager.h" #include "ResourcesManager.h" #include #include #include #include #include #include "Import.h" #include "AudioFileCopyConvert.h" #include "ReadSource.h" #include "widgets/ExportFormatOptionsWidget.h" // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" NewProjectDialog::NewProjectDialog( QWidget * parent ) : QDialog(parent) { setupUi(this); trackCountSpinBox->setValue(config().get_property("Sheet", "trackCreationCount", 4).toInt()); use_template_checkbox_state_changed(Qt::Unchecked); update_template_combobox(); buttonAdd->setIcon(QIcon(":/add")); buttonRemove->setIcon(QIcon(":/remove")); buttonUp->setIcon(QIcon(":/up")); buttonDown->setIcon(QIcon(":/down")); buttonRemove->setEnabled(false); buttonUp->setEnabled(false); buttonDown->setEnabled(false); buttonBox->button(QDialogButtonBox::Ok)->setDefault(true); m_converter = new AudioFileCopyConvert(); m_exportSpec = new ExportSpecification; m_buttonGroup = new QButtonGroup(this); m_buttonGroup->addButton(radioButtonImport, 0); m_buttonGroup->addButton(radioButtonEmpty, 1); connect(useTemplateCheckBox, SIGNAL(stateChanged (int)), this, SLOT(use_template_checkbox_state_changed(int))); connect(buttonAdd, SIGNAL(clicked()), this, SLOT(add_files())); connect(buttonRemove, SIGNAL(clicked()), this, SLOT(remove_files())); connect(buttonUp, SIGNAL(clicked()), this, SLOT(move_up())); connect(buttonDown, SIGNAL(clicked()), this, SLOT(move_down())); connect(m_converter, SIGNAL(taskFinished(QString, int, QString)), this, SLOT(load_file(QString, int, QString))); connect(m_buttonGroup, SIGNAL(buttonClicked(int)), stackedWidget, SLOT(setCurrentIndex(int))); } NewProjectDialog::~ NewProjectDialog( ) {} void NewProjectDialog::accept( ) { // do we have the name of the project to create ? QString title = newProjectName->text(); if (title.length() == 0) { info().information(tr("You must supply a name for the project!") ); return; } // first test if project exists already if (pm().project_exists(title)) { switch (QMessageBox::information(this, tr("Traverso - Question"), tr("The Project \"%1\" already exists, do you want to remove it and replace it with a new one ?").arg(title), tr("Yes"), tr("No"), QString::null, 1, -1)) { case 0: pm().remove_project(title); break; default: return; break; } } Project* project; int numSheets = sheetCountSpinBox->value(); int numTracks = trackCountSpinBox->value(); int index = templateComboBox->currentIndex(); bool usetemplate = false; if (useTemplateCheckBox->isChecked() && index >= 0) { usetemplate = true; } // check which method to use. If there are items in the treeWidgetFiles, ignore // settings in the "empty project" tab. Else use settings from "empty project" tab. int items = treeWidgetFiles->topLevelItemCount(); bool loadFiles = false; if (items > 0) { //there are items in the treeWidgetFiles loadFiles = true; numSheets = 1; numTracks = items; project = pm().create_new_project(numSheets, numTracks, title); } else { //no items in the treeWidgetFiles if (usetemplate) { project = pm().create_new_project(QDir::homePath() + "/.traverso/ProjectTemplates/" + templateComboBox->itemText(index) + ".tpt", title); } else { project = pm().create_new_project(numSheets, numTracks, title); } } if (! project) { info().warning(tr("Couldn't create project (%1)").arg(title) ); return; } project->set_description(descriptionTextEdit->toPlainText()); project->set_engineer(newProjectEngineer->text()); project->save(); delete project; pm().load_project(title); if (loadFiles) { if (checkBoxCopy->isChecked()) { copy_files(); } else { load_all_files(); } } hide(); } void NewProjectDialog::use_template_checkbox_state_changed(int state) { if (state == Qt::Checked) { templateComboBox->setEnabled(true); trackCountSpinBox->setEnabled(false); } else { templateComboBox->setEnabled(false); trackCountSpinBox->setEnabled(true); } } void NewProjectDialog::update_template_combobox() { QDir templatedir(QDir::homePath() + "/.traverso/ProjectTemplates"); foreach (QString filename, templatedir.entryList(QDir::Files | QDir::NoDotAndDotDot)) { templateComboBox->insertItem(0, filename.remove(".tpt")); } } void NewProjectDialog::add_files() { QStringList list = QFileDialog::getOpenFileNames(this, tr("Open Audio Files"), config().get_property("Project", "directory", "/directory/unknown").toString(), tr("Audio files (*.wav *.flac *.ogg *.mp3 *.wv *.w64)")); for(int i = 0; i < list.size(); ++i) { QStringList labels; QFileInfo finfo(list.at(i)); labels << "Unnamed" << finfo.fileName(); QTreeWidgetItem* item = new QTreeWidgetItem(treeWidgetFiles, labels, 0); item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsEnabled); item->setData(0, Qt::ToolTipRole, finfo.absoluteFilePath()); treeWidgetFiles->addTopLevelItem(item); } if (treeWidgetFiles->topLevelItemCount()) { buttonRemove->setEnabled(true); buttonUp->setEnabled(true); buttonDown->setEnabled(true); } } void NewProjectDialog::remove_files() { QList selection = treeWidgetFiles->selectedItems(); if (selection.isEmpty()) { return; } while (!selection.isEmpty()) { QTreeWidgetItem *it = selection.takeLast(); delete it; } if (!treeWidgetFiles->topLevelItemCount()) { buttonRemove->setEnabled(false); buttonUp->setEnabled(false); buttonDown->setEnabled(false); } } void NewProjectDialog::copy_files() { emit number_of_files(treeWidgetFiles->topLevelItemCount()); QList list; QStringList trackNameList; while(treeWidgetFiles->topLevelItemCount()) { QTreeWidgetItem* item = treeWidgetFiles->takeTopLevelItem(0); list.append(QFileInfo(item->data(0, Qt::ToolTipRole).toString())); trackNameList.append(item->text(0)); delete item; } QString destination = pm().get_project()->get_root_dir() + "/audiosources/"; // copy to project dir for (int n = 0; n < list.size(); ++n) { QString fn = destination + list.at(n).fileName(); // TODO: check for free disk space // TODO: offer file format conversion while copying: format options widget not there yet. // m_formatOptionsWidget->get_format_options(m_exportSpec); ReadSource* readsource = resources_manager()->import_source(list.at(n).absolutePath() + "/", list.at(n).fileName()); if (readsource) { m_converter->enqueue_task(readsource, m_exportSpec, destination, list.at(n).fileName(), n, trackNameList.at(n)); } } } void NewProjectDialog::load_all_files() { int i = 0; while(treeWidgetFiles->topLevelItemCount()) { QTreeWidgetItem* item = treeWidgetFiles->takeTopLevelItem(0); QString f = item->data(0, Qt::ToolTipRole).toString(); QString n = item->text(0); delete item; load_file(f, i, n); ++i; } } void NewProjectDialog::load_file(QString name, int i, QString trackname) { Sheet* sheet = pm().get_project()->get_current_sheet(); if (!sheet) { return; } if (i >= sheet->get_numtracks()) { return; } Track* track = sheet->get_track_for_index(i); Import* import = new Import(name); track->set_name(trackname); import->set_track(track); import->set_position((TimeRef)0.0); if (import->create_readsource() != -1) { Command::process_command(import); } } void NewProjectDialog::move_up() { QList selection = treeWidgetFiles->selectedItems(); if (selection.isEmpty()) { return; } qSort(selection); int firstIndex = treeWidgetFiles->topLevelItemCount(); QList indexList; foreach(QTreeWidgetItem *it, selection) { int idx = treeWidgetFiles->indexOfTopLevelItem(it); firstIndex = qMin(idx, firstIndex); } firstIndex = firstIndex > 0 ? firstIndex - 1 : firstIndex; QList tempList; while (selection.size()) { QTreeWidgetItem *it = treeWidgetFiles->takeTopLevelItem(treeWidgetFiles->indexOfTopLevelItem(selection.takeFirst())); treeWidgetFiles->insertTopLevelItem(firstIndex, it); it->setSelected(true); ++firstIndex; } } void NewProjectDialog::move_down() { QList selection = treeWidgetFiles->selectedItems(); if (selection.isEmpty()) { return; } qSort(selection); int firstIndex = 0; QList indexList; foreach(QTreeWidgetItem *it, selection) { int idx = treeWidgetFiles->indexOfTopLevelItem(it); firstIndex = qMax(idx, firstIndex); } firstIndex = firstIndex < treeWidgetFiles->topLevelItemCount() - 1 ? firstIndex + 1 : firstIndex; while (selection.size()) { int idx = treeWidgetFiles->indexOfTopLevelItem(selection.takeFirst()); QTreeWidgetItem *it = treeWidgetFiles->takeTopLevelItem(idx); treeWidgetFiles->insertTopLevelItem(firstIndex, it); it->setSelected(true); } } AudioFileCopyConvert* NewProjectDialog::get_converter() { return m_converter; } //eof traverso-0.49.4/src/traverso/dialogs/project/ImportClipsDialog.h000644 001750 001750 00000002401 11163362147 025242 0ustar00remonremon000000 000000 /* Copyright (C) 2008 Nicola Doebelin This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef IMPORT_CLIPS_DIALOG_H #define IMPORT_CLIPS_DIALOG_H #include "ui_ImportClipsDialog.h" #include "Track.h" #include #include class ImportClipsDialog : public QDialog, protected Ui::ImportClipsDialog { Q_OBJECT public: ImportClipsDialog(QWidget* parent = 0); ~ImportClipsDialog(); void set_tracks(QList); Track* get_selected_track(); bool get_add_markers(); int has_tracks(); private: QList m_tracks; }; #endif //eof traverso-0.49.4/src/traverso/dialogs/project/ImportClipsDialog.cpp000644 001750 001750 00000003334 11163362147 025603 0ustar00remonremon000000 000000 /* Copyright (C) 2008 Nicola Doebelin This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "ImportClipsDialog.h" #include "ui_ImportClipsDialog.h" #include #include // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" ImportClipsDialog::ImportClipsDialog( QWidget * parent ) : QDialog(parent) { setupUi(this); } ImportClipsDialog::~ ImportClipsDialog( ) {} void ImportClipsDialog::set_tracks(QList tracks) { m_tracks = tracks; for (int i = 0; i < m_tracks.size(); ++i) { Track* t = m_tracks.at(i); comboBoxTrack->addItem(QString("%1: %2").arg(t->get_sort_index()).arg(t->get_name())); } } Track* ImportClipsDialog::get_selected_track() { if (m_tracks.isEmpty()) { return (Track*)0; } return m_tracks.at(comboBoxTrack->currentIndex()); } bool ImportClipsDialog::get_add_markers() { return checkBoxMarkers->isChecked(); } int ImportClipsDialog::has_tracks() { return comboBoxTrack->count(); } //eof traverso-0.49.4/src/traverso/dialogs/project/NewSheetDialog.cpp000644 001750 001750 00000007240 11163362147 025060 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "NewSheetDialog.h" #include #include #include NewSheetDialog::NewSheetDialog(QWidget * parent) : QDialog(parent) { setupUi(this); trackCountSpinBox->setValue(config().get_property("Sheet", "trackCreationCount", 4).toInt()); set_project(pm().get_project()); use_template_checkbox_state_changed(Qt::Unchecked); buttonBox->button(QDialogButtonBox::Ok)->setDefault(true); connect(&pm(), SIGNAL(projectLoaded(Project*)), this, SLOT(set_project(Project*))); connect(useTemplateCheckBox, SIGNAL(stateChanged (int)), this, SLOT(use_template_checkbox_state_changed(int))); } void NewSheetDialog::accept() { if (! m_project) { info().information(tr("I can't create a new Sheet if there is no Project loaded!!")); return; } int count = countSpinBox->value(); int trackcount = trackCountSpinBox->value(); QString title = titleLineEdit->text(); if (title.isEmpty()) { title = "Untitled"; } int index = templateComboBox->currentIndex(); bool usetemplate = false; QDomNode node; if (useTemplateCheckBox->isChecked() && index >= 0) { usetemplate = true; Sheet* templatesheet = m_project->get_sheet(templateComboBox->itemData(index).toLongLong()); Q_ASSERT(templatesheet); QDomDocument doc("Sheet"); node = templatesheet->get_state(doc, usetemplate); } CommandGroup* group = new CommandGroup(m_project, ""); Sheet* firstNewSheet = 0; for (int i=0; iset_state(node); } else { sheet = new Sheet(m_project, trackcount); } sheet->set_title(title); group->add_command(m_project->add_sheet(sheet)); if (i == 0) { firstNewSheet = sheet; } } group->setText(tr("Added %n Sheet(s)", "", count)); Command::process_command(group); if (firstNewSheet) { m_project->set_current_sheet(firstNewSheet->get_id()); } hide(); } void NewSheetDialog::set_project(Project * project) { m_project = project; if (! m_project) { templateComboBox->clear(); return; } connect(m_project, SIGNAL(sheetAdded(Sheet*)), this, SLOT(update_template_combo())); connect(m_project, SIGNAL(sheetRemoved(Sheet*)), this, SLOT(update_template_combo())); update_template_combo(); } void NewSheetDialog::reject() { hide(); } void NewSheetDialog::update_template_combo() { templateComboBox->clear(); foreach(Sheet* sheet, m_project->get_sheets()) { QString text = "Sheet " + QString::number(m_project->get_sheet_index(sheet->get_id())) + " " + sheet->get_title(); templateComboBox->addItem(text, sheet->get_id()); connect(sheet, SIGNAL(propertyChanged()), this, SLOT(update_template_combo())); } } void NewSheetDialog::use_template_checkbox_state_changed(int state) { if (state == Qt::Checked) { templateComboBox->setEnabled(true); trackCountSpinBox->setEnabled(false); } else { templateComboBox->setEnabled(false); trackCountSpinBox->setEnabled(true); } } traverso-0.49.4/src/traverso/dialogs/project/NewTrackDialog.cpp000644 001750 001750 00000003642 11163362147 025056 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "NewTrackDialog.h" #include #include #include NewTrackDialog::NewTrackDialog(QWidget * parent) : QDialog(parent) { setupUi(this); set_project(pm().get_project()); buttonBox->button(QDialogButtonBox::Ok)->setDefault(true); connect(&pm(), SIGNAL(projectLoaded(Project*)), this, SLOT(set_project(Project*))); } void NewTrackDialog::accept() { if (! m_project) { info().information(tr("I can't create a new Track if there is no Project loaded!!")); return; } Sheet* sheet = m_project->get_current_sheet(); if ( ! sheet ) { return ; } int count = countSpinBox->value(); QString title = titleLineEdit->text(); if (title.isEmpty()) { title = "Untitled"; } CommandGroup* group = new CommandGroup(sheet, ""); for (int i=0; iset_name(title); group->add_command(sheet->add_track(track)); } group->setText(tr("Added %n Track(s)", "", count)); Command::process_command(group); hide(); } void NewTrackDialog::set_project(Project * project) { m_project = project; } void NewTrackDialog::reject() { hide(); } traverso-0.49.4/src/traverso/dialogs/project/NewTrackDialog.h000644 001750 001750 00000002177 11163362147 024525 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef NEW_TRACK_DIALOG_H #define NEW_TRACK_DIALOG_H #include "ui_NewTrackDialog.h" #include class Project; class NewTrackDialog : public QDialog, protected Ui::NewTrackDialog { Q_OBJECT public: NewTrackDialog(QWidget* parent = 0); ~NewTrackDialog() {}; private: Project* m_project; private slots: void accept(); void reject(); void set_project(Project* project); }; #endif traverso-0.49.4/src/traverso/dialogs/project/ProjectManagerDialog.h000644 001750 001750 00000003306 11163362147 025703 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef SONG_MANAGER_DIALOG_H #define SONG_MANAGER_DIALOG_H #include "ui_ProjectManagerDialog.h" #include class Project; class Sheet; class ProjectManagerDialog : public QDialog, protected Ui::ProjectManagerDialog { Q_OBJECT public: ProjectManagerDialog(QWidget* parent = 0); ~ProjectManagerDialog(); private: Project* m_project; private slots: void update_sheet_list(); void set_project(Project* project); void sheetitem_clicked( QTreeWidgetItem* item, int); void on_renameSheetButton_clicked(); void on_deleteSheetButton_clicked(); void on_createSheetButton_clicked(); void redo_text_changed(const QString& text); void undo_text_changed(const QString& text); void on_undoButton_clicked(); void on_redoButton_clicked(); void on_sheetsExportButton_clicked(); void on_exportTemplateButton_clicked(); void accept(); void reject(); }; #endif //eof traverso-0.49.4/src/traverso/dialogs/project/NewProjectDialog.h000644 001750 001750 00000003352 11163362147 025063 0ustar00remonremon000000 000000 /* Copyright (C) 2007-2008 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef NEW_PROJECT_DIALOG_H #define NEW_PROJECT_DIALOG_H #include "ui_NewProjectDialog.h" #include class AudioFileCopyConvert; class ExportFormatOptionsWidget; class QButtonGroup; struct ExportSpecification; class NewProjectDialog : public QDialog, protected Ui::NewProjectDialog { Q_OBJECT public: NewProjectDialog(QWidget* parent = 0); ~NewProjectDialog(); AudioFileCopyConvert* get_converter(); private: AudioFileCopyConvert* m_converter; ExportSpecification* m_exportSpec; ExportFormatOptionsWidget* m_formatOptionsWidget; QButtonGroup* m_buttonGroup; void load_all_files(); void copy_files(); private slots: void accept(); void use_template_checkbox_state_changed(int state); void update_template_combobox(); void add_files(); void remove_files(); void load_file(QString, int, QString); void move_up(); void move_down(); signals: void loadFile(QString, int, QString); void number_of_files(int); }; #endif //eof traverso-0.49.4/src/traverso/dialogs/InsertSilenceDialog.cpp000644 001750 001750 00000004425 11163362147 024441 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Ben Levitt This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "InsertSilenceDialog.h" #include "ProjectManager.h" #include "Project.h" #include "Sheet.h" #include "Import.h" #include "Track.h" #include "AudioClip.h" #include #include InsertSilenceDialog::InsertSilenceDialog(QWidget * parent) : QDialog(parent) { setupUi(this); m_track = 0; buttonBox->button(QDialogButtonBox::Ok)->setDefault(true); } void InsertSilenceDialog::setTrack(Track* track) { m_track = track; } void InsertSilenceDialog::focusInput() { lengthSpinBox->setFocus(); lengthSpinBox->selectAll(); } void InsertSilenceDialog::accept() { Sheet* sheet = pm().get_project()->get_current_sheet(); QList tracks = sheet->get_tracks(); // Make sure track is still in the sheet if (m_track){ Track* foundTrack = 0; foreach(Track* track, tracks) { if (track == m_track) { foundTrack = track; } } m_track = foundTrack; } if (sheet->get_numtracks() > 0) { if (!m_track){ Track* shortestTrack = (Track*)tracks.first(); foreach(Track* track, tracks) { if (!track->get_cliplist().isEmpty() && (track->get_cliplist().last())->get_track_end_location() > (shortestTrack->get_cliplist().last())->get_track_end_location()) { shortestTrack = track; } } m_track = shortestTrack; } TimeRef length = TimeRef(lengthSpinBox->value() * UNIVERSAL_SAMPLE_RATE); Import* cmd = new Import(m_track, length, true); Command::process_command(cmd); } hide(); } void InsertSilenceDialog::reject() { hide(); } //eof traverso-0.49.4/src/traverso/dialogs/ExportDialog.cpp000644 001750 001750 00000013226 11163362147 023152 0ustar00remonremon000000 000000 /** Copyright (C) 2005-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "ExportDialog.h" #include "ui_ExportDialog.h" #include #include #include "Export.h" #include "Information.h" #include "Project.h" #include "ProjectManager.h" #include "Sheet.h" #include "widgets/ExportFormatOptionsWidget.h" // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" ExportDialog::ExportDialog( QWidget * parent ) : QDialog(parent) , m_exportSpec(0) { setupUi(this); QBoxLayout* lay = qobject_cast(layout()); if (lay) { m_formatOptionsWidget = new ExportFormatOptionsWidget(lay->widget()); lay->insertWidget(1, m_formatOptionsWidget); } abortButton->hide(); QIcon icon = QApplication::style()->standardIcon(QStyle::SP_DirClosedIcon); fileSelectButton->setIcon(icon); set_project(pm().get_project()); setMaximumSize(400, 450); } ExportDialog::~ ExportDialog( ) { } bool ExportDialog::is_safe_to_export() { PENTER; if (m_project->is_recording()) { info().warning(tr("Export during recording is not supported!")); return false; } return true; } void ExportDialog::on_startButton_clicked( ) { if (!is_safe_to_export()) { return; } if (exportDirName->text().isEmpty()) { info().warning(tr("No Export Direcoty was given, please supply one first!")); return; } connect(m_project, SIGNAL(sheetExportProgressChanged(int)), this, SLOT(update_sheet_progress(int))); connect(m_project, SIGNAL(overallExportProgressChanged(int)), this, SLOT(update_overall_progress(int))); connect(m_project, SIGNAL(exportFinished()), this, SLOT(render_finished())); connect(m_project, SIGNAL(exportStartedForSheet(Sheet*)), this, SLOT (set_exporting_sheet(Sheet*))); // clear extraformats, it might be different now from previous runs! m_exportSpec->extraFormat.clear(); m_formatOptionsWidget->get_format_options(m_exportSpec); if (allSheetsButton->isChecked()) { m_exportSpec->allSheets = true; } else { m_exportSpec->allSheets = false; } m_exportSpec->exportdir = exportDirName->text(); if (m_exportSpec->exportdir.size() > 1 && (m_exportSpec->exportdir.at(m_exportSpec->exportdir.size()-1).decomposition() != "/")) { m_exportSpec->exportdir = m_exportSpec->exportdir.append("/"); } QString name = m_exportSpec->exportdir; QFileInfo fi(m_exportSpec->name); name += fi.completeBaseName() + ".toc"; m_exportSpec->tocFileName = name; m_exportSpec->isRecording = false; if (m_project->export_project(m_exportSpec) == -1) { return; } startButton->hide(); closeButton->hide(); abortButton->show(); } void ExportDialog::on_closeButton_clicked() { hide(); } void ExportDialog::on_abortButton_clicked( ) { m_exportSpec->stop = true; m_exportSpec->breakout = true; } void ExportDialog::on_fileSelectButton_clicked( ) { if (!m_project) { info().information(tr("No project loaded, to export a project, load it first!")); return; } QString dirName = QFileDialog::getExistingDirectory(this, tr("Choose/create an export directory"), m_exportSpec->exportdir); if (!dirName.isEmpty()) { exportDirName->setText(dirName); } } void ExportDialog::update_sheet_progress( int progress ) { } void ExportDialog::update_overall_progress( int progress ) { progressBar->setValue(progress); } void ExportDialog::render_finished( ) { disconnect(m_project, SIGNAL(sheetExportProgressChanged(int)), this, SLOT(update_sheet_progress(int))); disconnect(m_project, SIGNAL(overallExportProgressChanged(int)), this, SLOT(update_overall_progress(int))); disconnect(m_project, SIGNAL(exportFinished()), this, SLOT(render_finished())); disconnect(m_project, SIGNAL(exportStartedForSheet(Sheet*)), this, SLOT (set_exporting_sheet(Sheet*))); startButton->show(); closeButton->show(); abortButton->hide(); progressBar->setValue(0); } void ExportDialog::set_exporting_sheet( Sheet * sheet ) { QString name = tr("Progress of Sheet ") + QString::number(m_project->get_sheet_index(sheet->get_id())) + ": " + sheet->get_title(); currentProcessingSheetName->setText(name); } void ExportDialog::set_project(Project * project) { m_project = project; if (! m_project) { info().information(tr("No project loaded, to export a project, load it first!")); setEnabled(false); if (m_exportSpec) { delete m_exportSpec; m_exportSpec = 0; } } else { setEnabled(true); if (m_exportSpec) { delete m_exportSpec; m_exportSpec = 0; } m_exportSpec = new ExportSpecification; m_exportSpec->exportdir = m_project->get_root_dir() + "/Export/"; m_exportSpec->renderfinished = false; exportDirName->setText(m_exportSpec->exportdir); } } void ExportDialog::closeEvent(QCloseEvent * event) { if (closeButton->isHidden()) { event->setAccepted(false); return; } QDialog::closeEvent(event); } void ExportDialog::reject() { if (closeButton->isHidden()) { return; } hide(); } traverso-0.49.4/src/traverso/dialogs/ProjectConverterDialog.cpp000644 001750 001750 00000005541 11163362147 025170 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "ProjectConverterDialog.h" #include "ProjectConverter.h" #include "ProjectManager.h" #include ProjectConverterDialog::ProjectConverterDialog(QWidget * parent) : QDialog(parent) { setupUi(this); m_converter = new ProjectConverter; stopConversionButton->hide(); loadProjectButton->hide(); connect(m_converter, SIGNAL(progress(int)), progressBar, SLOT(setValue(int))); connect(m_converter, SIGNAL(fileMergeStarted(QString)), this, SLOT(file_merge_started(QString))); connect(m_converter, SIGNAL(fileMergeFinished(QString)), this, SLOT(file_merge_finished(QString))); connect(m_converter, SIGNAL(message(QString)), this, SLOT(converter_messages(QString))); connect(m_converter, SIGNAL(conversionFinished()), this, SLOT(conversion_finished())); } void ProjectConverterDialog::accept() { stopConversionButton->show(); startButton->hide(); closeButton->hide(); m_converter->start(); } void ProjectConverterDialog::reject() { hide(); } void ProjectConverterDialog::set_project(const QString & rootdir, const QString & name) { m_projectname = name; projectNameLable->setText(tr("Conversion needed for Project: '%1'").arg(name)); m_converter->set_project(rootdir, name); conversionInfoText->append(m_converter->get_conversion_description()); } void ProjectConverterDialog::file_merge_started(QString filename) { taskTextBrowswer->append(tr("Converting file %1").arg(filename)); } void ProjectConverterDialog::file_merge_finished(QString filename) { // taskTextBrowswer->append(tr("Finished converting %1").arg(filename)); } void ProjectConverterDialog::converter_messages(QString message) { taskTextBrowswer->append(message); } void ProjectConverterDialog::conversion_finished() { loadProjectButton->show(); closeButton->show(); startButton->hide(); stopConversionButton->hide(); } void ProjectConverterDialog::on_loadProjectButton_clicked() { pm().load_project(m_projectname); reject(); } void ProjectConverterDialog::on_stopConversionButton_clicked() { m_converter->stop_conversion(); stopConversionButton->hide(); closeButton->show(); } traverso-0.49.4/src/traverso/dialogs/PluginSelectorDialog.h000644 001750 001750 00000011117 11222345236 024266 0ustar00remonremon000000 000000 /* Copyright (C) 2006-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef PLUGIN_SELECTOR_DIALOG_H #define PLUGIN_SELECTOR_DIALOG_H #include #include #include #include #include #include #include #include class Plugin; class PluginSelectorDialog : public QDialog { Q_OBJECT public: static PluginSelectorDialog* instance(); Plugin* get_selected_plugin(); void set_description(const QString& des); private: PluginSelectorDialog(QWidget* parent = 0); ~PluginSelectorDialog(); static PluginSelectorDialog* m_instance; QVBoxLayout *vboxLayout; QLabel *objectToAddPluginTooLabel; QTreeWidget *pluginTreeWidget; QHBoxLayout *hboxLayout; QSpacerItem *spacerItem; QPushButton *okButton; QPushButton *cancelButton; Plugin* m_plugin; void setupUi(QDialog *PluginSelectorDialog) { if (PluginSelectorDialog->objectName().isEmpty()) PluginSelectorDialog->setObjectName(QString::fromUtf8("PluginSelectorDialog")); QSize size(471, 433); size = size.expandedTo(PluginSelectorDialog->minimumSizeHint()); PluginSelectorDialog->resize(size); vboxLayout = new QVBoxLayout(PluginSelectorDialog); #ifndef Q_OS_MAC vboxLayout->setSpacing(6); #endif #ifndef Q_OS_MAC vboxLayout->setMargin(9); #endif vboxLayout->setObjectName(QString::fromUtf8("vboxLayout")); objectToAddPluginTooLabel = new QLabel(PluginSelectorDialog); objectToAddPluginTooLabel->setObjectName(QString::fromUtf8("objectToAddPluginTooLabel")); vboxLayout->addWidget(objectToAddPluginTooLabel); pluginTreeWidget = new QTreeWidget(PluginSelectorDialog); pluginTreeWidget->setObjectName(QString::fromUtf8("pluginTreeWidget")); vboxLayout->addWidget(pluginTreeWidget); hboxLayout = new QHBoxLayout(); #ifndef Q_OS_MAC hboxLayout->setSpacing(6); #endif hboxLayout->setMargin(0); hboxLayout->setObjectName(QString::fromUtf8("hboxLayout")); spacerItem = new QSpacerItem(131, 31, QSizePolicy::Expanding, QSizePolicy::Minimum); hboxLayout->addItem(spacerItem); okButton = new QPushButton(PluginSelectorDialog); okButton->setObjectName(QString::fromUtf8("okButton")); hboxLayout->addWidget(okButton); cancelButton = new QPushButton(PluginSelectorDialog); cancelButton->setObjectName(QString::fromUtf8("cancelButton")); hboxLayout->addWidget(cancelButton); vboxLayout->addLayout(hboxLayout); retranslateUi(PluginSelectorDialog); QObject::connect(cancelButton, SIGNAL(clicked()), PluginSelectorDialog, SLOT(reject())); QObject::connect(okButton, SIGNAL(clicked()), PluginSelectorDialog, SLOT(accept())); QObject::connect(pluginTreeWidget, SIGNAL(activated(QModelIndex)), okButton, SLOT(click())); QMetaObject::connectSlotsByName(PluginSelectorDialog); } // setupUi void retranslateUi(QDialog *PluginSelectorDialog) { PluginSelectorDialog->setWindowTitle(QApplication::translate("PluginSelectorDialog", "Plugin Selector", 0, QApplication::UnicodeUTF8)); objectToAddPluginTooLabel->setText(QApplication::translate("PluginSelectorDialog", "Add Plugin too", 0, QApplication::UnicodeUTF8)); pluginTreeWidget->headerItem()->setText(0, QApplication::translate("PluginSelectorDialog", "Plugin Name", 0, QApplication::UnicodeUTF8)); pluginTreeWidget->headerItem()->setText(1, QApplication::translate("PluginSelectorDialog", "Type", 0, QApplication::UnicodeUTF8)); pluginTreeWidget->headerItem()->setText(2, QApplication::translate("PluginSelectorDialog", "In/Out", 0, QApplication::UnicodeUTF8)); okButton->setText(QApplication::translate("PluginSelectorDialog", "OK", 0, QApplication::UnicodeUTF8)); cancelButton->setText(QApplication::translate("PluginSelectorDialog", "Cancel", 0, QApplication::UnicodeUTF8)); Q_UNUSED(PluginSelectorDialog); } // retranslateUi private slots: void on_okButton_clicked(); void on_cancelButton_clicked(); void plugin_double_clicked(); }; #endif //eof traverso-0.49.4/src/traverso/dialogs/settings/000755 001750 001750 00000000000 11163362200 021667 5ustar00remonremon000000 000000 traverso-0.49.4/src/traverso/dialogs/settings/Pages.h000644 001750 001750 00000010036 11163362147 023111 0ustar00remonremon000000 000000 /* Copyright (C) 2007-2009 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef CONFIG_PAGES_H #define CONFIG_PAGES_H #include #include "ui_AudioDriverConfigPage.h" #include "ui_KeyboardConfigPage.h" #include "ui_BehaviorConfigPage.h" #include "ui_RecordingConfigPage.h" #include "ui_AppearenceConfigPage.h" #include "ui_PerformanceConfigPage.h" #include "ui_AlsaDevicesPage.h" #include "ui_PaDriverPage.h" class AlsaDevicesPage : public QWidget, private Ui::AlsaDevicesPage { public: AlsaDevicesPage(QWidget* parent) : QWidget(parent) { setupUi(this); } private: friend class AudioDriverConfigPage; }; class PaDriverPage : public QWidget, private Ui::PaDriverPage { public: PaDriverPage(QWidget* parent) : QWidget(parent) { setupUi(this); } private: friend class AudioDriverConfigPage; }; class ConfigPage : public QWidget { Q_OBJECT public: ConfigPage(QWidget* parent) : QWidget(parent) {}; virtual void save_config() = 0; virtual void load_config() = 0; virtual void reset_default_config() = 0; }; class AudioDriverConfigPage : public ConfigPage, private Ui::AudioDriverConfigPage { Q_OBJECT public: AudioDriverConfigPage(QWidget *parent = 0); void load_config(); void save_config(); void reset_default_config(); private: QVBoxLayout* m_mainLayout; AudioDriverConfigPage* m_driverConfigPage; AlsaDevicesPage* m_alsadevices; PaDriverPage* m_portaudiodrivers; QList periodBufferSizesList; private slots: void update_latency_combobox(); void rate_combobox_index_changed(QString); void driver_combobox_index_changed(QString); void restart_driver_button_clicked(); }; class AppearenceConfigPage : public ConfigPage, private Ui::AppearenceConfigPage { Q_OBJECT public: AppearenceConfigPage(QWidget* parent = 0); void load_config(); void save_config(); void reset_default_config(); private: void update_theme_combobox(const QString& path); void create_connections(); QString supportedIconSizes; private slots: void dirselect_button_clicked(); void style_index_changed(const QString& text); void theme_index_changed(const QString& theme); void use_selected_styles_pallet_checkbox_toggled(bool); void color_adjustbox_changed(int); void theme_option_changed(); }; class BehaviorConfigPage : public ConfigPage, private Ui::BehaviorConfigPage { Q_OBJECT public: BehaviorConfigPage(QWidget* parent = 0); void load_config(); void save_config(); void reset_default_config(); private slots: void update_follow(); }; class KeyboardConfigPage : public ConfigPage, private Ui::KeyboardConfigPage { Q_OBJECT public: KeyboardConfigPage(QWidget* parent = 0); void load_config(); void save_config(); void reset_default_config(); private slots: void keymap_index_changed(const QString& keymap); void update_keymap_combo(); void on_exportButton_clicked(); void on_printButton_clicked(); }; class PerformanceConfigPage : public ConfigPage, private Ui::PerformanceConfigPage { public: PerformanceConfigPage(QWidget* parent = 0); void load_config(); void save_config(); void reset_default_config(); }; class RecordingConfigPage : public ConfigPage, private Ui::RecordingConfigPage { Q_OBJECT public: RecordingConfigPage(QWidget* parent = 0); void load_config(); void save_config(); void reset_default_config(); private slots: void encoding_index_changed(int index); void use_onthefly_resampling_checkbox_changed(int state); }; #endif traverso-0.49.4/src/traverso/dialogs/settings/SettingsDialog.cpp000644 001750 001750 00000014073 11163362147 025332 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02100-1301 USA. */ #include #include #include #include #include "SettingsDialog.h" #include "Pages.h" #include SettingsDialog::SettingsDialog(QWidget* parent) : QDialog(parent) { m_saving = false; contentsWidget = new QListWidget; contentsWidget->setViewMode(QListView::IconMode); contentsWidget->setIconSize(QSize(32, 32)); contentsWidget->setMovement(QListView::Static); contentsWidget->setMaximumWidth(140); contentsWidget->setMinimumWidth(135); contentsWidget->setMinimumHeight(390); contentsWidget->setSpacing(12); pagesWidget = new QStackedWidget; pagesWidget->addWidget(new BehaviorConfigPage(this)); pagesWidget->addWidget(new AppearenceConfigPage(this)); pagesWidget->addWidget(new AudioDriverConfigPage(this)); pagesWidget->addWidget(new RecordingConfigPage(this)); pagesWidget->addWidget(new KeyboardConfigPage(this)); pagesWidget->addWidget(new PerformanceConfigPage(this)); createIcons(); contentsWidget->setCurrentRow(0); QDialogButtonBox* buttonBox = new QDialogButtonBox(this); QPushButton* cancelButton = buttonBox->addButton(QDialogButtonBox::Cancel); QPushButton* okButton = buttonBox->addButton(QDialogButtonBox::Ok); QPushButton* restoreDefaultsButton = buttonBox->addButton(QDialogButtonBox::RestoreDefaults); connect(cancelButton, SIGNAL(clicked()), this, SLOT(close())); connect(okButton, SIGNAL(clicked()), this, SLOT(save_config())); connect(okButton, SIGNAL(clicked()), this, SLOT(close())); connect(restoreDefaultsButton, SIGNAL(clicked()), this, SLOT(restore_defaults_button_clicked())); QHBoxLayout *buttonsLayout = new QHBoxLayout; buttonsLayout->addWidget(buttonBox); QHBoxLayout *horizontalLayout = new QHBoxLayout; horizontalLayout->addWidget(contentsWidget); horizontalLayout->addWidget(pagesWidget, 1); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addLayout(horizontalLayout); mainLayout->addLayout(buttonsLayout); setLayout(mainLayout); setWindowTitle(tr("Preferences - Traverso")); connect(&config(), SIGNAL(configChanged()), this, SLOT(external_change_to_settings())); resize(400, 300); } void SettingsDialog::show_page(const QString & page) { if (page == "Sound System") { contentsWidget->setCurrentRow(2); } } void SettingsDialog::createIcons() { QListWidgetItem* behaviorButton = new QListWidgetItem(contentsWidget); behaviorButton->setIcon(QIcon(":/sheetmanagement")); behaviorButton->setTextAlignment(Qt::AlignHCenter); behaviorButton->setText(tr("Behavior")); behaviorButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); behaviorButton->setSizeHint(QSize(100, 50)); QListWidgetItem* appearanceButton = new QListWidgetItem(contentsWidget); appearanceButton->setIcon(QIcon(":/appearance")); appearanceButton->setText(tr("Appearance")); appearanceButton->setTextAlignment(Qt::AlignHCenter); appearanceButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); appearanceButton->setSizeHint(QSize(100, 50)); QListWidgetItem* driverButton = new QListWidgetItem(contentsWidget); driverButton->setIcon(QIcon(":/audiocard")); driverButton->setText(tr("Sound System")); driverButton->setTextAlignment(Qt::AlignHCenter); driverButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); driverButton->setSizeHint(QSize(100, 50)); QListWidgetItem* diskioButton = new QListWidgetItem(contentsWidget); diskioButton->setIcon(QIcon(":/audiosettings")); diskioButton->setText(tr("Audio Options")); diskioButton->setTextAlignment(Qt::AlignHCenter); diskioButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); diskioButton->setSizeHint(QSize(100, 50)); QListWidgetItem* keyboardButton = new QListWidgetItem(contentsWidget); keyboardButton->setIcon(QIcon(":/keyboard")); keyboardButton->setText(tr("Keyboard")); keyboardButton->setTextAlignment(Qt::AlignHCenter); keyboardButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); keyboardButton->setSizeHint(QSize(100, 50)); QListWidgetItem* performanceButton = new QListWidgetItem(contentsWidget); performanceButton->setIcon(QIcon(":/performance")); performanceButton->setText(tr("Performance")); performanceButton->setTextAlignment(Qt::AlignHCenter); performanceButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); performanceButton->setSizeHint(QSize(100, 50)); connect(contentsWidget, SIGNAL(currentItemChanged(QListWidgetItem *, QListWidgetItem *)), this, SLOT(changePage(QListWidgetItem *, QListWidgetItem*))); } void SettingsDialog::changePage(QListWidgetItem *current, QListWidgetItem *previous) { if (!current) current = previous; pagesWidget->setCurrentIndex(contentsWidget->row(current)); } void SettingsDialog::save_config() { for (int i=0; icount(); ++i) { qobject_cast(pagesWidget->widget(i))->save_config(); } m_saving = true; config().save(); m_saving = false; } void SettingsDialog::restore_defaults_button_clicked() { ConfigPage* page = qobject_cast(pagesWidget->widget(contentsWidget->row(contentsWidget->currentItem()))); if (page) { page->reset_default_config(); } else { PERROR("SettingsDialog::restore_defaults_button_clicked: No ConfigPage found!!??\n"); } } void SettingsDialog::external_change_to_settings() { if (!m_saving) { for (int i=0; icount(); ++i) { qobject_cast(pagesWidget->widget(i))->load_config(); } } } traverso-0.49.4/src/traverso/dialogs/settings/SettingsDialog.h000644 001750 001750 00000002477 11163362147 025004 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef CONFIGDIALOG_H #define CONFIGDIALOG_H #include class QListWidget; class QListWidgetItem; class QStackedWidget; class SettingsDialog : public QDialog { Q_OBJECT public: SettingsDialog(QWidget* parent=0); void show_page(const QString& page); public slots: void changePage(QListWidgetItem *current, QListWidgetItem *previous); private: void createIcons(); QListWidget *contentsWidget; QStackedWidget *pagesWidget; bool m_saving; private slots: void save_config(); void restore_defaults_button_clicked(); void external_change_to_settings(); }; #endif traverso-0.49.4/src/traverso/dialogs/settings/Pages.cpp000644 001750 001750 00000101433 11163362147 023446 0ustar00remonremon000000 000000 /* Copyright (C) 2007-2009 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include #include #include #include #include #include #include "Pages.h" #include #if defined (ALSA_SUPPORT) #include #endif #include #include #include #include #include "Interface.h" #include #include #include #include #if defined (JACK_SUPPORT) RELAYTOOL_JACK #endif /****************************************/ /* AudioDriver */ /****************************************/ AudioDriverConfigPage::AudioDriverConfigPage(QWidget *parent) : ConfigPage(parent) { setupUi(this); periodBufferSizesList << 16 << 32 << 64 << 128 << 256 << 512 << 1024 << 2048 << 4096; m_mainLayout = qobject_cast(layout()); QStringList drivers = audiodevice().get_available_drivers(); foreach(const QString &name, drivers) { driverCombo->addItem(name); } m_portaudiodrivers = new PaDriverPage(this); m_mainLayout->addWidget(m_portaudiodrivers); m_alsadevices = new AlsaDevicesPage(this); m_alsadevices->layout()->setMargin(0); m_mainLayout->addWidget(m_alsadevices); connect(driverCombo, SIGNAL(currentIndexChanged(QString)), this, SLOT(driver_combobox_index_changed(QString))); connect(restartDriverButton, SIGNAL(clicked()), this, SLOT(restart_driver_button_clicked())); connect(rateComboBox, SIGNAL(currentIndexChanged(QString)), this, SLOT(rate_combobox_index_changed(QString))); load_config(); } void AudioDriverConfigPage::save_config() { config().set_property("Hardware", "samplerate", rateComboBox->currentText()); int bufferindex = latencyComboBox->currentIndex(); int buffersize = 1024; if (bufferindex >= 0) { buffersize = periodBufferSizesList.at(bufferindex); } config().set_property("Hardware", "buffersize", buffersize); config().set_property("Hardware", "drivertype", driverCombo->currentText()); int playback=1, capture=1; if(duplexComboBox->currentIndex() == 1) { capture = 0; } if(duplexComboBox->currentIndex() == 2) { playback = 0; } config().set_property("Hardware", "capture", capture); config().set_property("Hardware", "playback", playback); #if defined (ALSA_SUPPORT) int periods = m_alsadevices->periodsCombo->currentText().toInt(); config().set_property("Hardware", "numberofperiods", periods); int index = m_alsadevices->devicesCombo->currentIndex(); config().set_property("Hardware", "carddevice", m_alsadevices->devicesCombo->itemData(index)); config().set_property("Hardware", "DitherShape", m_alsadevices->ditherShapeComboBox->currentText()); #endif #if defined (PORTAUDIO_SUPPORT) int paindex = m_portaudiodrivers->driverCombo->currentIndex(); config().set_property("Hardware", "pahostapi", m_portaudiodrivers->driverCombo->itemData(paindex)); #endif config().set_property("Hardware", "jackslave", jackTransportCheckBox->isChecked()); } void AudioDriverConfigPage::reset_default_config() { config().set_property("Hardware", "samplerate", 44100); config().set_property("Hardware", "buffersize", 512); #if defined (ALSA_SUPPORT) config().set_property("Hardware", "drivertype", "ALSA"); config().set_property("Hardware", "carddevice", "default"); config().set_property("Hardware", "numberofperiods", 3); config().set_property("Hardware", "DitherShape", "None"); #elif defined (JACK_SUPPORT) if (libjack_is_present) config().set_property("Hardware", "drivertype", "Jack"); #else config().set_property("Hardware", "drivertype", "Null Driver"); #endif #if defined (PORTAUDIO_SUPPORT) #if defined (Q_WS_X11) config().set_property("Hardware", "pahostapi", "alsa"); #endif #if defined (Q_WS_MAC) config().set_property("Hardware", "pahostapi", "coreaudio"); #endif #if defined (Q_WS_WIN) config().set_property("Hardware", "pahostapi", "wmme"); #endif #endif //end PORTAUDIO_SUPPORT config().set_property("Hardware", "capture", 1); config().set_property("Hardware", "playback", 1); config().set_property("Hardware", "jackslave", false); load_config(); } void AudioDriverConfigPage::load_config( ) { int samplerate = config().get_property("Hardware", "samplerate", 44100).toInt(); int buffersize = config().get_property("Hardware", "buffersize", 512).toInt(); #if defined (Q_WS_X11) QString driverType = config().get_property("Hardware", "drivertype", "ALSA").toString(); #else QString driverType = config().get_property("Hardware", "drivertype", "PortAudio").toString(); #endif bool capture = config().get_property("Hardware", "capture", 1).toInt(); bool playback = config().get_property("Hardware", "playback", 1).toInt(); int driverTypeIndex = driverCombo->findText(driverType); if (driverTypeIndex >= 0) { driverCombo->setCurrentIndex(driverTypeIndex); } driver_combobox_index_changed(driverType); int buffersizeIndex = periodBufferSizesList.indexOf(buffersize); int samplerateIndex = rateComboBox->findText(QString::number(samplerate)); rateComboBox->setCurrentIndex(samplerateIndex); latencyComboBox->setCurrentIndex(buffersizeIndex); if (capture && playback) { duplexComboBox->setCurrentIndex(0); } else if (playback) { duplexComboBox->setCurrentIndex(1); } else { duplexComboBox->setCurrentIndex(2); } int index; #if defined (ALSA_SUPPORT) m_alsadevices->devicesCombo->clear(); int periodsIndex = config().get_property("Hardware", "numberofperiods", 3).toInt(); QString ditherShape = config().get_property("Hardware", "DitherShape", "None").toString(); m_alsadevices->periodsCombo->setCurrentIndex(periodsIndex - 2); int shapeIndex = m_alsadevices->ditherShapeComboBox->findText(ditherShape); if (shapeIndex >=0) { m_alsadevices->ditherShapeComboBox->setCurrentIndex(shapeIndex); } // Always add the 'default' device m_alsadevices->devicesCombo->addItem(tr("System default"), "default"); // Iterate over the maximum number of devices that can be in a system // according to alsa, and add them to the devices list. QString name; for (int i=0; i<6; ++i) { name = AlsaDriver::alsa_device_name(false, i); if (name != "") { QString card = "Card " + QString::number(i+1) + ": "; QString device = "hw:" + QString::number(i); m_alsadevices->devicesCombo->addItem(card + name, device); } } QString defaultdevice = config().get_property("Hardware", "carddevice", "default").toString(); index = m_alsadevices->devicesCombo->findData(defaultdevice); if (index >= 0) { m_alsadevices->devicesCombo->setCurrentIndex(index); } #endif #if defined (PORTAUDIO_SUPPORT) m_portaudiodrivers->driverCombo->clear(); QString defaulthostapi = ""; #if defined (Q_WS_X11) m_portaudiodrivers->driverCombo->addItem("ALSA", "alsa"); m_portaudiodrivers->driverCombo->addItem("Jack", "jack"); m_portaudiodrivers->driverCombo->addItem("OSS", "oss"); defaulthostapi = "jack"; #endif #if defined (Q_WS_MAC) m_portaudiodrivers->driverCombo->addItem("Core Audio", "coreaudio"); m_portaudiodrivers->driverCombo->addItem("Jack", "jack"); defaulthostapi = "coreaudio"; #endif #if defined (Q_WS_WIN) m_portaudiodrivers->driverCombo->addItem("MME", "wmme"); m_portaudiodrivers->driverCombo->addItem("Direct Sound", "directsound"); m_portaudiodrivers->driverCombo->addItem("ASIO", "asio"); defaulthostapi = "wmme"; #endif QString hostapi = config().get_property("Hardware", "pahostapi", defaulthostapi).toString(); index = m_portaudiodrivers->driverCombo->findData(hostapi); if (index >= 0) { m_portaudiodrivers->driverCombo->setCurrentIndex(index); } update_latency_combobox(); #endif //end PORTAUDIO_SUPPORT bool usetransport = config().get_property("Hardware", "jackslave", false).toBool(); jackTransportCheckBox->setChecked(usetransport); } void AudioDriverConfigPage::restart_driver_button_clicked() { QString driver = driverCombo->currentText(); int rate = rateComboBox->currentText().toInt(); int buffersize = periodBufferSizesList.at(latencyComboBox->currentIndex()); int playback=1, capture=1; if(duplexComboBox->currentIndex() == 1) { capture = 0; } if(duplexComboBox->currentIndex() == 2) { playback = 0; } QString cardDevice = ""; QString dithershape = "None"; #if defined (ALSA_SUPPORT) int periods = m_alsadevices->periodsCombo->currentText().toInt(); dithershape = m_alsadevices->ditherShapeComboBox->currentText(); // The AlsaDriver retrieves it's periods number directly from config() // So there is no way to use the current selected one, other then // setting it now, and restoring it afterwards... int currentperiods = config().get_property("Hardware", "numberofperiods", 3).toInt(); config().set_property("Hardware", "numberofperiods", periods); if (driver == "ALSA") { int index = m_alsadevices->devicesCombo->currentIndex(); cardDevice = m_alsadevices->devicesCombo->itemData(index).toString(); } #endif #if defined (PORTAUDIO_SUPPORT) if (driver == "PortAudio") { int index = m_portaudiodrivers->driverCombo->currentIndex(); cardDevice = m_portaudiodrivers->driverCombo->itemData(index).toString(); } #endif audiodevice().set_parameters(rate, buffersize, driver, capture, playback, cardDevice, dithershape); #if defined (ALSA_SUPPORT) config().set_property("Hardware", "numberofperiods", currentperiods); #endif config().set_property("Hardware", "jackslave", jackTransportCheckBox->isChecked()); } void AudioDriverConfigPage::driver_combobox_index_changed(QString driver) { m_mainLayout->removeWidget(m_alsadevices); m_mainLayout->removeWidget(m_portaudiodrivers); m_mainLayout->removeWidget(jackGroupBox); if (driver == "ALSA") { m_alsadevices->show(); m_mainLayout->insertWidget(m_mainLayout->indexOf(driverConfigGroupBox) + 1, m_alsadevices); } else { m_alsadevices->hide(); m_mainLayout->removeWidget(m_alsadevices); } if (driver == "PortAudio") { m_portaudiodrivers->show(); m_mainLayout->insertWidget(m_mainLayout->indexOf(driverConfigGroupBox) + 1, m_portaudiodrivers); } else { m_portaudiodrivers->hide(); m_mainLayout->removeWidget(m_portaudiodrivers); } if (driver == "Jack") { jackGroupBox->show(); m_mainLayout->insertWidget(m_mainLayout->indexOf(driverConfigGroupBox) + 1, jackGroupBox); } else { jackGroupBox->hide(); m_mainLayout->removeWidget(jackGroupBox); } } void AudioDriverConfigPage::update_latency_combobox( ) { latencyComboBox->clear(); int rate = rateComboBox->currentText().toInt(); int buffersize = audiodevice().get_buffer_size(); for (int i=0; iaddItem(latency); } int index = periodBufferSizesList.indexOf(buffersize); latencyComboBox->setCurrentIndex(index); } void AudioDriverConfigPage::rate_combobox_index_changed(QString ) { update_latency_combobox(); } /****************************************/ /* Appearance */ /****************************************/ void AppearenceConfigPage::save_config() { config().set_property("Themer", "themepath", themePathLineEdit->text()); config().set_property("Themer", "currenttheme", themeSelecterCombo->currentText()); config().set_property("Themer", "coloradjust", colorAdjustBox->value()); config().set_property("Themer", "style", styleCombo->currentText()); config().set_property("Themer", "usestylepallet", useStylePalletCheckBox->isChecked()); config().set_property("Themer", "paintaudiorectified", rectifiedCheckBox->isChecked()); config().set_property("Themer", "paintstereoaudioasmono", mergedCheckBox->isChecked()); config().set_property("Themer", "drawdbgrid", dbGridCheckBox->isChecked()); config().set_property("Themer", "paintwavewithoutline", paintAudioWithOutlineCheckBox->isChecked()); config().set_property("Themer", "iconsize", iconSizeCombo->currentText()); config().set_property("Themer", "toolbuttonstyle", toolbarStyleCombo->currentIndex()); config().set_property("Themer", "supportediconsizes", supportedIconSizes); config().set_property("Themer", "transportconsolesize", transportConsoleCombo->currentText()); config().set_property("Interface", "LanguageFile", languageComboBox->itemData(languageComboBox->currentIndex())); } void AppearenceConfigPage::load_config() { QIcon icon = QApplication::style()->standardIcon(QStyle::SP_DirClosedIcon); pathSelectButton->setIcon(icon); QString themepath = config().get_property("Themer", "themepath", QString(QDir::homePath()).append(".traverso/themes")).toString(); QStringList keys = QStyleFactory::keys(); keys.sort(); foreach(const QString &key, keys) { styleCombo->addItem(key); } update_theme_combobox(themepath); // Hmm, there seems no way to get the name of the current // used style, using the classname minus Q and Style seems to do the trick. QString systemstyle = QString(QApplication::style()->metaObject()->className()).remove("Q").remove("Style"); QString style = config().get_property("Themer", "style", systemstyle).toString(); QString theme = config().get_property("Themer", "currenttheme", "TraversoLight").toString(); int coloradjust = config().get_property("Themer", "coloradjust", 100).toInt(); bool usestylepallete = config().get_property("Themer", "usestylepallet", "").toBool(); bool paintRectified = config().get_property("Themer", "paintaudiorectified", false).toBool(); bool paintStereoAsMono = config().get_property("Themer", "paintstereoaudioasmono", false).toBool(); bool paintWaveWithLines = config().get_property("Themer", "paintwavewithoutline", true).toBool(); bool dbGrid = config().get_property("Themer", "drawdbgrid", false).toBool(); QString interfaceLanguage = config().get_property("Interface", "LanguageFile", "").toString(); int index = styleCombo->findText(style); styleCombo->setCurrentIndex(index); index = themeSelecterCombo->findText(theme); themeSelecterCombo->setCurrentIndex(index); colorAdjustBox->setValue(coloradjust); useStylePalletCheckBox->setChecked(usestylepallete); themePathLineEdit->setText(themepath); rectifiedCheckBox->setChecked(paintRectified); mergedCheckBox->setChecked(paintStereoAsMono); dbGridCheckBox->setChecked(dbGrid); paintAudioWithOutlineCheckBox->setChecked(paintWaveWithLines); toolbarStyleCombo->clear(); toolbarStyleCombo->addItem(tr("Icons only")); toolbarStyleCombo->addItem(tr("Text only")); toolbarStyleCombo->addItem(tr("Text beside Icons")); toolbarStyleCombo->addItem(tr("Text below Icons")); int tbstyle = config().get_property("Themer", "toolbuttonstyle", 0).toInt(); toolbarStyleCombo->setCurrentIndex(tbstyle); // icon sizes of the toolbars QString iconsize = config().get_property("Themer", "iconsize", "22").toString(); supportedIconSizes = config().get_property("Themer", "supportediconsizes", "16;22;32;48").toString(); // if the list is empty, we should offer some default values. (The list can only be // empty if someone deleted the values, but not the whole entry, in the config file.) if (supportedIconSizes.isEmpty()) { supportedIconSizes = "16;22;32;48"; } QStringList iconSizesList = supportedIconSizes.split(";", QString::SkipEmptyParts); // check if the current icon size occurs in the list, if not, add it if (iconSizesList.lastIndexOf(iconsize) == -1) { iconSizesList << iconsize; iconSizesList.sort(); } iconSizeCombo->clear(); iconSizeCombo->addItems(iconSizesList); int iconsizeindex = iconSizeCombo->findText(iconsize); iconSizeCombo->setCurrentIndex(iconsizeindex); // and the same again for the icons size of the transport console QString trspsize = config().get_property("Themer", "transportconsolesize", "22").toString(); iconSizesList = supportedIconSizes.split(";", QString::SkipEmptyParts); if (iconSizesList.lastIndexOf(iconsize) == -1) { iconSizesList << trspsize; iconSizesList.sort(); } transportConsoleCombo->clear(); transportConsoleCombo->addItems(iconSizesList); int trspsizeindex = iconSizeCombo->findText(trspsize); transportConsoleCombo->setCurrentIndex(trspsizeindex); int langIndex = languageComboBox->findData(interfaceLanguage); if (langIndex >= 0) { languageComboBox->setCurrentIndex(langIndex); } } void AppearenceConfigPage::reset_default_config() { styleCombo->clear(); config().set_property("Themer", "themepath", QString(QDir::homePath()).append("/.traverso/themes")); config().set_property("Themer", "currenttheme", "TraversoLight"); config().set_property("Themer", "coloradjust", 100); QString systemstyle = QString(QApplication::style()->metaObject()->className()).remove("Q").remove("Style"); config().set_property("Themer", "style", systemstyle); config().set_property("Themer", "usestylepallet", false); config().set_property("Themer", "paintaudiorectified", false); config().set_property("Themer", "paintstereoaudioasmono", false); config().set_property("Themer", "drawdbgrid", false); config().set_property("Themer", "paintwavewithoutline", true); config().set_property("Themer", "supportediconsizes", "16;22;32;48"); config().set_property("Themer", "iconsize", "22"); config().set_property("Themer", "toolbuttonstyle", 0); config().set_property("Interface", "LanguageFile", ""); load_config(); } AppearenceConfigPage::AppearenceConfigPage(QWidget * parent) : ConfigPage(parent) { setupUi(this); themeSelecterCombo->setInsertPolicy(QComboBox::InsertAlphabetically); languageComboBox->addItem(tr("Default Language"), ""); foreach(const QString &lang, find_qm_files()) { languageComboBox->addItem(language_name_from_qm_file(lang), lang); } load_config(); create_connections(); } void AppearenceConfigPage::create_connections() { connect(styleCombo, SIGNAL(currentIndexChanged(const QString)), this, SLOT(style_index_changed(const QString))); connect(themeSelecterCombo, SIGNAL(currentIndexChanged(const QString)), this, SLOT(theme_index_changed(const QString))); connect(useStylePalletCheckBox, SIGNAL(toggled(bool)), this, SLOT(use_selected_styles_pallet_checkbox_toggled(bool))); connect(pathSelectButton, SIGNAL(clicked()), this, SLOT(dirselect_button_clicked())); connect(colorAdjustBox, SIGNAL(valueChanged(int)), this, SLOT(color_adjustbox_changed(int))); connect(rectifiedCheckBox, SIGNAL(toggled(bool)), this, SLOT(theme_option_changed())); connect(mergedCheckBox, SIGNAL(toggled(bool)), this, SLOT(theme_option_changed())); connect(dbGridCheckBox, SIGNAL(toggled(bool)), this, SLOT(theme_option_changed())); connect(paintAudioWithOutlineCheckBox, SIGNAL(toggled(bool)), this, SLOT(theme_option_changed())); } void AppearenceConfigPage::style_index_changed(const QString& text) { QApplication::setStyle(text); QIcon icon = QApplication::style()->standardIcon(QStyle::SP_DirClosedIcon); pathSelectButton->setIcon(icon); use_selected_styles_pallet_checkbox_toggled(useStylePalletCheckBox->isChecked()); } void AppearenceConfigPage::theme_index_changed(const QString & theme) { int index = themeSelecterCombo->findText(theme); QString data = themeSelecterCombo->itemData(index).toString(); QString path = config().get_property("Themer", "themepath", "").toString(); if (data == "builtintheme") { themer()->use_builtin_theme(theme); } else { themer()->set_path_and_theme(path, theme); } } void AppearenceConfigPage::use_selected_styles_pallet_checkbox_toggled(bool checked) { if (checked) { QApplication::setPalette(QApplication::style()->standardPalette()); } else { QApplication::setPalette(themer()->system_palette()); } } void AppearenceConfigPage::color_adjustbox_changed(int value) { themer()->set_color_adjust_value(value); } void AppearenceConfigPage::dirselect_button_clicked() { QString path = themePathLineEdit->text(); if (path.isEmpty()) { path = QDir::homePath(); } QString dirName = QFileDialog::getExistingDirectory(this, tr("Select default project dir"), path); if (!dirName.isEmpty()) { themePathLineEdit->setText(dirName); update_theme_combobox(dirName); } } void AppearenceConfigPage::update_theme_combobox(const QString& path) { themeSelecterCombo->clear(); foreach(QString key, themer()->get_builtin_themes()) { themeSelecterCombo->insertItem(0, key, "builtintheme"); } QDir themedir(path); foreach (QString dirName, themedir.entryList(QDir::Dirs | QDir::NoDotAndDotDot)) { QString filename = path + "/" + dirName + "/" + "traversotheme.xml"; if (QFile::exists(filename) ) { themeSelecterCombo->insertItem(0, dirName); } } } void AppearenceConfigPage::theme_option_changed() { config().set_property("Themer", "paintaudiorectified", rectifiedCheckBox->isChecked()); config().set_property("Themer", "paintstereoaudioasmono", mergedCheckBox->isChecked()); config().set_property("Themer", "drawdbgrid", dbGridCheckBox->isChecked()); config().set_property("Themer", "paintwavewithoutline", paintAudioWithOutlineCheckBox->isChecked()); themer()->load(); } /****************************************/ /* Behavior */ /****************************************/ BehaviorConfigPage::BehaviorConfigPage(QWidget * parent) : ConfigPage(parent) { setupUi(this); connect(&config(), SIGNAL(configChanged()), this, SLOT(update_follow())); load_config(); } void BehaviorConfigPage::save_config() { config().set_property("Project", "loadLastUsed", loadLastProjectCheckBox->isChecked()); config().set_property("Sheet", "trackCreationCount", numberOfTrackSpinBox->value()); config().set_property("PlayHead", "Follow", keepCursorVisibleCheckBox->isChecked()); config().set_property("PlayHead", "Scrollmode", scrollModeComboBox->currentIndex()); config().set_property("AudioClip", "SyncDuringDrag", resyncAudioCheckBox->isChecked()); config().set_property("AudioClip", "LockByDefault", lockClipsCheckBox->isChecked()); QString oncloseaction; if (saveRadioButton->isChecked()) { config().set_property("Project", "onclose", "save"); } else if (askRadioButton->isChecked()) { config().set_property("Project", "onclose", "ask"); } else { config().set_property("Project", "onclose", "dontsave"); } } void BehaviorConfigPage::load_config() { bool loadLastUsedProject = config().get_property("Project", "loadLastUsed", 1).toBool(); QString oncloseaction = config().get_property("Project", "onclose", "save").toString(); int defaultNumTracks = config().get_property("Sheet", "trackCreationCount", 6).toInt(); int scrollMode = config().get_property("PlayHead", "Scrollmode", 2).toInt(); bool resyncAudio = config().get_property("AudioClip", "SyncDuringDrag", false).toBool(); bool lockClips = config().get_property("AudioClip", "LockByDefault", false).toBool(); loadLastProjectCheckBox->setChecked(loadLastUsedProject); numberOfTrackSpinBox->setValue(defaultNumTracks); scrollModeComboBox->setCurrentIndex(scrollMode); resyncAudioCheckBox->setChecked(resyncAudio); lockClipsCheckBox->setChecked(lockClips); if (oncloseaction == "save") { saveRadioButton->setChecked(true); } else if (oncloseaction == "ask") { askRadioButton->setChecked(true); } else { neverRadioButton->setChecked(true); } update_follow(); } void BehaviorConfigPage::update_follow() { bool keepCursorVisible = config().get_property("PlayHead", "Follow", true).toBool(); keepCursorVisibleCheckBox->setChecked(keepCursorVisible); scrollModeComboBox->setEnabled(keepCursorVisible); } void BehaviorConfigPage::reset_default_config() { config().set_property("Project", "loadLastUsed", true); config().set_property("Project", "onclose", "save"); config().set_property("Sheet", "trackCreationCount", 6); config().set_property("PlayHead", "Follow", 0); config().set_property("PlayHead", "Scrollmode", 2); config().set_property("AudioClip", "SyncDuringDrag", false); config().set_property("AudioClip", "LockByDefault", false); load_config(); } /****************************************/ /* Keyboard */ /****************************************/ KeyboardConfigPage::KeyboardConfigPage(QWidget * parent) : ConfigPage(parent) { setupUi(this); connect(keymapComboBox, SIGNAL(currentIndexChanged(const QString)), this, SLOT(keymap_index_changed(const QString))); load_config(); update_keymap_combo(); } void KeyboardConfigPage::load_config() { int doubleFactTimeout = config().get_property("CCE", "doublefactTimeout", 180).toInt(); int holdTimeout = config().get_property("CCE", "holdTimeout", 150).toInt(); doubleFactTimeoutSpinBox->setValue(doubleFactTimeout); holdTimeoutSpinBox->setValue(holdTimeout); QString defaultkeymap = config().get_property("CCE", "keymap", "default").toString(); int index = keymapComboBox->findText(defaultkeymap); if (index >= 0) { keymapComboBox->setCurrentIndex(index); } } void KeyboardConfigPage::save_config() { QString currentkeymap = config().get_property("CCE", "keymap", "default").toString(); QString newkeymap = keymapComboBox->currentText(); config().set_property("CCE", "doublefactTimeout", doubleFactTimeoutSpinBox->value()); config().set_property("CCE", "holdTimeout", holdTimeoutSpinBox->value()); config().set_property("CCE", "keymap", newkeymap); ie().set_double_fact_interval(doubleFactTimeoutSpinBox->value()); ie().set_hold_sensitiveness(holdTimeoutSpinBox->value()); if (currentkeymap != newkeymap) { ie().init_map(newkeymap); } } void KeyboardConfigPage::reset_default_config() { config().set_property("CCE", "doublefactTimeout", 180); config().set_property("CCE", "holdTimeout", 150); config().set_property("CCE", "keymap", "default"); load_config(); } void KeyboardConfigPage::keymap_index_changed(const QString& keymap) { QString filename = ":/keymaps/" + keymap + ".xml"; if ( ! QFile::exists(filename)) { filename = QDir::homePath() + "/.traverso/keymaps/" + keymap + ".xml"; } QDomDocument doc("keymap"); QFile file(filename); if (!file.open(QIODevice::ReadOnly)) return; if (!doc.setContent(&file)) { file.close(); return; } file.close(); QDomElement root = doc.documentElement(); QDomNode mapinfo = root.firstChildElement("KeymapInfo"); QDomElement e = mapinfo.toElement(); QString description = e.attribute("description", tr("No description set for this keymap")); descriptionTextEdit->setHtml(description); } void KeyboardConfigPage::update_keymap_combo() { keymapComboBox->clear(); QDir keymapdir(":/keymaps"); foreach (QString filename, keymapdir.entryList(QDir::Files)) { keymapComboBox->insertItem(0, filename.remove(".xml")); } keymapdir.setPath(QDir::homePath() + "/.traverso/keymaps"); foreach (QString filename, keymapdir.entryList(QDir::Files)) { keymapComboBox->insertItem(0, filename.remove(".xml")); } } void KeyboardConfigPage::on_exportButton_clicked() { Interface::instance()->export_keymap(); QMessageBox::information( Interface::instance(), tr("KeyMap Export"), tr("The exported keymap can be found here:\n\n %1").arg(QDir::homePath() + "/traversokeymap.html"), QMessageBox::Ok); } void KeyboardConfigPage::on_printButton_clicked() { QString kmap; Interface::instance()->get_keymap(kmap); QPrinter printer(QPrinter::ScreenResolution); QPrintDialog printDialog(&printer, Interface::instance()); if (printDialog.exec() == QDialog::Accepted) { QTextEdit edit; edit.insertHtml(kmap); edit.document()->print(&printer); } } PerformanceConfigPage::PerformanceConfigPage(QWidget* parent) : ConfigPage(parent) { delete layout(); setupUi(this); load_config(); // don't show it for now, it's not making sense with current opengl support useOpenGLCheckBox->hide(); #if defined (QT_OPENGL_SUPPORT) useOpenGLCheckBox->setEnabled(true); #else useOpenGLCheckBox->setEnabled(false); #endif QIcon icon = QApplication::style()->standardIcon(QStyle::SP_MessageBoxInformation); reloadWarningLabel->setPixmap(icon.pixmap(22, 22)); } void PerformanceConfigPage::load_config() { int jogUpdateInterval = config().get_property("CCE", "jogupdateinterval", 28).toInt(); bool useOpenGL = config().get_property("Interface", "OpenGL", false).toBool(); jogUpdateIntervalSpinBox->setValue(1000 / jogUpdateInterval); useOpenGLCheckBox->setChecked(useOpenGL); double buffertime = config().get_property("Hardware", "readbuffersize", 1.0).toDouble(); bufferTimeSpinBox->setValue(buffertime); } void PerformanceConfigPage::save_config() { config().set_property("Interface", "OpenGL", useOpenGLCheckBox->isChecked()); config().set_property("CCE", "jogupdateinterval", 1000 / jogUpdateIntervalSpinBox->value()); double buffertime = bufferTimeSpinBox->value(); config().set_property("Hardware", "readbuffersize", buffertime); } void PerformanceConfigPage::reset_default_config() { config().set_property("CCE", "jogupdateinterval", 28); config().set_property("Interface", "OpenGL", false); config().set_property("Hardware", "readbuffersize", 1.0); load_config(); } /****************************************/ /* Recording */ /****************************************/ RecordingConfigPage::RecordingConfigPage(QWidget * parent) : ConfigPage(parent) { setupUi(this); encodingComboBox->addItem("WAV", "wav"); encodingComboBox->addItem("WavPack", "wavpack"); encodingComboBox->addItem("WAV64", "w64"); wavpackCompressionComboBox->addItem("Very high", "very_high"); wavpackCompressionComboBox->addItem("High", "high"); wavpackCompressionComboBox->addItem("Fast", "fast"); connect(encodingComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(encoding_index_changed(int))); connect(useResamplingCheckBox, SIGNAL(stateChanged(int)), this, SLOT(use_onthefly_resampling_checkbox_changed(int))); load_config(); } void RecordingConfigPage::load_config() { bool useResampling = config().get_property("Conversion", "DynamicResampling", true).toBool(); if (useResampling) { use_onthefly_resampling_checkbox_changed(Qt::Checked); } else { use_onthefly_resampling_checkbox_changed(Qt::Unchecked); } QString recordFormat = config().get_property("Recording", "FileFormat", "wav").toString(); if (recordFormat == "wavpack") { encoding_index_changed(1); } else if (recordFormat == "w64") { encoding_index_changed(2); } else { encoding_index_changed(0); } QString wavpackcompression = config().get_property("Recording", "WavpackCompressionType", "fast").toString(); if (wavpackcompression == "very_high") { wavpackCompressionComboBox->setCurrentIndex(0); } else if (wavpackcompression == "high") { wavpackCompressionComboBox->setCurrentIndex(1); } else { wavpackCompressionComboBox->setCurrentIndex(2); } int index = config().get_property("Conversion", "RTResamplingConverterType", DEFAULT_RESAMPLE_QUALITY).toInt(); ontheflyResampleComboBox->setCurrentIndex(index); index = config().get_property("Conversion", "ExportResamplingConverterType", 1).toInt(); exportDefaultResampleQualityComboBox->setCurrentIndex(index); } void RecordingConfigPage::save_config() { config().set_property("Conversion", "DynamicResampling", useResamplingCheckBox->isChecked()); config().set_property("Conversion", "RTResamplingConverterType", ontheflyResampleComboBox->currentIndex()); config().set_property("Conversion", "ExportResamplingConverterType", exportDefaultResampleQualityComboBox->currentIndex()); config().set_property("Recording", "FileFormat", encodingComboBox->itemData(encodingComboBox->currentIndex()).toString()); config().set_property("Recording", "WavpackCompressionType", wavpackCompressionComboBox->itemData(wavpackCompressionComboBox->currentIndex()).toString()); QString skipwvx = wavpackUseAlmostLosslessCheckBox->isChecked() ? "true" : "false"; config().set_property("Recording", "WavpackSkipWVX", skipwvx); } void RecordingConfigPage::reset_default_config() { config().set_property("Conversion", "DynamicResampling", true); config().set_property("Conversion", "RTResamplingConverterType", DEFAULT_RESAMPLE_QUALITY); config().set_property("Conversion", "ExportResamplingConverterType", 1); config().set_property("Recording", "FileFormat", "wav"); config().set_property("Recording", "WavpackCompressionType", "fast"); config().set_property("Recording", "WavpackSkipWVX", "false"); load_config(); } void RecordingConfigPage::encoding_index_changed(int index) { encodingComboBox->setCurrentIndex(index); if (index != 1) { wacpackGroupBox->hide(); } else { wacpackGroupBox->show(); } } void RecordingConfigPage::use_onthefly_resampling_checkbox_changed(int state) { if (state == Qt::Checked) { useResamplingCheckBox->setChecked(true); ontheflyResampleComboBox->setEnabled(true); } else { useResamplingCheckBox->setChecked(false); ontheflyResampleComboBox->setEnabled(false); } } traverso-0.49.4/src/traverso/dialogs/ExportDialog.h000644 001750 001750 00000003413 11163362147 022614 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef EXPORT_DIALOG_H #define EXPORT_DIALOG_H #include "ui_ExportDialog.h" #include class ExportFormatOptionsWidget; class Project; class Sheet; struct ExportSpecification; class ExportDialog : public QDialog, protected Ui::ExportDialog { Q_OBJECT public: ExportDialog(QWidget* parent = 0); ~ExportDialog(); void set_was_closed(); protected: void closeEvent(QCloseEvent* event); private: Project* m_project; ExportSpecification* m_exportSpec; ExportFormatOptionsWidget* m_formatOptionsWidget; bool is_safe_to_export(); int m_lastSheetExported; bool m_wasClosed; int m_copyNumber; private slots: void set_project(Project* project); void update_sheet_progress(int progress); void update_overall_progress(int progress); void render_finished(); void set_exporting_sheet(Sheet* sheet); void on_fileSelectButton_clicked(); void on_startButton_clicked(); void on_abortButton_clicked(); void on_closeButton_clicked(); void reject(); }; #endif //eof traverso-0.49.4/src/traverso/dialogs/MarkerDialog.h000644 001750 001750 00000003472 11163362147 022561 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef MARKER_DIALOG_H #define MARKER_DIALOG_H #include "ui_MarkerDialog.h" #include class Project; class Marker; class Sheet; class MarkerDialog : public QDialog, protected Ui::MarkerDialog { Q_OBJECT public: MarkerDialog(QWidget* parent = 0); ~MarkerDialog() {}; private: Project* m_project; Marker* m_marker; Sheet* m_sheet; Marker* get_marker(qint64); void next_item(QLineEdit *); private slots: void update_marker_treeview(); void item_changed(QTreeWidgetItem *, QTreeWidgetItem *); void description_changed(const QString &); void position_changed(const QString &); void remove_marker(); void export_toc(); void apply(); void cancel(); void title_enter(); void position_enter(); void performer_enter(); void composer_enter(); void arranger_enter(); void sheetwriter_enter(); void message_enter(); void isrc_enter(); void title_all(); void performer_all(); void composer_all(); void arranger_all(); void songwriter_all(); void message_all(); void copy_all(); void pemph_all(); }; #endif traverso-0.49.4/src/traverso/dialogs/ProjectConverterDialog.h000644 001750 001750 00000003045 11163362147 024632 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef PROJECT_CONVERTER_DIALOG_H #define PROJECT_CONVERTER_DIALOG_H #include "ui_ProjectConverterDialog.h" #include class Project; class ProjectConverter; class ProjectConverterDialog : public QDialog, protected Ui::ProjectConverterDialog { Q_OBJECT public: ProjectConverterDialog(QWidget* parent = 0); ~ProjectConverterDialog() {}; void set_project(const QString& rootdir, const QString& name); private: ProjectConverter* m_converter; QString m_projectname; void accept(); void reject(); private slots: void file_merge_started(QString); void file_merge_finished(QString); void converter_messages(QString); void conversion_finished(); void on_loadProjectButton_clicked(); void on_stopConversionButton_clicked(); }; #endif //eof traverso-0.49.4/src/traverso/dialogs/CDWritingDialog.cpp000644 001750 001750 00000043450 11163362147 023525 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "CDWritingDialog.h" #include #include "Export.h" #include "Config.h" #include "AudioDevice.h" #include "Project.h" #include "ProjectManager.h" #include "Information.h" #include "Utils.h" #if defined (Q_WS_WIN) #define CDRDAO_BIN "cdrdao.exe" #else #define CDRDAO_BIN "cdrdao" #endif // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" CDWritingDialog::CDWritingDialog( QWidget * parent ) : QDialog(parent) , m_burnprocess(0) , m_exportSpec(0) { setupUi(this); stopButton->hide(); set_project(pm().get_project()); connect(closeButton, SIGNAL(clicked()), this, SLOT(hide())); connect(&pm(), SIGNAL(projectLoaded(Project*)), this, SLOT(set_project(Project*))); m_burnprocess = new QProcess(this); m_burnprocess->setProcessChannelMode(QProcess::MergedChannels); QStringList env = QProcess::systemEnvironment(); env << "LC_ALL=C"; m_burnprocess->setEnvironment(env); m_writingState = NO_STATE; m_lastSheetExported = -1; refreshButton->setIcon(QIcon(find_pixmap(":/refresh-16"))); refreshButton->setMaximumHeight(26); refreshButton->setMaximumWidth(30); connect(m_burnprocess, SIGNAL(readyReadStandardOutput()), this, SLOT(read_standard_output())); connect(m_burnprocess, SIGNAL(started()), this, SLOT(cdrdao_process_started())); connect(m_burnprocess, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(cdrdao_process_finished(int, QProcess::ExitStatus))); connect(startButton, SIGNAL(clicked()), this, SLOT(start_burn_process())); connect(stopButton, SIGNAL(clicked()), this, SLOT(stop_burn_process())); connect(refreshButton, SIGNAL(clicked()), this, SLOT(query_devices())); connect(cdDiskExportOnlyCheckBox, SIGNAL(stateChanged(int)), this, SLOT(export_only_changed(int))); m_wodimAvailable = false; // A bit lame way to 'detect' if wodim is installed if (QProcess::execute("wodim") != QProcess::FailedToStart) { m_wodimAvailable = true; } query_devices(); } CDWritingDialog::~ CDWritingDialog( ) {} bool CDWritingDialog::is_safe_to_export() { PENTER; if (m_project->is_recording()) { info().warning(tr("CD Writing during recording is not supported!")); return false; } return true; } void CDWritingDialog::on_stopButton_clicked( ) { m_exportSpec->stop = true; m_exportSpec->breakout = true; } void CDWritingDialog::set_project(Project * project) { m_project = project; if (! m_project) { info().information(tr("No project loaded, to write a project to CD, load it first!")); setEnabled(false); if (m_exportSpec) { delete m_exportSpec; m_exportSpec = 0; } } else { setEnabled(true); if (m_exportSpec) { delete m_exportSpec; m_exportSpec = 0; } m_exportSpec = new ExportSpecification; m_exportSpec->exportdir = m_project->get_root_dir() + "/Export/"; m_exportSpec->renderfinished = false; } } /****************************************************************/ /* CD EXPORT */ /****************************************************************/ void CDWritingDialog::query_devices() { PENTER; if ( ! (m_burnprocess->state() == QProcess::NotRunning) ) { printf("query_devices: burnprocess still running!\n"); return; } m_writingState = QUERY_DEVICE; cdDeviceComboBox->clear(); #if defined (Q_WS_WIN) m_burnprocess->start(CDRDAO_BIN, QStringList() << "scanbus"); #elif defined (Q_WS_MAC) cdDeviceComboBox->clear(); cdDeviceComboBox->addItem("IODVDServices"); cdDeviceComboBox->addItem("IODVDServices/2"); cdDeviceComboBox->addItem("IOCompactDiscServices"); cdDeviceComboBox->addItem("IOCompactDiscServices/2"); #else // Detect the available devices with wodim if available, // since it seems to work better then cdrdao if (m_wodimAvailable) { m_burnprocess->start("wodim", QStringList() << "--devices"); } else { m_burnprocess->start(CDRDAO_BIN, QStringList() << "drive-info"); } #endif } void CDWritingDialog::unlock_device() { if ( ! (m_burnprocess->state() == QProcess::NotRunning) ) { return; } m_writingState = UNLOCK_DEVICE; int index = cdDeviceComboBox->currentIndex(); if (index == -1) { return; } QString device = get_device(index); QStringList args; args << "unlock" << "--device" << device; #if defined (Q_WS_MAC) m_burnprocess->start(qApp->applicationDirPath() + "/cdrdao", args); #else m_burnprocess->start(CDRDAO_BIN, args); #endif } void CDWritingDialog::stop_burn_process() { PENTER; if (m_writingState == RENDER) { update_cdburn_status(tr("Aborting Render process ..."), NORMAL_MESSAGE); m_exportSpec->stop = true; m_exportSpec->breakout = true; m_exportSpec->renderfinished = false; } if (m_writingState == BURNING) { update_cdburn_status(tr("Aborting CD Burn process ..."), NORMAL_MESSAGE); m_burnprocess->terminate(); m_writingState = ABORT_BURN; } stopButton->setEnabled(false); } void CDWritingDialog::start_burn_process() { PENTER; if(!is_safe_to_export()) { return; } m_copyNumber = 0; cd_render(); int index = cdDeviceComboBox->currentIndex(); if (index != -1 && cdDeviceComboBox->itemData(index) != QVariant::Invalid) { config().set_property("Cdrdao", "drive", cdDeviceComboBox->itemData(index)); } } void CDWritingDialog::cdrdao_process_started() { PENTER; if (m_writingState == BURNING) { update_cdburn_status(tr("Waiting for CD-Writer..."), NORMAL_MESSAGE); progressBar->setMaximum(0); } } void CDWritingDialog::cdrdao_process_finished(int exitcode, QProcess::ExitStatus exitstatus) { PENTER; Q_UNUSED(exitcode); if (exitstatus == QProcess::CrashExit) { update_cdburn_status(tr("CD Burn process failed!"), ERROR_MESSAGE); } if (m_writingState == ABORT_BURN) { update_cdburn_status(tr("CD Burn process stopped on user request."), NORMAL_MESSAGE); } if (m_writingState == BURNING) { update_cdburn_status(tr("CD Writing process finished!"), NORMAL_MESSAGE); } if (exitstatus == QProcess::CrashExit || m_writingState == ABORT_BURN) { unlock_device(); } progressBar->setMaximum(100); progressBar->setValue(0); if (m_writingState == BURNING) { // check if we have to write another CD bool writeAnotherCd = false; if (m_copyNumber < spinBoxNumCopies->value()) { if (QMessageBox::information(this, tr("Writing CD %1 of %2").arg(m_copyNumber+1).arg(spinBoxNumCopies->value()), tr("Please insert an empty CD and press OK to continue."), QMessageBox::Ok | QMessageBox::Cancel) == QMessageBox::Ok) { writeAnotherCd = true; } } if (writeAnotherCd) { write_to_cd(); return; } } enable_ui_interaction(); } void CDWritingDialog::cd_render() { PENTER; if ( ! (m_burnprocess->state() == QProcess::NotRunning) ) { info().critical(tr("Burn process is still running, cannot start it twice!!")); return; } // FIXME: We should instead check export wav file timestamps/revision numbers as a dirty test if (! cdAllSheetsButton->isChecked() && m_lastSheetExported != m_project->get_current_sheet_id()) { m_exportSpec->renderfinished = false; } if (m_wasClosed && m_exportSpec->renderfinished && (m_exportSpec->allSheets == cdAllSheetsButton->isChecked()) ) { if (QMessageBox::question(this, tr("Rerender CD content"), tr("There is already a CD render available.\nShould I re-render the CD content?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::Yes) { m_exportSpec->renderfinished = false; } } m_wasClosed = false; if ( ! (m_exportSpec->renderfinished && (m_exportSpec->allSheets == cdAllSheetsButton->isChecked()) && (m_exportSpec->normalize == cdNormalizeCheckBox->isChecked())) ) { m_exportSpec->data_width = 16; m_exportSpec->writerType = "sndfile"; m_exportSpec->extraFormat["filetype"] = "wav"; m_exportSpec->channels = 2; m_exportSpec->sample_rate = 44100; m_exportSpec->writeToc = true; m_exportSpec->dither_type = GDitherTri; m_exportSpec->src_quality = SRC_SINC_MEDIUM_QUALITY; // SRC_SINC_BEST_QUALITY SRC_SINC_FASTEST SRC_ZERO_ORDER_HOLD SRC_LINEAR if (cdAllSheetsButton->isChecked()) { m_exportSpec->allSheets = true; } else { m_exportSpec->allSheets = false; } m_exportSpec->normalize = cdNormalizeCheckBox->isChecked(); m_exportSpec->isRecording = false; m_exportSpec->stop = false; m_exportSpec->breakout = false; m_exportSpec->isCdExport = true; if (m_project->create_cdrdao_toc(m_exportSpec) < 0) { info().warning(tr("Creating CDROM table of contents failed, unable to write CD")); return; } m_writingState = RENDER; connect(m_project, SIGNAL(overallExportProgressChanged(int)), this, SLOT(cd_export_progress(int))); connect(m_project, SIGNAL(exportFinished()), this, SLOT(cd_export_finished())); update_cdburn_status(tr("Rendering Sheet(s)"), NORMAL_MESSAGE); disable_ui_interaction(); m_project->export_project(m_exportSpec); m_lastSheetExported = m_project->get_current_sheet_id(); } else { if (cdDiskExportOnlyCheckBox->isChecked()) { return; } disable_ui_interaction(); write_to_cd(); } } void CDWritingDialog::write_to_cd() { PENTER; m_copyNumber++; if ( ! (m_burnprocess->state() == QProcess::NotRunning) ) { info().critical(tr("Burn process is still running, cannot start it twice!!")); return; } m_writingState = BURNING; progressBar->setValue(0); int index = cdDeviceComboBox->currentIndex(); if (index == -1) { QMessageBox::information( 0, tr("No Burn Device"), tr("No burn Device selected or available!"), QMessageBox::Ok); enable_ui_interaction(); return; } QString device = get_device(index); QStringList arguments; QString burnprogram; // wodim vs cdrecord vs cdrdao?? a lot of fuzz about these, // but so far cdrdao works for me just fine, so let's continue // using it for the actual burning for now. /* if (m_wodimAvailable) { burnprogram = "wodim"; arguments << "-vv"; if (simulateCheckBox->isChecked()) { arguments << "-dummy"; } arguments << QString("dev=").append(device); arguments << "driveropts=burnfree"; arguments << "-dao"; arguments << "-eject"; if (speedComboBox->currentIndex() != 0) { arguments << "speed=" << speedComboBox->currentText().remove("x"); } } else {*/ burnprogram = CDRDAO_BIN; arguments << "write" << "--device" << device << "-n" << "--eject" << "--driver" << "generic-mmc"; if (speedComboBox->currentIndex() != 0) { arguments << "--speed" << speedComboBox->currentText().remove("x"); } if (simulateCheckBox->isChecked()) { arguments << "--simulate"; } // } arguments << m_exportSpec->tocFileName; printf("%s arguments: %s\n", QS_C(burnprogram), QS_C(arguments.join(" "))); #if defined (Q_WS_MAC) m_burnprocess->start(qApp->applicationDirPath() + "/cdrdao", arguments); #else m_burnprocess->start(burnprogram, arguments); #endif } void CDWritingDialog::cd_export_finished() { PENTER; disconnect(m_project, SIGNAL(overallExportProgressChanged(int)), this, SLOT(cd_export_progress(int))); disconnect(m_project, SIGNAL(exportFinished()), this, SLOT(cd_export_finished())); if (m_exportSpec->breakout) { m_exportSpec->renderfinished = false; update_cdburn_status(tr("Render process stopped on user request."), NORMAL_MESSAGE); enable_ui_interaction(); return; } if (cdDiskExportOnlyCheckBox->isChecked()) { update_cdburn_status(tr("Export to disk finished!"), NORMAL_MESSAGE); enable_ui_interaction(); return; } m_exportSpec->renderfinished = true; write_to_cd(); } void CDWritingDialog::cd_export_progress(int progress) { progressBar->setValue(progress); } void CDWritingDialog::update_cdburn_status(const QString& message, int type) { if (type == NORMAL_MESSAGE) { QPalette palette; palette.setColor(QPalette::WindowText, QColor(Qt::black)); cdExportInformationLabel->setPalette(palette); cdExportInformationLabel->setText(message); } if (type == ERROR_MESSAGE) { QPalette palette; palette.setColor(QPalette::WindowText, QColor(Qt::red)); cdExportInformationLabel->setPalette(palette); cdExportInformationLabel->setText(message); } } void CDWritingDialog::read_standard_output() { PENTER; Q_ASSERT(m_burnprocess); if (m_writingState == QUERY_DEVICE) { QByteArray output = m_burnprocess->readAllStandardOutput(); QList lines = output.split('\n'); foreach(QByteArray data, lines) { if (data.isEmpty()) { continue; } printf("%s\n", data.data()); if (data.contains("trying to open")) { update_cdburn_status(tr("Trying to access CD Writer ..."), NORMAL_MESSAGE); return; } if (data.contains("Cannot open") || data.contains("Cannot setup")) { update_cdburn_status(tr("Cannot access CD Writer, is it in use ?"), ERROR_MESSAGE); return; } #if defined (Q_WS_WIN) if (QString(data).contains(QRegExp("[0-9],[0-9],[0-9]"))) { #else if (data.contains("/dev/") || data.contains("dev=")) { #endif QStringList strlist = QString(data).split(QRegExp("\\s+")); QString deviceName = "No Device Available"; QString device = "/no/device/detected"; if (m_wodimAvailable) { if (strlist.size() > 5) { deviceName = strlist.at(5) + " "; deviceName = deviceName.remove("'"); } if (strlist.size() > 7) { deviceName += strlist.at(7) + " "; deviceName = deviceName.remove("'"); } if (strlist.size() > 2) { device = strlist.at(2); device = device.remove("dev=").remove("'"); deviceName += "(" + device + ")"; } } else { if (strlist.size() > 1) { deviceName = strlist.at(1) + " "; } if (strlist.size() > 3) { deviceName += strlist.at(3) + " "; } if (strlist.size() > 0) { device = strlist.at(0); device = device.remove(":"); deviceName += "(" + device + ")"; } } cdDeviceComboBox->addItem(deviceName, device); } } QString cdrdaoDrive = config().get_property("Cdrdao", "drive", "").toString(); int index = cdDeviceComboBox->findData(cdrdaoDrive); if (index >= 0) { cdDeviceComboBox->setCurrentIndex(index); } update_cdburn_status(tr("Information"), NORMAL_MESSAGE); return; } QString sout = m_burnprocess->readAllStandardOutput(); if (sout.simplified().isEmpty()) { return; } if (sout.contains("Disk seems to be written")) { int index = cdDeviceComboBox->currentIndex(); if (index != -1) { #if defined (Q_WS_WIN) // No idea if this works..... QProcess::execute("rsm.exe", QStringList() << "eject" << "/n0"); #else QProcess::execute("eject", QStringList() << cdDeviceComboBox->itemData(index).toString()); #endif } QMessageBox::information( 0, tr("Disc not empty"), tr("Please, insert an empty disc and hit enter"), QMessageBox::Ok); m_burnprocess->write("enter"); return; } if (sout.contains("Inserted disk is not empty and not appendable.")) { QMessageBox::information( 0, tr("Disc not empty"), tr("Inserted disk is not empty, and cannot append data to it!"), QMessageBox::Ok); return; } if (sout.contains("Unit not ready")) { update_cdburn_status(tr("Waiting for CD Writer... (no disk inserted?)"), NORMAL_MESSAGE); progressBar->setMaximum(0); return; } if (sout.contains("Turning BURN-Proof on")) { update_cdburn_status(tr("Turning BURN-Proof on"), NORMAL_MESSAGE); return; } if (sout.contains("Writing track")) { QStringList strlist = sout.split(QRegExp("\\s+")); if (strlist.size() > 3) { QString text = strlist.at(0) + " " + strlist.at(1) + " " + strlist.at(2); update_cdburn_status(text, NORMAL_MESSAGE); } return; } if (sout.contains("%") && sout.contains("(") && sout.contains(")")) { QStringList strlist = sout.split(QRegExp("\\s+")); if (strlist.size() > 7) { int written = strlist.at(1).toInt(); int total = strlist.at(3).toInt(); if (total == 0) { progressBar->setValue(0); } else { if (progressBar->maximum() == 0) { progressBar->setMaximum(100); } int progress = (100 * written) / total; progressBar->setValue(progress); } } return; } // Write out only the unhandled cdrdao lines printf("CD Writing: %s\n", QS_C(sout.trimmed())); } void CDWritingDialog::closeEvent(QCloseEvent * event) { if (m_writingState != NO_STATE) { event->setAccepted(false); return; } QDialog::closeEvent(event); } void CDWritingDialog::reject() { if (m_writingState == NO_STATE) { hide(); } } void CDWritingDialog::export_only_changed(int state) { if (state == Qt::Checked) { burnGroupBox->setEnabled(false); } else { burnGroupBox->setEnabled(true); } } void CDWritingDialog::disable_ui_interaction() { closeButton->setEnabled(false); burnGroupBox->setEnabled(false); startButton->hide(); stopButton->show(); } void CDWritingDialog::enable_ui_interaction() { m_writingState = NO_STATE; burnGroupBox->setDisabled(cdDiskExportOnlyCheckBox->isChecked()); closeButton->setEnabled(true); startButton->show(); stopButton->hide(); stopButton->setEnabled(true); progressBar->setValue(0); } void CDWritingDialog::set_was_closed() { m_wasClosed = true; } QString CDWritingDialog::get_device(int index) { #if defined (Q_WS_MAC) return cdDeviceComboBox->currentText(); #else return cdDeviceComboBox->itemData(index).toString(); #endif } traverso-0.49.4/src/traverso/dialogs/MarkerDialog.cpp000644 001750 001750 00000035052 11163362147 023113 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Remon Sijrier, Nicola Doebelin This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "MarkerDialog.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "Information.h" #include "PCommand.h" MarkerDialog::MarkerDialog(QWidget * parent) : QDialog(parent) { setupUi(this); m_project = pm().get_project(); m_sheet = m_project->get_current_sheet(); setWindowTitle("Marker Editor - Project " + m_project->get_title()); QString mask = "99:99:99,99"; lineEditPosition->setInputMask(mask); markersTreeWidget->header()->resizeSection(1, 100); pushButtonRemove->setAutoDefault(false); pushButtonExport->setAutoDefault(false); pushButtonOk->setAutoDefault(false); // connect other stuff related to the treeWidget connect(lineEditTitle, SIGNAL(textEdited(const QString &)), this, SLOT(description_changed(const QString &))); connect(lineEditPosition, SIGNAL(textEdited(const QString &)), this, SLOT(position_changed(const QString &))); connect(markersTreeWidget, SIGNAL(currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)), this, SLOT(item_changed(QTreeWidgetItem *, QTreeWidgetItem *))); connect(pushButtonRemove, SIGNAL(clicked()), this, SLOT(remove_marker())); // connect the CD-Text widgets (LineEdits and ToolButtons) connect(lineEditPosition, SIGNAL(returnPressed()), this, SLOT(position_enter())); connect(lineEditTitle, SIGNAL(returnPressed()), this, SLOT(title_enter())); connect(lineEditComposer, SIGNAL(returnPressed()), this, SLOT(composer_enter())); connect(lineEditPerformer, SIGNAL(returnPressed()), this, SLOT(performer_enter())); connect(lineEditArranger, SIGNAL(returnPressed()), this, SLOT(arranger_enter())); connect(lineEditMessage, SIGNAL(returnPressed()), this, SLOT(message_enter())); connect(lineEditSongwriter, SIGNAL(returnPressed()), this, SLOT(sheetwriter_enter())); connect(lineEditIsrc, SIGNAL(returnPressed()), this, SLOT(isrc_enter())); connect(toolButtonTitleAll, SIGNAL(clicked()), this, SLOT(title_all())); connect(toolButtonComposerAll, SIGNAL(clicked()), this, SLOT(composer_all())); connect(toolButtonPerformerAll, SIGNAL(clicked()), this, SLOT(performer_all())); connect(toolButtonArrangerAll, SIGNAL(clicked()), this, SLOT(arranger_all())); connect(toolButtonMessageAll, SIGNAL(clicked()), this, SLOT(message_all())); connect(toolButtonSongWriterAll, SIGNAL(clicked()), this, SLOT(songwriter_all())); connect(toolButtonCopyAll, SIGNAL(clicked()), this, SLOT(copy_all())); connect(toolButtonPEmphAll, SIGNAL(clicked()), this, SLOT(pemph_all())); connect(pushButtonExport, SIGNAL(clicked()), this, SLOT(export_toc())); connect(pushButtonOk, SIGNAL(clicked()), this, SLOT(apply())); connect(pushButtonCancel, SIGNAL(clicked()), this, SLOT(cancel())); update_marker_treeview(); } void MarkerDialog::update_marker_treeview() { int currentIndex = markersTreeWidget->indexOfTopLevelItem(markersTreeWidget->currentItem()); // since the treeWidget will be cleared, point m_marker to somewhere else m_marker = (Marker*)0; markersTreeWidget->clear(); TimeLine* tl = m_sheet->get_timeline(); foreach(Marker* marker, tl->get_markers()) { QString name = marker->get_description(); QString pos = timeref_to_cd_including_hours(marker->get_when()); QTreeWidgetItem* item = new QTreeWidgetItem(markersTreeWidget); item->setText(0, pos.simplified()); item->setText(1, name); item->setData(0, Qt::UserRole, marker->get_id()); } if (currentIndex >= markersTreeWidget->topLevelItemCount()) { currentIndex = markersTreeWidget->topLevelItemCount() - 1; } markersTreeWidget->setCurrentItem(markersTreeWidget->topLevelItem(currentIndex)); } void MarkerDialog::item_changed(QTreeWidgetItem * current, QTreeWidgetItem * previous) { if (!current) { m_marker = (Marker*)0; return; } m_marker = get_marker(current->data(0, Qt::UserRole).toLongLong()); if (!m_marker) { return; } if (previous) { Marker *marker = get_marker(previous->data(0, Qt::UserRole).toLongLong()); marker->set_when(cd_to_timeref_including_hours(lineEditPosition->text())); marker->set_description(lineEditTitle->text()); marker->set_performer(lineEditPerformer->text()); marker->set_composer(lineEditComposer->text()); marker->set_songwriter(lineEditSongwriter->text()); marker->set_arranger(lineEditArranger->text()); marker->set_message(lineEditMessage->text()); marker->set_isrc(lineEditIsrc->text()); marker->set_preemphasis(checkBoxPreEmph->isChecked()); marker->set_copyprotect(checkBoxCopy->isChecked()); } lineEditPosition->setText(timeref_to_cd_including_hours(m_marker->get_when())); lineEditTitle->setText(m_marker->get_description()); lineEditPerformer->setText(m_marker->get_performer()); lineEditComposer->setText(m_marker->get_composer()); lineEditSongwriter->setText(m_marker->get_songwriter()); lineEditArranger->setText(m_marker->get_arranger()); lineEditMessage->setText(m_marker->get_message()); lineEditIsrc->setText(m_marker->get_isrc()); checkBoxPreEmph->setChecked(m_marker->get_preemphasis()); checkBoxCopy->setChecked(m_marker->get_copyprotect()); } // update the entry in the tree widget in real time void MarkerDialog::description_changed(const QString &s) { QTreeWidgetItem* item = markersTreeWidget->currentItem(); if (!item || !m_marker) { return; } item->setText(1, s); m_marker->set_description(s); } // update the entry in the tree widget in real time void MarkerDialog::position_changed(const QString &s) { QTreeWidgetItem* item = markersTreeWidget->currentItem(); if (!item || !m_marker) { return; } item->setText(0, s); // AAAH, wouldn't it be sooo fun to have un/redo when // editing the Markers from here ? // But the realtime thing plays not nice, what about only // calling this function when the user hits enter ? // TimeRef newpos = cd_to_timeref(s); // TimeRef oldpos = m_marker->get_when(); // QVariant newv, oldv; // newv.setValue(newpos); // oldv.setValue(oldpos); // PCommand* command = new PCommand(m_marker, "set_when", oldv, newv, tr("Move Marker (from Marker Editor)")); // Command::process_command(command); TimeRef location = cd_to_timeref_including_hours(s); m_marker->set_when(location); markersTreeWidget->sortItems(0, Qt::AscendingOrder); } // find the marker based on it's id. Marker * MarkerDialog::get_marker(qint64 id) { TimeLine* tl = m_sheet->get_timeline(); foreach(Marker* marker, tl->get_markers()) { if (marker->get_id() == id) { return marker; } } return 0; } void MarkerDialog::apply() { accept(); } void MarkerDialog::cancel() { reject(); } // One slot per widget, to avoid using QObject::sender() to determine the sender void MarkerDialog::position_enter() { next_item(lineEditPosition); } void MarkerDialog::title_enter() { next_item(lineEditTitle); } void MarkerDialog::performer_enter() { next_item(lineEditPerformer); } void MarkerDialog::composer_enter() { next_item(lineEditComposer); } void MarkerDialog::arranger_enter() { next_item(lineEditArranger); } void MarkerDialog::sheetwriter_enter() { next_item(lineEditSongwriter); } void MarkerDialog::message_enter() { next_item(lineEditMessage); } void MarkerDialog::isrc_enter() { next_item(lineEditIsrc); } // this handles the case when "enter" is pressed on a lineEdit. It sets the next item current, // and selects the text in the lineEdit void MarkerDialog::next_item(QLineEdit *ledit) { QTreeWidgetItem *pitem = markersTreeWidget->currentItem(); int max = markersTreeWidget->topLevelItemCount(); int idx = markersTreeWidget->indexOfTopLevelItem(pitem); int nidx = 0; if (idx < max-1) { nidx = idx + 1; } QTreeWidgetItem *citem = markersTreeWidget->topLevelItem(nidx); markersTreeWidget->setCurrentItem(citem); ledit->setSelection(0, ledit->text().length()); } void MarkerDialog::title_all() { QString str = lineEditTitle->text(); if (QMessageBox::question(this, tr("Set all Titles"), tr("Do you really want to set all titles to\n\"") +str+"\"?", QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes) == QMessageBox::No) { return; } for (int i = 0; i < markersTreeWidget->topLevelItemCount(); ++i) { QTreeWidgetItem *it = markersTreeWidget->topLevelItem(i); Marker *m = get_marker(it->data(0, Qt::UserRole).toLongLong()); m->set_description(str); it->setText(1, str); } } void MarkerDialog::performer_all() { QString str = lineEditPerformer->text(); if (QMessageBox::question(this, tr("Set all Performers"), tr("Do you really want to set all performers to\n\"") +str+"\"?", QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes) == QMessageBox::No) { return; } for (int i = 0; i < markersTreeWidget->topLevelItemCount(); ++i) { QTreeWidgetItem *it = markersTreeWidget->topLevelItem(i); Marker *m = get_marker(it->data(0, Qt::UserRole).toLongLong()); m->set_performer(str); } } void MarkerDialog::composer_all() { QString str = lineEditComposer->text(); if (QMessageBox::question(this, tr("Set all Composers"), tr("Do you really want to set all composers to\n\"") +str+"\"?", QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes) == QMessageBox::No) { return; } for (int i = 0; i < markersTreeWidget->topLevelItemCount(); ++i) { QTreeWidgetItem *it = markersTreeWidget->topLevelItem(i); Marker *m = get_marker(it->data(0, Qt::UserRole).toLongLong()); m->set_composer(str); } } void MarkerDialog::arranger_all() { QString str = lineEditArranger->text(); if (QMessageBox::question(this, tr("Set all Arrangers"), tr("Do you really want to set all arrangers to\n\"") +str+"\"?", QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes) == QMessageBox::No) { return; } for (int i = 0; i < markersTreeWidget->topLevelItemCount(); ++i) { QTreeWidgetItem *it = markersTreeWidget->topLevelItem(i); Marker *m = get_marker(it->data(0, Qt::UserRole).toLongLong()); m->set_arranger(str); } } void MarkerDialog::songwriter_all() { QString str = lineEditSongwriter->text(); if (QMessageBox::question(this, tr("Set all Songwriters"), tr("Do you really want to set all songwriters to\n\"") +str+"\"?", QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes) == QMessageBox::No) { return; } for (int i = 0; i < markersTreeWidget->topLevelItemCount(); ++i) { QTreeWidgetItem *it = markersTreeWidget->topLevelItem(i); Marker *m = get_marker(it->data(0, Qt::UserRole).toLongLong()); m->set_songwriter(str); } } void MarkerDialog::message_all() { QString str = lineEditMessage->text(); if (QMessageBox::question(this, tr("Set all Messages"), tr("Do you really want to set all messages to\n\"") +str+"\"?", QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes) == QMessageBox::No) { return; } for (int i = 0; i < markersTreeWidget->topLevelItemCount(); ++i) { QTreeWidgetItem *it = markersTreeWidget->topLevelItem(i); Marker *m = get_marker(it->data(0, Qt::UserRole).toLongLong()); m->set_message(str); } } void MarkerDialog::copy_all() { QString str = "off"; if (checkBoxCopy->isChecked()) { str = "on"; } if (QMessageBox::question(this, tr("Set all Copy Protection Flags"), tr("Do you really want to set all copy protection flags to\n\"") +str+"\"?", QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes) == QMessageBox::No) { return; } for (int i = 0; i < markersTreeWidget->topLevelItemCount(); ++i) { QTreeWidgetItem *it = markersTreeWidget->topLevelItem(i); Marker *m = get_marker(it->data(0, Qt::UserRole).toLongLong()); m->set_copyprotect(checkBoxCopy->isChecked()); } } void MarkerDialog::pemph_all() { QString str = "off"; if (checkBoxPreEmph->isChecked()) { str = "on"; } if (QMessageBox::question(this, tr("Set all Pre-Emphasis Flags"), tr("Do you really want to set all pre-emphasis flags to\n\"") +str+"\"?", QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes) == QMessageBox::No) { return; } for (int i = 0; i < markersTreeWidget->topLevelItemCount(); ++i) { QTreeWidgetItem *it = markersTreeWidget->topLevelItem(i); Marker *m = get_marker(it->data(0, Qt::UserRole).toLongLong()); m->set_preemphasis(checkBoxPreEmph->isChecked()); } } void MarkerDialog::remove_marker() { if (!m_marker) { return; } if (m_marker->get_type() == Marker::ENDMARKER) { info().information(tr("It's not possible to remove the endmarker!!")); return; } TimeLine* tl = m_sheet->get_timeline(); AddRemove *ar = (AddRemove*) tl->remove_marker(m_marker); Command::process_command(ar); update_marker_treeview(); } void MarkerDialog::export_toc() { QString fn = QFileDialog::getSaveFileName (0, tr("Export Table of Contents"), m_project->get_root_dir(), tr("HTML File (*.html)")); // if aborted exit here if (fn.isEmpty()) { return; } QFile file(fn); // check if the selected file can be opened for writing if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { printf("Could not open file for writing."); return; } QTextStream out(&file); out << "\n \n \n \n\n \n"; out << "

" << m_project->get_title() << "

\n"; out << "

" << m_project->get_description() << "

\n"; out << "
\n"; out << " \n \n"; TimeLine* tl = m_sheet->get_timeline(); foreach(Marker* marker, tl->get_markers()) { QString name = marker->get_description(); QString pos = timeref_to_cd(marker->get_when()); out << " \n \n"; } QDateTime dt = QDateTime::currentDateTime(); out << "
Position (mm:ss:frames)Title
" << pos << "" << name << "
\n
\n " << dt.toString("MMM dd, yyyy, hh:mm") << "\n\n\n"; } //eof traverso-0.49.4/src/traverso/dialogs/BusSelectorDialog.h000644 001750 001750 00000002423 11163362147 023565 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef BUS_SELECTOR_DIALOG_H #define BUS_SELECTOR_DIALOG_H #include "ui_BusSelectorDialog.h" #include class Track; class BusSelectorDialog : public QDialog, protected Ui::BusSelectorDialog { Q_OBJECT public: BusSelectorDialog(QWidget* parent = 0); ~BusSelectorDialog() {}; void set_current_track(Track* track); private: Track* m_currentTrack; void accept(); void reject(); private slots: void current_track_changed(int); void update_buses_list_widget(); }; #endif traverso-0.49.4/src/traverso/dialogs/RestoreProjectBackupDialog.h000644 001750 001750 00000002461 11163362147 025435 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef RESTORE_PROJECT_BACKUP_DIALOG_H #define RESTORE_PROJECT_BACKUP_DIALOG_H #include "ui_RestoreProjectBackupDialog.h" #include class Project; class RestoreProjectBackupDialog : public QDialog, protected Ui::RestoreProjectBackupDialog { Q_OBJECT public: RestoreProjectBackupDialog(QWidget* parent = 0); ~RestoreProjectBackupDialog() {}; void set_project_name(const QString& projectname); private: QString m_projectname; void accept(); void reject(); void populate_treeview(); }; #endif //eof traverso-0.49.4/src/traverso/dialogs/BusSelectorDialog.cpp000644 001750 001750 00000012222 11163362147 024116 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "BusSelectorDialog.h" #include #include #include #include #include #include BusSelectorDialog::BusSelectorDialog(QWidget* parent) : QDialog(parent) , m_currentTrack(0) { setupUi(this); playbackBusesGroupBox->hide(); resize(300, 200); update_buses_list_widget(); buttonBox->button(QDialogButtonBox::Ok)->setDefault(true); connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept())); connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())); connect(trackComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(current_track_changed(int))); connect(&audiodevice(), SIGNAL(driverParamsChanged()), this, SLOT(update_buses_list_widget())); } void BusSelectorDialog::update_buses_list_widget() { busesListWidget->clear(); QStringList names = audiodevice().get_capture_buses_names(); foreach(QString name, names) { QListWidgetItem* item = new QListWidgetItem(busesListWidget); item->setText(name); } busesListWidgetPlayback->clear(); names.clear(); names << audiodevice().get_playback_buses_names(); foreach(QString name, names) { QListWidgetItem* item = new QListWidgetItem(busesListWidgetPlayback); item->setText(name); } } void BusSelectorDialog::current_track_changed(int index) { if (index == -1) { return; } QList selectedlist = busesListWidget->selectedItems(); if (selectedlist.size()) { selectedlist.at(0)->setSelected(false); } qint64 id = trackComboBox->itemData(index).toLongLong(); Sheet* sheet = pm().get_project()->get_current_sheet(); m_currentTrack = sheet->get_track(id); QList list = busesListWidget->findItems(m_currentTrack->get_bus_in(), Qt::MatchExactly); if (list.size()) { QListWidgetItem* item = list.at(0); item->setSelected(true); if (m_currentTrack->capture_left_channel() && m_currentTrack->capture_right_channel()) { radioBoth->setChecked(true); } else if (m_currentTrack->capture_left_channel()) { radioLeftOnly->setChecked(true); } else { radioRightOnly->setChecked(true); } } selectedlist = busesListWidgetPlayback->selectedItems(); if (selectedlist.size()) { selectedlist.at(0)->setSelected(false); } list = busesListWidgetPlayback->findItems(m_currentTrack->get_bus_out(), Qt::MatchExactly); if (list.size()) { QListWidgetItem* item = list.at(0); item->setSelected(true); /* if (m_currentTrack->playback_left_channel() && m_currentTrack->playback_right_channel()) { radioBothPlayback->setChecked(true); } else if (m_currentTrack->playback_left_channel()) { radioLeftOnlyPlayback->setChecked(true); } else { radioRightOnlyPlayback->setChecked(true); } */ } } void BusSelectorDialog::accept() { Q_ASSERT(m_currentTrack); QList list = busesListWidget->selectedItems(); if (list.size()) { m_currentTrack->set_bus_in(list.at(0)->text().toAscii()); if (radioBoth->isChecked()) { m_currentTrack->set_capture_left_channel(true); m_currentTrack->set_capture_right_channel(true); } else if (radioLeftOnly->isChecked()) { m_currentTrack->set_capture_left_channel(true); m_currentTrack->set_capture_right_channel(false); } else { m_currentTrack->set_capture_left_channel(false); m_currentTrack->set_capture_right_channel(true); } } list = busesListWidgetPlayback->selectedItems(); if (list.size()) { m_currentTrack->set_bus_out(list.at(0)->text().toAscii()); /* if (radioBothPlayback->isChecked()) { m_currentTrack->set_playback_left_channel(true); m_currentTrack->set_playback_right_channel(true); } else if (radioLeftOnlyPlayback->isChecked()) { m_currentTrack->set_playback_left_channel(true); m_currentTrack->set_playback_right_channel(false); } else { m_currentTrack->set_playback_left_channel(false); m_currentTrack->set_playback_right_channel(true); }*/ } hide(); } void BusSelectorDialog::reject() { hide(); } void BusSelectorDialog::set_current_track(Track * track) { trackComboBox->clear(); Sheet* sheet = pm().get_project()->get_current_sheet(); foreach(Track* track, sheet->get_tracks()) { QString fulltitle = QString::number(track->get_sort_index() + 1) + " " + track->get_name(); trackComboBox->addItem(fulltitle, track->get_id()); } int index = trackComboBox->findData(track->get_id()); trackComboBox->setCurrentIndex(index); } //eof traverso-0.49.4/src/traverso/dialogs/PluginSelectorDialog.cpp000644 001750 001750 00000007236 12357216457 024644 0ustar00remonremon000000 000000 /* Copyright (C) 2006-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "PluginSelectorDialog.h" #include #if defined (LV2_SUPPORT) #include #endif #include "Interface.h" #include #include #include #include // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" PluginSelectorDialog* PluginSelectorDialog::m_instance = 0; PluginSelectorDialog::PluginSelectorDialog(QWidget* parent) : QDialog(parent) { setupUi(this); pluginTreeWidget->header()->resizeSection(0, 250); pluginTreeWidget->header()->setResizeMode(1, QHeaderView::ResizeToContents); pluginTreeWidget->header()->resizeSection(2, 60); #if defined (LV2_SUPPORT) printf("Getting the list of found lv2 plugins from the PluginManager\n"); const LilvPlugins* pluginList = PluginManager::instance()->get_lilv_plugins(); QMap pluginsMap; printf("Number of found lv2 plugins: %d\n", lilv_plugins_size(pluginList)); LILV_FOREACH(plugins, i, pluginList) { const LilvPlugin* p = lilv_plugins_get(pluginList, i); PluginInfo pinfo = LV2Plugin::get_plugin_info(p); pluginsMap.insertMulti(pinfo.type, pinfo); } foreach(PluginInfo pinfo, pluginsMap) { if ( (pinfo.audioPortInCount == 1 && pinfo.audioPortOutCount == 1) || (pinfo.audioPortInCount == 2 && pinfo.audioPortOutCount == 2) ) { QString inoutcount = pinfo.audioPortInCount == 1 ? "Mono" : "Stereo"; QTreeWidgetItem* item = new QTreeWidgetItem(pluginTreeWidget); item->setText(0, pinfo.name); item->setText(1, pinfo.type.remove("Plugin")); item->setText(2, inoutcount); item->setData(0, Qt::UserRole, QString(pinfo.uri)); item->setToolTip(0, pinfo.name); } } #endif connect(pluginTreeWidget, SIGNAL(itemDoubleClicked(QTreeWidgetItem*, int)), this, SLOT(plugin_double_clicked())); } PluginSelectorDialog::~PluginSelectorDialog( ) {} void PluginSelectorDialog::on_cancelButton_clicked( ) { reject(); } void PluginSelectorDialog::on_okButton_clicked( ) { Plugin* plugin = 0; #if defined (LV2_SUPPORT) QList list = pluginTreeWidget->selectedItems(); if ( ! list.size()) { printf("No plugin selected\n"); reject(); return; } QTreeWidgetItem* item = list.first(); QString uri = item->data(0, Qt::UserRole).toString(); plugin = PluginManager::instance()->create_lv2_plugin(uri); #endif if (!plugin) { reject(); } m_plugin = plugin; accept(); } void PluginSelectorDialog::plugin_double_clicked() { on_okButton_clicked(); } PluginSelectorDialog* PluginSelectorDialog::instance() { if (m_instance == 0) { m_instance = new PluginSelectorDialog(Interface::instance()); } return m_instance; } Plugin* PluginSelectorDialog::get_selected_plugin( ) { Plugin* plugin = m_plugin; m_plugin = 0; return plugin; } void PluginSelectorDialog::set_description(const QString & des) { objectToAddPluginTooLabel->setText(des); } traverso-0.49.4/src/traverso/dialogs/RestoreProjectBackupDialog.cpp000644 001750 001750 00000005007 11163362147 025767 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "RestoreProjectBackupDialog.h" #include "ProjectManager.h" #include #include #include "Information.h" RestoreProjectBackupDialog::RestoreProjectBackupDialog(QWidget * parent) : QDialog(parent) { setupUi(this); } void RestoreProjectBackupDialog::accept() { QTreeWidgetItem* item = dateTreeWidget->currentItem(); if (!item) { reject(); return; } uint restoretime = item->data(0, Qt::UserRole).toUInt(); int sucess = pm().restore_project_from_backup(m_projectname, restoretime); if (sucess) { pm().load_project(m_projectname); info().information(tr("Succesfully restored backup from %1").arg(QDateTime::fromTime_t(restoretime).toString())); hide(); } } void RestoreProjectBackupDialog::reject() { hide(); } void RestoreProjectBackupDialog::populate_treeview() { dateTreeWidget->clear(); currentDateLable->setText(QDateTime::currentDateTime ().toString("dd-MM-yy hh:mm:ss")); QList list = pm().get_backup_date_times(m_projectname); qSort(list.begin(), list.end(), qGreater()); QDateTime datetime; foreach(uint time, list) { QTreeWidgetItem* item = new QTreeWidgetItem(dateTreeWidget); datetime.setTime_t(time); item->setText(0, datetime.toString("dd-MM-yy")); item->setText(1, datetime.toString("hh:mm:ss")); item->setData(0, Qt::UserRole, time); } if (list.size()) { QTreeWidgetItem* item = dateTreeWidget->invisibleRootItem()->child(0); dateTreeWidget->setCurrentItem(item); lastBackupLable->setText(item->text(0) + " " + item->text(1)); } else { lastBackupLable->setText(tr("No backup(s) available!")); } } void RestoreProjectBackupDialog::set_project_name(const QString & projectname) { m_projectname = projectname; populate_treeview(); } traverso-0.49.4/src/traverso/dialogs/InsertSilenceDialog.h000644 001750 001750 00000002330 11163362147 024077 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef INSERT_SILENCE_DIALOG_H #define INSERT_SILENCE_DIALOG_H #include "ui_InsertSilenceDialog.h" #include class Track; class InsertSilenceDialog : public QDialog, protected Ui::InsertSilenceDialog { Q_OBJECT public: InsertSilenceDialog(QWidget* parent = 0); ~InsertSilenceDialog() {}; void setTrack(Track* track); void focusInput(); private: void accept(); void reject(); Track* m_track; }; #endif //eof traverso-0.49.4/src/traverso/dialogs/CDWritingDialog.h000644 001750 001750 00000004504 11163362147 023167 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef CD_WRITING_DIALOG_H #define CD_WRITING_DIALOG_H #include "ui_CDWritingDialog.h" #include #include #include class Project; class Sheet; struct ExportSpecification; class QProcess; class CDWritingDialog : public QDialog, protected Ui::CDWritingDialog { Q_OBJECT public: CDWritingDialog(QWidget* parent = 0); ~CDWritingDialog(); void set_was_closed(); protected: void closeEvent(QCloseEvent* event); private: Project* m_project; QProcess* m_burnprocess; ExportSpecification* m_exportSpec; void show_progress_view(); bool is_safe_to_export(); void cd_render(); void write_to_cd(); void disable_ui_interaction(); void enable_ui_interaction(); void update_cdburn_status(const QString& message, int type); void unlock_device(); enum { NO_STATE, RENDER, BURNING, ABORT_BURN, QUERY_DEVICE, UNLOCK_DEVICE, NORMAL_MESSAGE, ERROR_MESSAGE }; int m_writingState; int m_lastSheetExported; bool m_wasClosed; bool m_wodimAvailable; int m_copyNumber; QString get_device(int index); private slots: void set_project(Project* project); void on_stopButton_clicked(); void export_only_changed(int state); void start_burn_process(); void stop_burn_process(); void read_standard_output(); void cdrdao_process_started(); void cdrdao_process_finished(int exitcode, QProcess::ExitStatus exitstatus); void cd_export_finished(); void cd_export_progress(int progress); void query_devices(); void reject(); }; #endif //eof traverso-0.49.4/src/traverso/widgets/000755 001750 001750 00000000000 11163362200 020053 5ustar00remonremon000000 000000 traverso-0.49.4/src/traverso/widgets/MessageWidget.h000644 001750 001750 00000003254 11163362147 022772 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef MESSAGEWIDGET_H #define MESSAGEWIDGET_H #include #include #include #include "Information.h" class QPushButton; class QTextBrowser; class QDialog; class MessageWidgetPrivate : public QWidget { Q_OBJECT public: MessageWidgetPrivate(QWidget* parent = 0); public slots: void queue_message(InfoStruct ); void dequeue_messagequeue(); void show_history(); protected: void resizeEvent( QResizeEvent* e); void paintEvent( QPaintEvent* e); QSize sizeHint() const; private: QTimer m_messageTimer; QQueue m_messageQueue; InfoStruct m_infoStruct; QTextBrowser* m_log; QDialog* m_logDialog; QString m_stringLog; void log(InfoStruct infostruct); }; class MessageWidget : public QWidget { public: MessageWidget(QWidget* parent = 0); protected: QSize sizeHint() const; private: QPushButton* m_button; }; #endif //eof traverso-0.49.4/src/traverso/widgets/InfoWidgets.h000644 001750 001750 00000007142 11163362147 022464 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2008 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef RESOURCES_INFO_WIDGET_H #define RESOURCES_INFO_WIDGET_H #include #include #include #include class Project; class Sheet; class MessageWidget; class SystemValueBar; class QPushButton; class InfoWidget : public QFrame { Q_OBJECT public: InfoWidget(QWidget* parent = 0); protected: Sheet* m_sheet; Project* m_project; virtual QSize sizeHint() const {return QSize(size());} private: friend class InfoToolBar; protected slots: virtual void set_sheet(Sheet* ); virtual void set_project(Project* ); }; class SystemResources : public InfoWidget { Q_OBJECT public: SystemResources(QWidget* parent = 0); protected: QSize sizeHint () const; private: QTimer m_updateTimer; SystemValueBar* m_readBufferStatus; SystemValueBar* m_writeBufferStatus; SystemValueBar* m_cpuUsage; QPushButton* m_icon; friend class SysInfoToolBar; private slots: void update_status(); }; class DriverInfo : public InfoWidget { Q_OBJECT public: DriverInfo(QWidget* parent = 0); ~DriverInfo() {}; protected: QSize sizeHint () const; void enterEvent ( QEvent * event ); void leaveEvent ( QEvent * event ); private: QTimer updateTimer; QPushButton* m_driver; int xrunCount; void draw_information(); private slots: void update_driver_info(); void update_xrun_info(); void show_driver_config_dialog(); }; class HDDSpaceInfo : public InfoWidget { Q_OBJECT public: HDDSpaceInfo(QWidget* parent = 0); ~HDDSpaceInfo(){}; protected: QSize sizeHint() const; private: QTimer updateTimer; QPushButton* m_button; private slots: void set_sheet(Sheet* ); private slots: void update_status(); void sheet_started(); void sheet_stopped(); }; class SysInfoToolBar : public QToolBar { public: SysInfoToolBar(QWidget* parent); private: SystemResources* resourcesInfo; HDDSpaceInfo* hddInfo; MessageWidget* message; DriverInfo* driverInfo; }; class SystemValueBar : public QWidget { Q_OBJECT public: SystemValueBar(QWidget* parent); void set_value(float value); void set_range(float min, float max); void set_text(const QString& text); void set_int_rounding(bool rounding); void add_range_color(float x0, float x1, QColor color); protected: void paintEvent( QPaintEvent* e); QSize sizeHint () const; private: struct RangeColor { float x0; float x1; QColor color; }; QList m_rangecolors; QString m_text; float m_min; float m_max; float m_current; bool m_introunding; }; class ProgressToolBar : public QToolBar { Q_OBJECT public: ProgressToolBar(QWidget* parent); ~ProgressToolBar(); public slots: void set_progress(int); void set_label(QString); void set_num_files(int); private: QProgressBar* m_progressBar; int filecount; int filenum; }; #endif //eof traverso-0.49.4/src/traverso/widgets/BusMonitor.cpp000644 001750 001750 00000010157 11163362147 022676 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2008 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "BusMonitor.h" #include "VUMeter.h" #include #include #include #include #include #include #include #include #include // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" BusMonitor::BusMonitor(QWidget* parent) : QWidget( parent) { PENTERCONS; setAutoFillBackground(false); create_vu_meters(); m_menu = 0; connect(&audiodevice(), SIGNAL(driverParamsChanged()), this, SLOT(create_vu_meters())); connect(&pm(), SIGNAL(projectLoaded(Project*)), this, SLOT(set_project(Project*))); } BusMonitor::~BusMonitor() { PENTERDES; } QSize BusMonitor::sizeHint() const { int width = 0; foreach(QWidget* widget, outMeters) { if (! widget->isHidden()) { width += widget->width(); } } return QSize(width, 140); } QSize BusMonitor::minimumSizeHint() const { return QSize(50, 50); } void BusMonitor::create_vu_meters( ) { PENTER; QLayout* lay = layout(); if (lay) delete lay; QHBoxLayout* layout = new QHBoxLayout(this); layout->setMargin(0); setLayout(layout); while( ! inMeters.isEmpty() ) { VUMeter* meter = inMeters.takeFirst(); layout->removeWidget( meter ); delete meter; } while ( ! outMeters.isEmpty() ) { VUMeter* meter = outMeters.takeFirst(); layout->removeWidget( meter ); delete meter; } layout->addStretch(1); QStringList list = audiodevice().get_capture_buses_names(); foreach(QString name, list) { AudioBus* bus = audiodevice().get_capture_bus(name.toAscii()); VUMeter* meter = new VUMeter( this, bus ); connect(bus, SIGNAL(monitoringPeaksStarted()), meter, SLOT(peak_monitoring_started())); connect(bus, SIGNAL(monitoringPeaksStopped()), meter, SLOT(peak_monitoring_stopped())); layout->addWidget(meter); inMeters.append(meter); meter->hide(); } list = audiodevice().get_playback_buses_names(); if (list.size()) { VUMeter* meter = new VUMeter( this, audiodevice().get_playback_bus(list.at(0).toAscii()) ); layout->addWidget(meter); outMeters.append(meter); } layout->addSpacing(4); } void BusMonitor::set_project(Project * project) { Q_UNUSED(project); QStringList list = audiodevice().get_capture_buses_names(); foreach(QString name, list) { AudioBus* bus = audiodevice().get_capture_bus(name.toAscii()); bus->reset_monitor_peaks(); } } void BusMonitor::keyPressEvent(QKeyEvent * event) { if (event->isAutoRepeat()) { return; } else if (event->key() == Qt::Key_R) { reset_vu_meters(); } else { QWidget::keyPressEvent(event); } } void BusMonitor::mousePressEvent(QMouseEvent * event) { if (event->button() == Qt::RightButton) { show_menu(); } } void BusMonitor::reset_vu_meters() { foreach(VUMeter* meter, inMeters) { meter->reset(); } foreach(VUMeter* meter, outMeters) { meter->reset(); } } void BusMonitor::show_menu() { if (!m_menu) { m_menu = new QMenu(this); QAction* action = m_menu->addAction("Bus Monitor"); QFont font(themer()->get_font("ContextMenu:fontscale:actions")); font.setBold(true); action->setFont(font); action->setEnabled(false); m_menu->addSeparator(); action = m_menu->addAction("Reset VU's < R >"); connect(action, SIGNAL(triggered(bool)), this, SLOT(reset_vu_meters())); } m_menu->exec(QCursor::pos()); } void BusMonitor::enterEvent(QEvent *) { setFocus(); } traverso-0.49.4/src/traverso/widgets/InfoWidgets.cpp000644 001750 001750 00000032620 11163362147 023016 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2008 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "InfoWidgets.h" #include "AudioDevice.h" #include "Config.h" #include "DiskIO.h" #include "Interface.h" #include "MessageWidget.h" #include "Project.h" #include "ProjectManager.h" #include "Sheet.h" #include "Themer.h" #include "Track.h" #include "Utils.h" #include #include #include #include #include #include #if defined (Q_WS_WIN) #include #elif defined (Q_WS_MAC) #include #include #else #if defined(HAVE_SYS_VFS_H) #include #endif #endif // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" #if defined (Q_WS_MAC) static const int SONG_TOOLBAR_HEIGHT = 27; #else static const int SONG_TOOLBAR_HEIGHT = 24; #endif SystemResources::SystemResources(QWidget * parent) : InfoWidget(parent) { m_writeBufferStatus = new SystemValueBar(this); m_readBufferStatus = new SystemValueBar(this); m_readBufferStatus->setToolTip(tr("Read Buffer Status")); m_writeBufferStatus->setToolTip(tr("Write Buffer Status")); m_cpuUsage = new SystemValueBar(this); m_icon = new QPushButton(); m_icon->setIcon(find_pixmap(":/memorysmall")); m_icon->setFlat(true); m_icon->setMaximumWidth(20); m_icon->setFocusPolicy(Qt::NoFocus); m_writeBufferStatus->set_range(0, 100); m_writeBufferStatus->add_range_color(0, 40, QColor(255, 0, 0)); m_writeBufferStatus->add_range_color(40, 60, QColor(255, 255, 0)); m_writeBufferStatus->add_range_color(60, 100, QColor(227, 254, 227)); m_writeBufferStatus->setMinimumWidth(60); m_readBufferStatus->set_range(0, 100); m_readBufferStatus->add_range_color(0, 40, QColor(255, 0, 0)); m_readBufferStatus->add_range_color(40, 60, QColor(255, 255, 0)); m_readBufferStatus->add_range_color(60, 100, QColor(227, 254, 227)); m_readBufferStatus->setMinimumWidth(60); m_cpuUsage->set_range(0, 100); m_cpuUsage->set_int_rounding(false); m_cpuUsage->setMinimumWidth(90); m_cpuUsage->add_range_color(0, 60, QColor(227, 254, 227)); m_cpuUsage->add_range_color(60, 75, QColor(255, 255, 0)); m_cpuUsage->add_range_color(75, 100, QColor(255, 0, 0)); m_readBufferStatus->set_text("R"); m_writeBufferStatus->set_text("W"); m_cpuUsage->set_text("CPU"); QHBoxLayout* lay = new QHBoxLayout(this); lay->addSpacing(6); lay->addWidget(m_readBufferStatus); lay->addWidget(m_icon); lay->addWidget(m_writeBufferStatus); lay->addWidget(m_cpuUsage); lay->setMargin(0); lay->addSpacing(6); setLayout(lay); setFrameStyle(QFrame::NoFrame); connect(&m_updateTimer, SIGNAL(timeout()), this, SLOT(update_status())); update_status(); m_updateTimer.start(1200); } void SystemResources::update_status( ) { float time = audiodevice().get_cpu_time(); int bufReadStatus = 100; int bufWriteStatus = 100; if (m_project) { foreach(Sheet* sheet, m_project->get_sheets() ) { bufReadStatus = std::min(sheet->get_diskio()->get_read_buffers_fill_status(), bufReadStatus); bufWriteStatus = std::min(sheet->get_diskio()->get_write_buffers_fill_status(), bufWriteStatus); time += sheet->get_diskio()->get_cpu_time(); } } m_readBufferStatus->set_value(bufReadStatus); m_writeBufferStatus->set_value(bufWriteStatus); m_cpuUsage->set_value(time); } QSize SystemResources::sizeHint() const { return QSize(250, SONG_TOOLBAR_HEIGHT); } DriverInfo::DriverInfo( QWidget * parent ) : InfoWidget(parent) { m_driver = new QPushButton(); m_driver->setIcon(find_pixmap(":/driver")); m_driver->setToolTip(tr("Change Audio Device settings")); m_driver->setFlat(true); m_driver->setFocusPolicy(Qt::NoFocus); QHBoxLayout* lay = new QHBoxLayout(this); lay->addWidget(m_driver); lay->setMargin(0); setLayout(lay); setFrameStyle(QFrame::NoFrame); connect(&audiodevice(), SIGNAL(driverParamsChanged()), this, SLOT(update_driver_info())); connect(&audiodevice(), SIGNAL(bufferUnderRun()), this, SLOT(update_xrun_info())); connect(m_driver, SIGNAL(clicked( bool )), this, SLOT(show_driver_config_dialog())); update_driver_info(); } void DriverInfo::update_driver_info( ) { xrunCount = 0; draw_information(); } void DriverInfo::draw_information( ) { QString text; QString latency = QString::number( ( (float) (audiodevice().get_buffer_size() * 2) / audiodevice().get_sample_rate() ) * 1000, 'f', 2 ).append(" ms "); QByteArray xruns; if (xrunCount) { xruns = QByteArray::number(xrunCount).prepend(" xruns "); } text = audiodevice().get_driver_type() + " " + QString::number(audiodevice().get_sample_rate()) + "/" + QString::number(audiodevice().get_bit_depth()) + " @ " + latency + xruns; m_driver->setText(text); updateGeometry(); } void DriverInfo::update_xrun_info( ) { xrunCount++; draw_information(); } QSize DriverInfo::sizeHint() const { return QSize(m_driver->width(), SONG_TOOLBAR_HEIGHT); } void DriverInfo::enterEvent(QEvent * event) { m_driver->setFlat(false); } void DriverInfo::leaveEvent(QEvent * event) { m_driver->setFlat(true); } void DriverInfo::show_driver_config_dialog( ) { Interface::instance()->show_settings_dialog_sound_system_page(); } HDDSpaceInfo::HDDSpaceInfo(QWidget* parent ) : InfoWidget(parent) { m_button = new QPushButton; m_button->setIcon(find_pixmap(":/harddrivesmall")); m_button->setFlat(true); m_button->setFocusPolicy(Qt::NoFocus); m_button->setEnabled(false); QHBoxLayout* lay = new QHBoxLayout; lay->setMargin(0); lay->addWidget(m_button); setLayout(lay); setFrameStyle(QFrame::NoFrame); connect(&updateTimer, SIGNAL(timeout()), this, SLOT(update_status())); update_status(); updateTimer.start(20000); } void HDDSpaceInfo::set_sheet(Sheet* sheet) { m_sheet = sheet; if (! m_sheet) { updateTimer.start(20000); return; } update_status(); connect(m_sheet, SIGNAL(transportStopped()), this, SLOT(sheet_stopped())); connect(m_sheet, SIGNAL(transportStarted()), this, SLOT(sheet_started())); } void HDDSpaceInfo::sheet_started() { updateTimer.start(5000); m_button->setEnabled(true); update_status(); } void HDDSpaceInfo::sheet_stopped() { updateTimer.start(60000); m_button->setEnabled(false); update_status(); } void HDDSpaceInfo::update_status( ) { if (!m_project) { m_button->setText("No Info"); return; } double space = 0.0; #if defined (Q_WS_WIN) __int64 freebytestocaller, totalbytes, freebytes; if (! GetDiskFreeSpaceEx ((const CHAR*)(QS_C(m_project->get_root_dir())), (PULARGE_INTEGER)&freebytestocaller, (PULARGE_INTEGER)&totalbytes, (PULARGE_INTEGER)&freebytes)) { // info().warning("HHDSpaceInfo: " + QString().sprintf("error: %lu", GetLastError())); m_button->setText("No Info"); return; } space = double(freebytestocaller / (1 << 20)); #else #if !defined(HAVE_SYS_VFS_H) m_button->setText("No Info"); return; #else struct statfs fs; statfs(QS_C(m_project->get_root_dir()), &fs); space = floor (fs.f_bavail * (fs.f_bsize / 1048576.0)); #endif #endif QList recordingSheets; foreach(Sheet* sheet, m_project->get_sheets()) { if (sheet->is_recording() && sheet->any_track_armed()) { recordingSheets.append(sheet); } } QString text; if (recordingSheets.size()) { int recChannelCount = 0; foreach(Sheet* sheet, recordingSheets) { foreach(Track* track, sheet->get_tracks()) { if (track->armed()) { recChannelCount += track->capture_left_channel() ? 1 : 0; recChannelCount += track->capture_right_channel() ? 1 : 0; } } } uint rate = audiodevice().get_sample_rate(); double availabletime = (double(UNIVERSAL_SAMPLE_RATE) / rate) * space * 1048576.0; availabletime /= double(sizeof(float) * recChannelCount); QString recordFormat = config().get_property("Recording", "FileFormat", "wav").toString(); // I think a compression ratio of 40 % with wavpack is a safe estimation // and 50% with skipwvx... if (recordFormat == "wavpack") { QString skipwvx = config().get_property("Recording", "WavpackSkipWVX", "false").toString(); if (skipwvx == "true") { availabletime = qint64(availabletime / 0.5); } else { availabletime = qint64(availabletime / 0.6); } } TimeRef time(availabletime); text = timeref_to_hms(time); if (text < "00:30:00") { QPalette pal; pal.setColor(QPalette::ButtonText, QColor(Qt::red)); m_button->setPalette(pal); } } else { if (space > 9216) { text.setNum((space/1024), 'f', 2); text.append(" GB"); } else { text.setNum(space, 'f', 0); text.append(" MB"); } } m_button->setText(text); } QSize HDDSpaceInfo::sizeHint() const { return QSize(90, SONG_TOOLBAR_HEIGHT); } InfoWidget::InfoWidget(QWidget* parent) : QFrame(parent) , m_sheet(0) , m_project(0) { setFrameStyle(QFrame::StyledPanel | QFrame::Sunken); connect(&pm(), SIGNAL(projectLoaded(Project*)), this, SLOT(set_project(Project*))); setFocusPolicy(Qt::NoFocus); } void InfoWidget::set_project(Project* project ) { m_project = project; if (m_project) { connect(m_project, SIGNAL(currentSheetChanged(Sheet*)), this, SLOT(set_sheet(Sheet*))); } else { set_sheet(0); } } void InfoWidget::set_sheet(Sheet* sheet) { m_sheet = sheet; } SysInfoToolBar::SysInfoToolBar(QWidget * parent) : QToolBar(parent) { setObjectName(tr("System Information")); message = new MessageWidget(this); resourcesInfo = new SystemResources(this); hddInfo = new HDDSpaceInfo(this); driverInfo = new DriverInfo(this); setMovable(false); QAction* action; action = addWidget(driverInfo); action->setVisible(true); addSeparator(); action = addWidget(resourcesInfo); action->setVisible(true); addSeparator(); action = addWidget(hddInfo); action->setVisible(true); addSeparator(); action = addWidget(message); action->setVisible(true); } SystemValueBar::SystemValueBar(QWidget * parent) : QWidget(parent) { m_current = m_min = m_max = 0; m_text = ""; m_introunding = true; } void SystemValueBar::set_value(float value) { if (m_current == value) { return; } m_current = value; if (m_current > m_max) { m_current = m_max; } if (m_current < m_min) { m_current = m_min; } update(); } void SystemValueBar::set_range(float min, float max) { m_min = min; m_max = max; update(); } void SystemValueBar::set_text(const QString & text) { m_text = text; } void SystemValueBar::paintEvent(QPaintEvent* ) { QPainter painter(this); painter.setRenderHints(QPainter::Antialiasing); QColor color = QColor(227, 254, 227); for (int i=0; i= range.x0) { color = range.color; break; } } QRect rect = QRect(0, (height() - 15) / 2, width(), 15); painter.drawRect(rect); painter.setBrush(color); painter.setPen(Qt::NoPen); float scalefactor = width() / m_max; rect = QRect(1, (height() - 15) / 2 + 1, width() - 2 - (int)(scalefactor* (m_max - m_current)), 13); painter.drawRect(rect); painter.setPen(Qt::black); painter.setFont(themer()->get_font("InfoWidget:fontscale:values")); if (m_introunding) { painter.drawText(0, 0, width(), height(), Qt::AlignCenter, m_text + " " + QString::number((int)m_current).append("%")); } else { painter.drawText(0, 0, width(), height(), Qt::AlignCenter, m_text + " " + QString::number(m_current, 'f', 2).append("%")); } } QSize SystemValueBar::sizeHint() const { return QSize(60, 25); } void SystemValueBar::set_int_rounding(bool rounding) { m_introunding = rounding; } void SystemValueBar::add_range_color(float x0, float x1, QColor color) { RangeColor range; range.x0 = x0; range.x1 = x1; range.color = color; m_rangecolors.append(range); } ProgressToolBar::ProgressToolBar(QWidget* parent) : QToolBar(tr("Progress Toolbar"), parent) { m_progressBar = new QProgressBar(this); m_progressBar->setMinimumWidth(800); addWidget(m_progressBar); m_progressBar->setEnabled(false); filecount = 1; filenum = 1; QString style = "QProgressBar {border: 2px solid grey;border-radius: 5px; height: 10px; width 300px; text-align: center;}" "QProgressBar::chunk {background-color: qlineargradient(x1: 0, y1: 0, x2: 1.0, y2: 1.0,stop: 0 white, stop: 1 navy);}"; m_progressBar->setStyleSheet(style); } ProgressToolBar::~ProgressToolBar() { } void ProgressToolBar::set_progress(int i) { if (i == m_progressBar->maximum()) { if (filenum == filecount) { hide(); m_progressBar->reset(); m_progressBar->setEnabled(false); return; } else { ++filenum; } } if (!m_progressBar->isEnabled()) { m_progressBar->setEnabled(true); show(); } m_progressBar->setValue(i); } void ProgressToolBar::set_label(QString s) { Q_UNUSED(s); m_progressBar->setFormat(tr("Importing file %1 of %2: %p%").arg(filenum).arg(filecount)); } void ProgressToolBar::set_num_files(int i) { filecount = i; filenum = 1; } //eof traverso-0.49.4/src/traverso/widgets/MessageWidget.cpp000644 001750 001750 00000014121 11163362147 023320 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "MessageWidget.h" #include #include #include #include #include #include #include #include "Themer.h" #include // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" MessageWidget::MessageWidget( QWidget * parent ) : QWidget(parent) { QHBoxLayout* lay = new QHBoxLayout; lay->setMargin(1); m_button = new QPushButton; m_button->setIcon(style()->standardIcon(QStyle::SP_MessageBoxInformation).pixmap(14, 14)); m_button->setMaximumHeight(20); m_button->setFocusPolicy(Qt::NoFocus); MessageWidgetPrivate* message = new MessageWidgetPrivate(this); lay->addSpacing(6); lay->addWidget(message); lay->addWidget(m_button); lay->addSpacing(6); setLayout(lay); connect(m_button, SIGNAL(clicked( bool )), message, SLOT(show_history())); } QSize MessageWidget::sizeHint() const { return QSize(300, 20); } MessageWidgetPrivate::MessageWidgetPrivate( QWidget * parent ) : QWidget(parent) { QHBoxLayout* lay = new QHBoxLayout; lay->addStretch(5); setLayout(lay); m_log = 0; connect(&info(), SIGNAL(message(InfoStruct)), this, SLOT(queue_message(InfoStruct))); connect(&m_messageTimer, SIGNAL(timeout()), this, SLOT(dequeue_messagequeue())); } void MessageWidgetPrivate::paintEvent(QPaintEvent* ) { QPainter painter(this); if (m_infoStruct.message.isEmpty() ) { // painter.fillRect(0, 0, width(), height(), themer()->get_color("InfoWidget:background") ); return; } QPixmap pm; switch(m_infoStruct.type) { case INFO : pm = style()->standardIcon(QStyle::SP_MessageBoxInformation).pixmap(16, 16); painter.fillRect(0, 0, width(), height(), QColor("#F4FFF4")); break; case WARNING : pm = style()->standardIcon(QStyle::SP_MessageBoxWarning).pixmap(16, 16); painter.fillRect(0, 0, width(), height(), QColor("#FDFFD1")); break; case CRITICAL : pm = style()->standardIcon(QStyle::SP_MessageBoxCritical).pixmap(16, 16); painter.fillRect(0, 0, width(), height(), QColor("#FFC8C8")); break; default : pm = style()->standardIcon(QStyle::SP_MessageBoxInformation).pixmap(16, 16); } int stringLength = m_infoStruct.message.length(); int begin = ( width() / 2 ) - ( (stringLength * 8) / 2 ) ; if (begin < 40) begin = 40; painter.setFont(themer()->get_font("MessageWidget:fontscale:log")); painter.setRenderHint(QPainter::TextAntialiasing); painter.drawText(begin, 16, m_infoStruct.message); painter.drawPixmap(begin - 35, 3, pm); } void MessageWidgetPrivate::resizeEvent(QResizeEvent* ) { PENTER3; update(); } void MessageWidgetPrivate::queue_message( InfoStruct infostruct) { m_messageQueue.enqueue(infostruct); if (!m_messageTimer.isActive()) { m_infoStruct = m_messageQueue.dequeue(); update(); } if (m_messageQueue.size() <= 1) { m_messageTimer.start(10000); } // If Queue size is >= 1 start to dequeue faster. if (m_messageQueue.size() >= 1) { m_messageTimer.start(1000); } if (m_messageQueue.size() > 3) { int skip = m_messageQueue.size() - 3; for (int i=0; i"; QString color; QString iconname; if (infostruct.type == INFO) { iconname = "iconinfo"; color = "bgcolor=#F4FFF4"; } else if (infostruct.type == WARNING) { iconname = "iconwarning"; color = "bgcolor=#FDFFD1"; } else if (infostruct.type == CRITICAL) { iconname = "iconcritical"; color = "bgcolor=#FFC8C8"; } QString image = ""; QString string = "" + image + time + "
" + infostruct.message + "
"; if (m_log) { m_log->append(string); } else { m_stringLog.append(string); } } QSize MessageWidgetPrivate::sizeHint() const { return QSize(300, 22); } void MessageWidgetPrivate::show_history() { if (!m_log) { m_logDialog = new QDialog(this); m_log = new QTextBrowser(m_logDialog); QImage img = style()->standardIcon(QStyle::SP_MessageBoxInformation).pixmap(15, 15).toImage(); m_log->document()->addResource(QTextDocument::ImageResource, QUrl("iconinfo"), img); img = style()->standardIcon(QStyle::SP_MessageBoxWarning).pixmap(15, 15).toImage(); m_log->document()->addResource(QTextDocument::ImageResource, QUrl("iconwarning"), img); img = style()->standardIcon(QStyle::SP_MessageBoxCritical).pixmap(15, 15).toImage(); m_log->document()->addResource(QTextDocument::ImageResource, QUrl("iconcritical"), img); QHBoxLayout* lay = new QHBoxLayout(m_logDialog); m_logDialog->setLayout(lay); lay->addWidget(m_log); m_logDialog->resize(500, 200); m_log->append(m_stringLog); m_stringLog.clear(); } if (m_logDialog->isHidden()) { m_logDialog->show(); } else { m_logDialog->hide(); } } //eof traverso-0.49.4/src/traverso/widgets/ResourcesWidget.cpp000644 001750 001750 00000033622 11163362147 023715 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "ResourcesWidget.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define LENGTH_SECTION_WIDTH 60 #define COLUMN_INDENTION 18 void FileWidget::showEvent( QShowEvent * event ) { Q_UNUSED(event); if (m_dirModel) { return; } QPalette palette; palette.setColor(QPalette::AlternateBase, themer()->get_color("ResourcesBin:alternaterowcolor")); m_dirModel = new QDirModel; m_dirModel->setFilter(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot); m_dirView = new QListView; m_dirView->setModel(m_dirModel); m_dirView->setDragEnabled(true); m_dirView->setDropIndicatorShown(true); m_dirView->setSelectionMode(QAbstractItemView::ExtendedSelection); m_dirView->setAlternatingRowColors(true); m_dirView->setPalette(palette); m_dirModel->setSorting(QDir::DirsFirst | QDir::Name | QDir::IgnoreCase); m_box = new QComboBox(this); m_box->addItem("", ""); #if defined (Q_WS_WIN) m_box->addItem(tr("My Computer"), ""); m_box->addItem(tr("My Documents"), QDir::homePath() + "\\" + tr("My Documents")); #else m_box->addItem(QDir::rootPath(), QDir::rootPath()); m_box->addItem(QDir::homePath(), QDir::homePath()); #endif QPushButton* upButton = new QPushButton(this); QIcon upIcon = QApplication::style()->standardIcon(QStyle::SP_FileDialogToParent); upButton->setToolTip(tr("Parent Directory")); upButton->setIcon(upIcon); upButton->setMaximumHeight(25); upButton->setMaximumWidth(30); QPushButton* refreshButton = new QPushButton(this); QIcon refreshIcon = QIcon(find_pixmap(":/refresh-16")); refreshButton->setToolTip(tr("Refresh File View")); refreshButton->setIcon(refreshIcon); refreshButton->setMaximumHeight(25); refreshButton->setMaximumWidth(30); QHBoxLayout* hlay = new QHBoxLayout; hlay->addWidget(upButton); hlay->addWidget(refreshButton); hlay->addWidget(m_box, 10); QVBoxLayout* lay = new QVBoxLayout(this); lay->setMargin(0); lay->setSpacing(6); lay->addLayout(hlay); lay->addWidget(m_dirView); setLayout(lay); connect(m_dirView, SIGNAL(clicked(const QModelIndex& )), this, SLOT(dirview_item_clicked(const QModelIndex&))); connect(upButton, SIGNAL(clicked()), this, SLOT(dir_up_button_clicked())); connect(refreshButton, SIGNAL(clicked()), this, SLOT(refresh_button_clicked())); connect(m_box, SIGNAL(activated(int)), this, SLOT(box_actived(int))); } void FileWidget::dirview_item_clicked(const QModelIndex & index) { if (m_dirModel->isDir(index)) { m_dirView->setRootIndex(index); pm().get_project()->set_import_dir(m_dirModel->filePath(index)); m_box->setItemText(0, m_dirModel->filePath(index)); m_box->setItemData(0, m_dirModel->filePath(index)); m_box->setCurrentIndex(0); } } void FileWidget::dir_up_button_clicked() { QDir dir(m_dirModel->filePath(m_dirView->rootIndex())); #if defined (Q_WS_WIN) if (m_dirModel->filePath(m_dirView->rootIndex()) == "") { return; } QString oldDir = dir.canonicalPath(); #endif dir.cdUp(); QString text = dir.canonicalPath(); #if defined (Q_WS_WIN) if (oldDir == dir.canonicalPath()) { dir.setPath(""); text = tr("My Computer"); } #endif m_dirView->setRootIndex(m_dirModel->index(dir.canonicalPath())); m_box->setItemText(0, text); m_box->setItemData(0, dir.canonicalPath()); m_box->setCurrentIndex(0); } void FileWidget::refresh_button_clicked() { m_dirModel->refresh(m_dirView->rootIndex()); } void FileWidget::box_actived(int i) { m_dirView->setRootIndex(m_dirModel->index(m_box->itemData(i).toString())); } void FileWidget::set_current_path(const QString& path) const { m_dirView->setRootIndex(m_dirModel->index(path)); m_box->setItemText(0, path); m_box->setItemData(0, path); } ResourcesWidget::ResourcesWidget(QWidget * parent) : QWidget(parent) { sourcesTreeWidget = 0; } ResourcesWidget::~ ResourcesWidget() { } void ResourcesWidget::showEvent( QShowEvent * event ) { Q_UNUSED(event); if (sourcesTreeWidget) { return; } setupUi(this); QPalette palette; palette.setColor(QPalette::AlternateBase, themer()->get_color("ResourcesBin:alternaterowcolor")); sourcesTreeWidget->setPalette(palette); sourcesTreeWidget->setSelectionMode(QAbstractItemView::ExtendedSelection); sourcesTreeWidget->setAlternatingRowColors(true); sourcesTreeWidget->setDragEnabled(true); sourcesTreeWidget->setDropIndicatorShown(true); sourcesTreeWidget->setIndentation(COLUMN_INDENTION); sourcesTreeWidget->header()->setResizeMode(0, QHeaderView::Fixed); sourcesTreeWidget->header()->setResizeMode(1, QHeaderView::Fixed); sourcesTreeWidget->header()->setResizeMode(2, QHeaderView::Fixed); sourcesTreeWidget->header()->setResizeMode(3, QHeaderView::Fixed); sourcesTreeWidget->header()->resizeSection(1, LENGTH_SECTION_WIDTH); sourcesTreeWidget->header()->resizeSection(2, LENGTH_SECTION_WIDTH); sourcesTreeWidget->header()->resizeSection(3, LENGTH_SECTION_WIDTH); sourcesTreeWidget->header()->setStretchLastSection(false); sourcesTreeWidget->setUniformRowHeights(true); m_filewidget = new FileWidget(this); layout()->addWidget(m_filewidget); m_filewidget->hide(); m_currentSheet = 0; m_project = 0; connect(viewComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(view_combo_box_index_changed(int))); connect(sheetComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(sheet_combo_box_index_changed(int))); connect(sheetComboBox, SIGNAL(activated(int)), this, SLOT(sheet_combo_box_index_changed(int))); connect(&pm(), SIGNAL(projectLoaded(Project*)), this, SLOT(set_project(Project*))); set_project(pm().get_project()); // Fade a project load finished since we were not able to catch that signal! project_load_finished(); } void ResourcesWidget::set_project(Project * project) { sourcesTreeWidget->clear(); m_sourceindices.clear(); m_clipindices.clear(); sheetComboBox->clear(); m_project = project; if (!m_project) { sheetComboBox->setEnabled(false); m_currentSheet = 0; return; } sheetComboBox->setEnabled(true); connect(m_project, SIGNAL(projectLoadFinished()), this, SLOT(project_load_finished())); } void ResourcesWidget::project_load_finished() { if (!m_project) { return; } ResourcesManager* rsmanager = m_project->get_audiosource_manager(); connect(m_project, SIGNAL(sheetAdded(Sheet*)), this, SLOT(sheet_added(Sheet*))); connect(m_project, SIGNAL(sheetRemoved(Sheet*)), this, SLOT(sheet_removed(Sheet*))); connect(m_project, SIGNAL(currentSheetChanged(Sheet*)), this, SLOT(set_current_sheet(Sheet*))); connect(rsmanager, SIGNAL(clipAdded(AudioClip*)), this, SLOT(add_clip(AudioClip*))); connect(rsmanager, SIGNAL(clipRemoved(AudioClip*)), this, SLOT(remove_clip(AudioClip*))); connect(rsmanager, SIGNAL(sourceAdded(ReadSource*)), this, SLOT(add_source(ReadSource*))); connect(rsmanager, SIGNAL(sourceRemoved(ReadSource*)), this, SLOT(remove_source(ReadSource*))); foreach(ReadSource* rs, resources_manager()->get_all_audio_sources()) { add_source(rs); } foreach(AudioClip* clip, resources_manager()->get_all_clips()) { add_clip(clip); } foreach(Sheet* sheet, m_project->get_sheets()) { sheet_added(sheet); } set_current_sheet(m_project->get_current_sheet()); sourcesTreeWidget->sortItems(0, Qt::AscendingOrder); } void ResourcesWidget::view_combo_box_index_changed(int index) { if (index == 0) { sourcesTreeWidget->show(); sheetComboBox->show(); m_filewidget->hide(); } else if (index == 1) { sourcesTreeWidget->hide(); sheetComboBox->hide(); m_filewidget->show(); m_filewidget->set_current_path(m_project->get_import_dir()); } } void ResourcesWidget::sheet_combo_box_index_changed(int index) { qint64 id = sheetComboBox->itemData(index).toLongLong(); Sheet* sheet = m_project->get_sheet(id); set_current_sheet(sheet); } void ResourcesWidget::sheet_added(Sheet * sheet) { sheetComboBox->addItem("Sheet " + QString::number(m_project->get_sheet_index(sheet->get_id())), sheet->get_id()); } void ResourcesWidget::sheet_removed(Sheet * sheet) { int index = sheetComboBox->findData(sheet->get_id()); sheetComboBox->removeItem(index); } void ResourcesWidget::set_current_sheet(Sheet * sheet) { if (m_currentSheet == sheet) { return; } if (sheet) { int index = sheetComboBox->findData(sheet->get_id()); if (index != -1) { sheetComboBox->setCurrentIndex(index); } } m_currentSheet = sheet; filter_on_current_sheet(); } void ResourcesWidget::filter_on_current_sheet() { if (!m_currentSheet) { return; } foreach(ClipTreeItem* item, m_clipindices.values()) { item->apply_filter(m_currentSheet); } foreach(SourceTreeItem* item, m_sourceindices.values()) { item->apply_filter(m_currentSheet); } } void ResourcesWidget::add_clip(AudioClip * clip) { ClipTreeItem* item = m_clipindices.value(clip->get_id()); if (!item) { SourceTreeItem* sourceitem = m_sourceindices.value(clip->get_readsource_id()); if (! sourceitem ) return; ClipTreeItem* clipitem = new ClipTreeItem(sourceitem, clip); m_clipindices.insert(clip->get_id(), clipitem); clipitem->setTextAlignment(1, Qt::AlignHCenter); clipitem->setTextAlignment(2, Qt::AlignHCenter); clipitem->setTextAlignment(3, Qt::AlignLeft); connect(clip, SIGNAL(positionChanged()), clipitem, SLOT(clip_state_changed())); } update_clip_state(clip); } void ResourcesWidget::remove_clip(AudioClip * clip) { ClipTreeItem* item = m_clipindices.value(clip->get_id()); if (!item) { return; } update_clip_state(clip); } void ResourcesWidget::add_source(ReadSource * source) { SourceTreeItem* item = m_sourceindices.value(source->get_id()); if (! item) { item = new SourceTreeItem(sourcesTreeWidget, source); m_sourceindices.insert(source->get_id(), item); item->setTextAlignment(1, Qt::AlignHCenter); item->setTextAlignment(2, Qt::AlignHCenter); item->setTextAlignment(3, Qt::AlignLeft); } item->source_state_changed(); } void ResourcesWidget::remove_source(ReadSource * source) { SourceTreeItem* item = m_sourceindices.value(source->get_id()); if (!item) { return; } m_sourceindices.remove(source->get_id()); sourcesTreeWidget->takeTopLevelItem(sourcesTreeWidget->indexOfTopLevelItem(item)); delete item; } void ResourcesWidget::update_clip_state(AudioClip* clip) { ClipTreeItem* item = m_clipindices.value(clip->get_id()); Q_ASSERT(item); item->clip_state_changed(); update_source_state(clip->get_readsource_id()); } void ResourcesWidget::update_source_state(qint64 id) { SourceTreeItem* item = m_sourceindices.value(id); Q_ASSERT(item); item->source_state_changed(); } ClipTreeItem::ClipTreeItem(SourceTreeItem * parent, AudioClip * clip) : QTreeWidgetItem(parent) , m_clip(clip) { setData(0, Qt::UserRole, clip->get_id()); connect(clip, SIGNAL(recordingFinished(AudioClip*)), this, SLOT(clip_state_changed())); connect(clip, SIGNAL(stateChanged()), this, SLOT(clip_state_changed())); } void ClipTreeItem::clip_state_changed() { if (resources_manager()->is_clip_in_use(m_clip->get_id())) { for (int i=0; i<5; ++i) { setForeground(i, QColor(Qt::black)); } } else { for (int i=0; i<5; ++i) { setForeground(i, QColor(Qt::lightGray)); } } QString start = timeref_to_ms(m_clip->get_source_start_location()); QString end = timeref_to_ms(m_clip->get_source_end_location()); setText(0, m_clip->get_name()); setText(1, timeref_to_ms(m_clip->get_length())); setText(2, start); setText(3, end); setToolTip(0, m_clip->get_name() + " " + start + " - " + end); } void ClipTreeItem::apply_filter(Sheet * sheet) { if (m_clip->get_sheet_id() == sheet->get_id()) { if (isHidden()) { setHidden(false); } } else { if (!isHidden()) { setHidden(true); } } } SourceTreeItem::SourceTreeItem(QTreeWidget* parent, ReadSource * source) : QTreeWidgetItem(parent) , m_source(source) { connect(m_source, SIGNAL(stateChanged()), this, SLOT(source_state_changed())); } void SourceTreeItem::apply_filter(Sheet * sheet) { if (m_source->get_orig_sheet_id() == sheet->get_id()) { setHidden(false); return; } bool show = false; for (int i=0; i < childCount(); ++i) { if (!child(i)->isHidden()) { show = true; break; } } if (show) { setHidden(false); } else { setHidden(true); } } void SourceTreeItem::source_state_changed() { if (resources_manager()->is_source_in_use(m_source->get_id())) { for (int i=0; i<5; ++i) { setForeground(i, QColor(Qt::black)); } } else { for (int i=0; i<5; ++i) { setForeground(i, QColor(Qt::lightGray)); } } int rate = m_source->get_rate(); if (rate == 0) rate = pm().get_project()->get_rate(); QString duration = timeref_to_ms(m_source->get_length()); setText(0, m_source->get_short_name()); setText(1, duration); setText(2, ""); setText(3, ""); setData(0, Qt::UserRole, m_source->get_id()); setToolTip(0, m_source->get_short_name() + " " + duration); } void ResourcesWidget::resizeEvent(QResizeEvent * e) { if (sourcesTreeWidget) { int w = width() - COLUMN_INDENTION; int nameSectionWidth = w - (3 * LENGTH_SECTION_WIDTH); if (nameSectionWidth < 130) { nameSectionWidth = 130; } sourcesTreeWidget->header()->resizeSection(0, nameSectionWidth); } } traverso-0.49.4/src/traverso/widgets/SpectralMeterWidget.cpp000644 001750 001750 00000104322 11163362147 024511 0ustar00remonremon000000 000000 /* Copyright (C) 2008 Remon Sijrier Copyright (C) 2006 Nicola Doebelin This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "SpectralMeterWidget.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" #define SMOOTH_FACTOR 0.98 #define DB_FLOOR -140.0 static const float DEFAULT_VAL = -999.0f; static const uint MAX_SAMPLES = UINT_MAX; SpectralMeterWidget::SpectralMeterWidget(QWidget* parent) : MeterWidget(parent, new SpectralMeterView(this)) { PENTERCONS; } SpectralMeterView::SpectralMeterView(SpectralMeterWidget* widget) : MeterView(widget) { m_config = 0; load_configuration(); upper_freq_log = log10(upper_freq); lower_freq_log = log10(lower_freq); sample_rate = audiodevice().get_sample_rate(); show_average = false; update_average = true; sample_weight = 1; QFontMetrics fm(themer()->get_font("FFTMeter:fontscale:label")); margin_l = 5; margin_r = fm.width("-XX") + 5; margin_t = fm.ascent()/2 + 5; margin_b = fm.ascent() + fm.descent() + 10; for (int i = 0; i < 4; ++i) { m_freq_labels.push_back(10.0f * pow(10.0,i)); m_freq_labels.push_back(20.0f * pow(10.0,i)); m_freq_labels.push_back(30.0f * pow(10.0,i)); m_freq_labels.push_back(40.0f * pow(10.0,i)); m_freq_labels.push_back(50.0f * pow(10.0,i)); m_freq_labels.push_back(60.0f * pow(10.0,i)); m_freq_labels.push_back(70.0f * pow(10.0,i)); m_freq_labels.push_back(80.0f * pow(10.0,i)); m_freq_labels.push_back(90.0f * pow(10.0,i)); } } void SpectralMeterView::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { Q_UNUSED(option); Q_UNUSED(widget); painter->drawPixmap(0, 0, bgPixmap); // draw the bars if (m_spectrum.size()) { QRect rect; QBrush brush(themer()->get_color("FFTMeter:foreground"), Qt::SolidPattern); painter->setClipRegion(m_rect); painter->setBrush(brush); painter->setPen(Qt::NoPen); int spc = 0; if (num_bands < 64) spc = 1; // draw the freq bands for (uint i = 0; i < (uint)m_spectrum.size(); ++i) { if (m_bands.at(i+1) < lower_db) { continue; } rect.setTopLeft(QPoint((int)freq2xpos(m_bands.at(i)) + spc, (int)db2ypos(m_spectrum.at(i)))); rect.setBottomRight(QPoint((int)freq2xpos(m_bands.at(i+1)) - spc, (int)db2ypos(DB_FLOOR))); painter->drawRect(rect); } // draw the average line if requested if (show_average) { painter->setPen(themer()->get_color("FFTMeter:curve:average")); QPoint pt; QPoint po((int)m_map_idx2xpos.at(0), (int)db2ypos(m_avg_db.at(0))); for (uint i = 0; i < (uint)m_avg_db.size(); ++i) { pt.setX((int)m_map_idx2xpos.at(i)); pt.setY((int)db2ypos(m_avg_db.at(i))); painter->drawLine(po, pt); po = pt; } } } } void SpectralMeterView::resize() { PENTER; prepareGeometryChange(); // Make the axis labels disappear when the widget becomes too small int x = 0, y = 0, w = m_widget->width(), h = m_widget->height(); m_boundingRect = QRectF(0, 0, w, h); if (m_widget->width() >= 200) { x = margin_l; w -= (margin_l + margin_r); } if (m_widget->height() >= 120) { y = margin_t; h -= (margin_t + margin_b); } m_rect.setRect(x, y, w, h); // update the vectors mapping indices and frequencies to widget coordinates update_freq_map(); // re-draw the background pixmap update_background(); } void SpectralMeterView::update_background() { // draw the background image bgPixmap = QPixmap((int)m_boundingRect.width(), (int)m_boundingRect.height()); bgPixmap.fill(themer()->get_color("FFTMeter:margin")); QPainter painter(&bgPixmap); painter.fillRect(m_rect, themer()->get_color("FFTMeter:background")); painter.setFont(themer()->get_font("FFTMeter:fontscale:label")); QFontMetrics fm(themer()->get_font("FFTMeter:fontscale:label")); QString spm; // draw horizontal lines + labels for (float i = upper_db; i >= lower_db; i -= 10.0f) { float f = db2ypos(i); painter.setPen(themer()->get_color("FFTMeter:grid")); painter.drawLine(QPointF(m_rect.x(), f), QPointF(m_rect.right(), f)); painter.setPen(themer()->get_color("FFTMeter:text")); spm.sprintf("%2.0f", i); painter.drawText(m_rect.right() + 1, (int)f + fm.ascent()/2, spm); } // draw frequency labels and tickmarks float last_pos = 1.0; for (int i = 0; i < m_freq_labels.size(); ++i) { // check if we have space to draw the labels by checking if the // m_rect is borderless if (!m_rect.top()) { break; } float f = freq2xpos(m_freq_labels.at(i)); // check if the freq is in the visible range if (!f) { continue; } spm.sprintf("%2.0f", m_freq_labels.at(i)); float s = (float)fm.width(spm)/2.0f; // draw text only if there is enough space for it if (((f - s) > last_pos) && ((f + s) < float(m_boundingRect.width()-1))) { painter.setPen(themer()->get_color("FFTMeter:text")); painter.drawText(QPointF(f - s, m_boundingRect.height() - fm.descent() - 3), spm); last_pos = f + s + 1.0; painter.setPen(themer()->get_color("FFTMeter:tickmarks:main")); } else { painter.setPen(themer()->get_color("FFTMeter:tickmarks:sub")); } painter.drawLine(QPointF(f, m_rect.bottom()), QPointF(f, m_rect.bottom() + 3)); } } void SpectralMeterView::update_data() { if (!m_meter) { return; } // if no data was available, return, so we _only_ update the widget when // it needs to be! int ret = ((SpectralMeter*)m_meter)->get_data(specl, specr); // switch off the update of the average curve if silence is played back. if (ret == -1) { update_average = false; } else { update_average = true; } // do nothing if the buffer is not ready. if (ret == 0) { return; } // process the data reduce_bands(); // paint the widget update(); } void SpectralMeterView::set_sheet(Sheet *sheet) { MeterView::set_sheet(sheet); if ( ! m_sheet ) { return; } PluginChain* chain = m_sheet->get_plugin_chain(); sample_rate = audiodevice().get_sample_rate(); foreach(Plugin* plugin, chain->get_plugin_list()) { m_meter = qobject_cast(plugin); if (m_meter) { return; } } m_meter = new SpectralMeter(); m_meter->init(); Command::process_command(chain->add_plugin(m_meter, false)); } void SpectralMeterView::reduce_bands() { // check if we have to update some variables if ((m_spectrum.size() != (int)num_bands) || (fft_size != (uint)qMin(specl.size(), specr.size())) || ((uint)m_map_idx2freq.size() != fft_size)) { update_layout(); } // calculate the sample weight for the average curve double sweight = 1.0 / (double)sample_weight; double oweight = 1.0 - sweight; // loop through the freq bands and determine the db-values for (int i = 0; i < m_spectrum.size(); ++i) { float val = freq2db(m_bands.at(i), m_bands.at(i+1)); float hist = DB_FLOOR + (m_spectrum.at(i) - DB_FLOOR) * SMOOTH_FACTOR; m_spectrum[i] = qMax(val, hist); } // fill the average sample curve if (show_average && update_average) { for (int i = 0; i < m_avg_db.size(); ++i) { float val = 5.0 * (log10(specl.at(i) * specr.at(i)) + xfactor); float v = val * sweight + m_avg_db.at(i) * oweight; m_avg_db[i] = v; } // progress the sample weighting for the average curve if (sample_weight < (MAX_SAMPLES - 1)) { ++sample_weight; } } } // call this function if the size, number of bands, ranges etc. changed. // it re-calculates some variables void SpectralMeterView::update_layout() { // recalculate a couple of variables fft_size = qMin(specl.size(), specr.size()); // number of frequencies (size of the FFT) xfactor = 4.0f * log10(2.0f / float(fft_size)); // a constant factor for conversion to dB upper_freq_log = log10(upper_freq); lower_freq_log = log10(lower_freq); freq_step = (upper_freq_log - lower_freq_log)/(num_bands); sample_weight = 1; // recreate the vector containing the levels and frequency bands m_spectrum.fill(DEFAULT_VAL, num_bands); m_avg_db.fill(DEFAULT_VAL, fft_size); // recreate the vector containing border frequencies of the freq bands m_bands.clear(); for (uint i = 0; i <= num_bands; ++i) { m_bands.push_back(pow(10.0, lower_freq_log + i*freq_step)); } // update related stuff update_freq_map(); } // converts db-values into widget y-coordinates float SpectralMeterView::db2ypos(float f) { return ((f - upper_db) * m_rect.height()/(lower_db - upper_db)) + m_rect.top(); } // converts frequencies into widget x-coordinates float SpectralMeterView::freq2xpos(float f) { if ((f < lower_freq) || (f > upper_freq)) { return 0.0; } float d = log10(f) - lower_freq_log; return (float)m_rect.x() + d * m_rect.width() / (upper_freq_log - lower_freq_log); } // determines the highest db value for frequency rang fl-fu. Does all the interpolation etc. float SpectralMeterView::freq2db(float fl, float fu) { float lfreq = qMin(fl, fu); float ufreq = qMax(fl, fu); float fidxl = lfreq * (2.0f * fft_size) / (float)sample_rate; float fidxu = ufreq * (2.0f * fft_size) / (float)sample_rate; int idxl = int(floor(fidxl - 1.0f)); int idxu = int(ceil(fidxu - 1.0f)); if (idxl < 0) { idxl = 0; } if ((uint)idxu >= fft_size) { idxu = fft_size - 1; } // distinguishing some cases to save cpu cycles. // if we're outside the range covered by the FFT, return DB_FLOOR if (idxu <= 0) { return DB_FLOOR; } if (idxl >= (int)fft_size) { return DB_FLOOR; } // they are the same (which shouldn't happen) if (idxu - idxl == 0) { return DB_FLOOR; } // if we have exactly one bin in the freq range, return it's db-value and exit if (idxu - idxl == 2) { return 5.0f * (log10(specl.at(idxl + 1) * specr.at(idxl + 1)) + xfactor); } // if no bin is in between, we have to interpolate in order to get an accurate value if (idxu - idxl == 1) { float v = fidxu - fidxl; float dbvl = specl.at(idxl) * specr.at(idxl); float dbvu = specl.at(idxu) * specr.at(idxu); return 5.0 * (log10(dbvl + v * (dbvu - dbvl)) + xfactor); } // if several bins are in between, search the highest db value float val = 0.0; for (int i = idxl; i <=idxu; ++i) { val = qMax(val, specl.at(i) * specr.at(i)); } return 5.0 * (log10(val) + xfactor); } // updates a vector mapping fft indices (0, ..., fft_size) to widget x-positions // and one mapping fft indices to frequency void SpectralMeterView::update_freq_map() { m_map_idx2xpos.clear(); m_map_idx2freq.clear(); for (uint i = 0; i < fft_size; ++i) { float freq = float(i+1) * (float)sample_rate / (2.0f * fft_size); m_map_idx2freq.push_back(freq); m_map_idx2xpos.push_back(freq2xpos(freq)); } } // opens the properties dialog Command* SpectralMeterView::edit_properties() { if (!m_meter) { return 0; } if (!m_config) { m_config = new SpectralMeterConfigWidget(m_widget); connect(m_config, SIGNAL(configChanged()), this, SLOT(load_configuration())); } m_config->show(); return 0; } // is called upon closing the properties dialog void SpectralMeterView::load_configuration() { upper_freq = config().get_property("SpectralMeter", "UpperFrequenty", 22050).toInt(); lower_freq = config().get_property("SpectralMeter", "LowerFrequenty", 20).toInt(); num_bands = config().get_property("SpectralMeter", "NumberOfBands", 16).toInt(); upper_db = config().get_property("SpectralMeter", "UpperdB", 0).toInt(); lower_db = config().get_property("SpectralMeter", "LowerdB", -90).toInt(); show_average = config().get_property("SpectralMeter", "ShowAvarage", 0).toInt(); if (m_meter) { ((SpectralMeter*)m_meter)->set_fr_size(config().get_property("SpectralMeter", "FFTSize", 2048).toInt()); ((SpectralMeter*)m_meter)->set_windowing_function(config().get_property("SpectralMeter", "WindowingFunction", 1).toInt()); ((SpectralMeter*)m_meter)->init(); } update_layout(); } Command* SpectralMeterView::set_mode() { show_average = !show_average; update_layout(); return 0; } Command* SpectralMeterView::reset() { sample_weight = 1; return 0; } Command* SpectralMeterView::screen_capture( ) { QImage image(m_widget->size(), QImage::Format_RGB32); QPainter painter(&image); m_widget->render(&painter); QString fn = QFileDialog::getSaveFileName (0, tr("Screen Capture file name"), QDir::homePath()); // if aborted exit here if (fn.isEmpty()) { return 0; } if ( ! image.save(fn, "PNG")) { info().warning(tr("FFT: Unable to write captured image to hard disk")); } return 0; } Command* SpectralMeterView::export_avarage_curve() { // check if all requirements are met if ((!show_average) || (!m_project)) { printf("No average data available.\n"); info().warning(tr("FFT: No avarage curve used, not data to export!")); info().information(tr("FFT: Enable avarage curve with < M > to generate data")); return 0; } // check if there actually is data to export int s = qMin(m_map_idx2freq.size(), m_avg_db.size()); if (!s) { printf("No average data available.\n"); info().warning(tr("FFT: No avarage data to export!")); return 0; } QStringList oFormats; QString formatA = "plain text"; QString formatB = "XMGrace"; oFormats.append(formatA); oFormats.append(formatB); bool ok; QString format = QInputDialog::getItem( 0, tr("Select output format"), tr("Output format:"), oFormats, 0, false, &ok ); if (!ok) { printf("Aborted."); return 0; } QString fn = QFileDialog::getSaveFileName (0, tr("Export average dB curve"), m_project->get_root_dir()); // if aborted exit here if (fn.isEmpty()) { return 0; } QFile file(fn); // check if the selected file can be opened for writing if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { printf("Could not open file for writing."); return 0; } QTextStream out(&file); QString separator = " "; QString str; if (format == formatA) { // export the data in text format for (int i = 0; i < s; ++i) { out << str.sprintf("%.6f %.6f\n", m_map_idx2freq.at(i), m_avg_db.at(i)); } return 0; } if (format == formatB) { // export the data in XMGrace format out << get_xmgr_string(); return 0; } return 0; } QString SpectralMeterView::get_xmgr_string() { QString s = "# Grace project file\n"; s += "#\n"; s += "@version 50120\n"; s += "@page size 842, 594\n"; s += "@page scroll 5\%\n"; s += "@page inout 5\%\n"; s += "@link page off\n"; s += "@map font 39 to \"Courier\", \"Courier\"\n"; s += "@map font 40 to \"Courier-Bold\", \"Courier-Bold\"\n"; s += "@map font 11 to \"Courier-BoldOblique\", \"Courier-BoldOblique\"\n"; s += "@map font 9 to \"Courier-Oblique\", \"Courier-Oblique\"\n"; s += "@map font 4 to \"Helvetica\", \"Helvetica\"\n"; s += "@map font 6 to \"Helvetica-Bold\", \"Helvetica-Bold\"\n"; s += "@map font 7 to \"Helvetica-BoldOblique\", \"Helvetica-BoldOblique\"\n"; s += "@map font 15 to \"Helvetica-Narrow\", \"Helvetica-Narrow\"\n"; s += "@map font 16 to \"Helvetica-Narrow-Bold\", \"Helvetica-Narrow-Bold\"\n"; s += "@map font 17 to \"Helvetica-Narrow-BoldOblique\", \"Helvetica-Narrow-BoldOblique\"\n"; s += "@map font 18 to \"Helvetica-Narrow-Oblique\", \"Helvetica-Narrow-Oblique\"\n"; s += "@map font 5 to \"Helvetica-Oblique\", \"Helvetica-Oblique\"\n"; s += "@map font 20 to \"NewCenturySchlbk-Bold\", \"NewCenturySchlbk-Bold\"\n"; s += "@map font 21 to \"NewCenturySchlbk-BoldItalic\", \"NewCenturySchlbk-BoldItalic\"\n"; s += "@map font 22 to \"NewCenturySchlbk-Italic\", \"NewCenturySchlbk-Italic\"\n"; s += "@map font 23 to \"NewCenturySchlbk-Roman\", \"NewCenturySchlbk-Roman\"\n"; s += "@map font 24 to \"Palatino-Bold\", \"Palatino-Bold\"\n"; s += "@map font 25 to \"Palatino-BoldItalic\", \"Palatino-BoldItalic\"\n"; s += "@map font 26 to \"Palatino-Italic\", \"Palatino-Italic\"\n"; s += "@map font 27 to \"Palatino-Roman\", \"Palatino-Roman\"\n"; s += "@map font 12 to \"Symbol\", \"Symbol\"\n"; s += "@map font 2 to \"Times-Bold\", \"Times-Bold\"\n"; s += "@map font 3 to \"Times-BoldItalic\", \"Times-BoldItalic\"\n"; s += "@map font 1 to \"Times-Italic\", \"Times-Italic\"\n"; s += "@map font 0 to \"Times-Roman\", \"Times-Roman\"\n"; s += "@map font 33 to \"ZapfChancery-MediumItalic\", \"ZapfChancery-MediumItalic\"\n"; s += "@map font 13 to \"ZapfDingbats\", \"ZapfDingbats\"\n"; s += "@map font 35 to \"CharterBT-Bold\", \"CharterBT-Bold\"\n"; s += "@map font 36 to \"CharterBT-BoldItalic\", \"CharterBT-BoldItalic\"\n"; s += "@map font 37 to \"CharterBT-Italic\", \"CharterBT-Italic\"\n"; s += "@map font 38 to \"CharterBT-Roman\", \"CharterBT-Roman\"\n"; s += "@map font 41 to \"Courier-BoldItalic\", \"Courier-BoldItalic\"\n"; s += "@map font 42 to \"Courier-Italic\", \"Courier-Italic\"\n"; s += "@map font 43 to \"Hershey-Gothic-English\", \"Hershey-Gothic-English\"\n"; s += "@map font 44 to \"Hershey-Gothic-German\", \"Hershey-Gothic-German\"\n"; s += "@map font 45 to \"Hershey-Gothic-Italian\", \"Hershey-Gothic-Italian\"\n"; s += "@map font 46 to \"Hershey-Plain-Duplex\", \"Hershey-Plain-Duplex\"\n"; s += "@map font 47 to \"Hershey-Plain-Duplex-Italic\", \"Hershey-Plain-Duplex-Italic\"\n"; s += "@map font 48 to \"Hershey-Plain-Triplex\", \"Hershey-Plain-Triplex\"\n"; s += "@map font 49 to \"Hershey-Plain-Triplex-Italic\", \"Hershey-Plain-Triplex-Italic\"\n"; s += "@map font 50 to \"Hershey-Script-Complex\", \"Hershey-Script-Complex\"\n"; s += "@map font 51 to \"Hershey-Script-Simplex\", \"Hershey-Script-Simplex\"\n"; s += "@map font 52 to \"LuxiMono\", \"LuxiMono\"\n"; s += "@map font 53 to \"LuxiMono-Bold\", \"LuxiMono-Bold\"\n"; s += "@map font 54 to \"LuxiMono-BoldOblique\", \"LuxiMono-BoldOblique\"\n"; s += "@map font 55 to \"LuxiMono-Oblique\", \"LuxiMono-Oblique\"\n"; s += "@map font 56 to \"LuxiSans\", \"LuxiSans\"\n"; s += "@map font 57 to \"LuxiSans-Bold\", \"LuxiSans-Bold\"\n"; s += "@map font 58 to \"LuxiSans-BoldOblique\", \"LuxiSans-BoldOblique\"\n"; s += "@map font 59 to \"LuxiSans-Oblique\", \"LuxiSans-Oblique\"\n"; s += "@map font 60 to \"LuxiSerif\", \"LuxiSerif\"\n"; s += "@map font 61 to \"LuxiSerif-Bold\", \"LuxiSerif-Bold\"\n"; s += "@map font 62 to \"LuxiSerif-BoldOblique\", \"LuxiSerif-BoldOblique\"\n"; s += "@map font 63 to \"LuxiSerif-Oblique\", \"LuxiSerif-Oblique\"\n"; s += "@map font 64 to \"Utopia-Bold\", \"Utopia-Bold\"\n"; s += "@map font 65 to \"Utopia-BoldItalic\", \"Utopia-BoldItalic\"\n"; s += "@map font 66 to \"Utopia-Italic\", \"Utopia-Italic\"\n"; s += "@map font 67 to \"Utopia-Regular\", \"Utopia-Regular\"\n"; s += "@map color 0 to (255, 255, 255), \"white\"\n"; s += "@map color 1 to (0, 0, 0), \"black\"\n"; s += "@map color 2 to (255, 0, 0), \"red\"\n"; s += "@map color 3 to (0, 255, 0), \"green\"\n"; s += "@map color 4 to (0, 0, 255), \"blue\"\n"; s += "@map color 5 to (255, 255, 0), \"yellow\"\n"; s += "@map color 6 to (188, 143, 143), \"brown\"\n"; s += "@map color 7 to (220, 220, 220), \"grey\"\n"; s += "@map color 8 to (148, 0, 211), \"violet\"\n"; s += "@map color 9 to (0, 255, 255), \"cyan\"\n"; s += "@map color 10 to (255, 0, 255), \"magenta\"\n"; s += "@map color 11 to (255, 165, 0), \"orange\"\n"; s += "@map color 12 to (114, 33, 188), \"indigo\"\n"; s += "@map color 13 to (103, 7, 72), \"maroon\"\n"; s += "@map color 14 to (64, 224, 208), \"turquoise\"\n"; s += "@map color 15 to (0, 139, 0), \"green4\"\n"; s += "@reference date 0\n"; s += "@date wrap off\n"; s += "@date wrap year 1950\n"; s += "@default linewidth 1.0\n"; s += "@default linestyle 1\n"; s += "@default color 1\n"; s += "@default pattern 1\n"; s += "@default font 0\n"; s += "@default char size 1.000000\n"; s += "@default symbol size 1.000000\n"; s += "@default sformat \"\%.8g\"\n"; s += "@background color 0\n"; s += "@page background fill on\n"; s += "@timestamp off\n"; s += "@timestamp 0.03, 0.03\n"; s += "@timestamp color 1\n"; s += "@timestamp rot 0\n"; s += "@timestamp font 0\n"; s += "@timestamp char size 1.000000\n"; s += "@timestamp def \"Sun Jan 21 12:56:47 2007\"\n"; s += "@r0 off\n"; s += "@link r0 to g0\n"; s += "@r0 type above\n"; s += "@r0 linestyle 1\n"; s += "@r0 linewidth 1.0\n"; s += "@r0 color 1\n"; s += "@r0 line 0, 0, 0, 0\n"; s += "@r1 off\n"; s += "@link r1 to g0\n"; s += "@r1 type above\n"; s += "@r1 linestyle 1\n"; s += "@r1 linewidth 1.0\n"; s += "@r1 color 1\n"; s += "@r1 line 0, 0, 0, 0\n"; s += "@r2 off\n"; s += "@link r2 to g0\n"; s += "@r2 type above\n"; s += "@r2 linestyle 1\n"; s += "@r2 linewidth 1.0\n"; s += "@r2 color 1\n"; s += "@r2 line 0, 0, 0, 0\n"; s += "@r3 off\n"; s += "@link r3 to g0\n"; s += "@r3 type above\n"; s += "@r3 linestyle 1\n"; s += "@r3 linewidth 1.0\n"; s += "@r3 color 1\n"; s += "@r3 line 0, 0, 0, 0\n"; s += "@r4 off\n"; s += "@link r4 to g0\n"; s += "@r4 type above\n"; s += "@r4 linestyle 1\n"; s += "@r4 linewidth 1.0\n"; s += "@r4 color 1\n"; s += "@r4 line 0, 0, 0, 0\n"; s += "@g0 on\n"; s += "@g0 hidden false\n"; s += "@g0 type XY\n"; s += "@g0 stacked false\n"; s += "@g0 bar hgap 0.000000\n"; s += "@g0 fixedpoint off\n"; s += "@g0 fixedpoint type 0\n"; s += "@g0 fixedpoint xy 0.000000, 0.000000\n"; s += "@g0 fixedpoint format general general\n"; s += "@g0 fixedpoint prec 6, 6\n"; s += "@with g0\n"; s += "@ world 20, -90, 20000, 0\n"; s += "@ stack world 0, 0, 0, 0\n"; s += "@ znorm 1\n"; s += "@ view 0.130000, 0.120000, 1.300000, 0.920000\n"; s += "@ title \"\"\n"; s += "@ title font 0\n"; s += "@ title size 1.500000\n"; s += "@ title color 1\n"; s += "@ subtitle \"\"\n"; s += "@ subtitle font 0\n"; s += "@ subtitle size 1.000000\n"; s += "@ subtitle color 1\n"; s += "@ xaxes scale Logarithmic\n"; s += "@ yaxes scale Normal\n"; s += "@ xaxes invert off\n"; s += "@ yaxes invert off\n"; s += "@ xaxis on\n"; s += "@ xaxis type zero false\n"; s += "@ xaxis offset 0.000000 , 0.000000\n"; s += "@ xaxis bar on\n"; s += "@ xaxis bar color 1\n"; s += "@ xaxis bar linestyle 1\n"; s += "@ xaxis bar linewidth 1.0\n"; s += "@ xaxis label \"Frequency (Hz)\"\n"; s += "@ xaxis label layout para\n"; s += "@ xaxis label place auto\n"; s += "@ xaxis label char size 1.000000\n"; s += "@ xaxis label font 0\n"; s += "@ xaxis label color 1\n"; s += "@ xaxis label place normal\n"; s += "@ xaxis tick on\n"; s += "@ xaxis tick major 10\n"; s += "@ xaxis tick minor ticks 9\n"; s += "@ xaxis tick default 6\n"; s += "@ xaxis tick place rounded true\n"; s += "@ xaxis tick in\n"; s += "@ xaxis tick major size 0.500000\n"; s += "@ xaxis tick major color 1\n"; s += "@ xaxis tick major linewidth 1.0\n"; s += "@ xaxis tick major linestyle 1\n"; s += "@ xaxis tick major grid on\n"; s += "@ xaxis tick minor color 1\n"; s += "@ xaxis tick minor linewidth 1.0\n"; s += "@ xaxis tick minor linestyle 2\n"; s += "@ xaxis tick minor grid on\n"; s += "@ xaxis tick minor size 0.250000\n"; s += "@ xaxis ticklabel on\n"; s += "@ xaxis ticklabel format general\n"; s += "@ xaxis ticklabel prec 5\n"; s += "@ xaxis ticklabel formula \"\"\n"; s += "@ xaxis ticklabel append \"\"\n"; s += "@ xaxis ticklabel prepend \"\"\n"; s += "@ xaxis ticklabel angle 0\n"; s += "@ xaxis ticklabel skip 0\n"; s += "@ xaxis ticklabel stagger 0\n"; s += "@ xaxis ticklabel place normal\n"; s += "@ xaxis ticklabel offset auto\n"; s += "@ xaxis ticklabel offset 0.000000 , 0.010000\n"; s += "@ xaxis ticklabel start type auto\n"; s += "@ xaxis ticklabel start 0.000000\n"; s += "@ xaxis ticklabel stop type auto\n"; s += "@ xaxis ticklabel stop 0.000000\n"; s += "@ xaxis ticklabel char size 0.750000\n"; s += "@ xaxis ticklabel font 0\n"; s += "@ xaxis ticklabel color 1\n"; s += "@ xaxis tick place both\n"; s += "@ xaxis tick spec type both\n"; s += "@ xaxis tick spec 37\n"; s += "@ xaxis tick major 0, 10\n"; s += "@ xaxis ticklabel 0, \"10\"\n"; s += "@ xaxis tick major 1, 20\n"; s += "@ xaxis ticklabel 1, \"20\"\n"; s += "@ xaxis tick minor 2, 30\n"; s += "@ xaxis tick minor 3, 40\n"; s += "@ xaxis tick major 4, 50\n"; s += "@ xaxis ticklabel 4, \"50\"\n"; s += "@ xaxis tick minor 5, 60\n"; s += "@ xaxis tick minor 6, 70\n"; s += "@ xaxis tick minor 7, 80\n"; s += "@ xaxis tick minor 8, 90\n"; s += "@ xaxis tick major 9, 100\n"; s += "@ xaxis ticklabel 9, \"100\"\n"; s += "@ xaxis tick major 10, 200\n"; s += "@ xaxis ticklabel 10, \"200\"\n"; s += "@ xaxis tick minor 11, 300\n"; s += "@ xaxis tick minor 12, 400\n"; s += "@ xaxis tick major 13, 500\n"; s += "@ xaxis ticklabel 13, \"500\"\n"; s += "@ xaxis tick minor 14, 600\n"; s += "@ xaxis tick minor 15, 700\n"; s += "@ xaxis tick minor 16, 800\n"; s += "@ xaxis tick minor 17, 900\n"; s += "@ xaxis tick major 18, 1000\n"; s += "@ xaxis ticklabel 18, \"1000\"\n"; s += "@ xaxis tick major 19, 2000\n"; s += "@ xaxis ticklabel 19, \"2000\"\n"; s += "@ xaxis tick minor 20, 3000\n"; s += "@ xaxis tick minor 21, 4000\n"; s += "@ xaxis tick major 22, 5000\n"; s += "@ xaxis ticklabel 22, \"5000\"\n"; s += "@ xaxis tick minor 23, 6000\n"; s += "@ xaxis tick minor 24, 7000\n"; s += "@ xaxis tick minor 25, 8000\n"; s += "@ xaxis tick minor 26, 9000\n"; s += "@ xaxis tick major 27, 10000\n"; s += "@ xaxis ticklabel 27, \"10000\"\n"; s += "@ xaxis tick major 28, 20000\n"; s += "@ xaxis ticklabel 28, \"20000\"\n"; s += "@ xaxis tick minor 29, 30000\n"; s += "@ xaxis tick minor 30, 40000\n"; s += "@ xaxis tick minor 31, 50000\n"; s += "@ xaxis tick minor 32, 60000\n"; s += "@ xaxis tick minor 33, 70000\n"; s += "@ xaxis tick minor 34, 80000\n"; s += "@ xaxis tick minor 35, 90000\n"; s += "@ xaxis tick minor 36, 100000\n"; s += "@ xaxis ticklabel 36, \"1e+05\"\n"; s += "@ yaxis on\n"; s += "@ yaxis type zero false\n"; s += "@ yaxis offset 0.000000 , 0.000000\n"; s += "@ yaxis bar on\n"; s += "@ yaxis bar color 1\n"; s += "@ yaxis bar linestyle 1\n"; s += "@ yaxis bar linewidth 1.0\n"; s += "@ yaxis label \"Level (dB)\"\n"; s += "@ yaxis label layout para\n"; s += "@ yaxis label place auto\n"; s += "@ yaxis label char size 1.000000\n"; s += "@ yaxis label font 0\n"; s += "@ yaxis label color 1\n"; s += "@ yaxis label place normal\n"; s += "@ yaxis tick on\n"; s += "@ yaxis tick major 10\n"; s += "@ yaxis tick minor ticks 1\n"; s += "@ yaxis tick default 6\n"; s += "@ yaxis tick place rounded true\n"; s += "@ yaxis tick in\n"; s += "@ yaxis tick major size 0.500000\n"; s += "@ yaxis tick major color 1\n"; s += "@ yaxis tick major linewidth 1.0\n"; s += "@ yaxis tick major linestyle 1\n"; s += "@ yaxis tick major grid on\n"; s += "@ yaxis tick minor color 1\n"; s += "@ yaxis tick minor linewidth 1.0\n"; s += "@ yaxis tick minor linestyle 2\n"; s += "@ yaxis tick minor grid on\n"; s += "@ yaxis tick minor size 0.250000\n"; s += "@ yaxis ticklabel on\n"; s += "@ yaxis ticklabel format general\n"; s += "@ yaxis ticklabel prec 5\n"; s += "@ yaxis ticklabel formula \"\"\n"; s += "@ yaxis ticklabel append \"\"\n"; s += "@ yaxis ticklabel prepend \"\"\n"; s += "@ yaxis ticklabel angle 0\n"; s += "@ yaxis ticklabel skip 0\n"; s += "@ yaxis ticklabel stagger 0\n"; s += "@ yaxis ticklabel place normal\n"; s += "@ yaxis ticklabel offset auto\n"; s += "@ yaxis ticklabel offset 0.000000 , 0.010000\n"; s += "@ yaxis ticklabel start type auto\n"; s += "@ yaxis ticklabel start 0.000000\n"; s += "@ yaxis ticklabel stop type auto\n"; s += "@ yaxis ticklabel stop 0.000000\n"; s += "@ yaxis ticklabel char size 0.750000\n"; s += "@ yaxis ticklabel font 0\n"; s += "@ yaxis ticklabel color 1\n"; s += "@ yaxis tick place both\n"; s += "@ yaxis tick spec type none\n"; s += "@ altxaxis off\n"; s += "@ altyaxis off\n"; s += "@ legend on\n"; s += "@ legend loctype view\n"; s += "@ legend 0.84941423, 0.8\n"; s += "@ legend box color 1\n"; s += "@ legend box pattern 1\n"; s += "@ legend box linewidth 1.0\n"; s += "@ legend box linestyle 1\n"; s += "@ legend box fill color 0\n"; s += "@ legend box fill pattern 1\n"; s += "@ legend font 0\n"; s += "@ legend char size 1.000000\n"; s += "@ legend color 1\n"; s += "@ legend length 4\n"; s += "@ legend vgap 1\n"; s += "@ legend hgap 1\n"; s += "@ legend invert false\n"; s += "@ frame type 0\n"; s += "@ frame linestyle 1\n"; s += "@ frame linewidth 1.0\n"; s += "@ frame color 1\n"; s += "@ frame pattern 1\n"; s += "@ frame background color 0\n"; s += "@ frame background pattern 0\n"; s += "@ s0 hidden false\n"; s += "@ s0 type xy\n"; s += "@ s0 symbol 9\n"; s += "@ s0 symbol size 0.500000\n"; s += "@ s0 symbol color 2\n"; s += "@ s0 symbol pattern 1\n"; s += "@ s0 symbol fill color 2\n"; s += "@ s0 symbol fill pattern 0\n"; s += "@ s0 symbol linewidth 1.0\n"; s += "@ s0 symbol linestyle 1\n"; s += "@ s0 symbol char 65\n"; s += "@ s0 symbol char font 0\n"; s += "@ s0 symbol skip 0\n"; s += "@ s0 line type 1\n"; s += "@ s0 line linestyle 1\n"; s += "@ s0 line linewidth 2.0\n"; s += "@ s0 line color 1\n"; s += "@ s0 line pattern 1\n"; s += "@ s0 baseline type 0\n"; s += "@ s0 baseline off\n"; s += "@ s0 dropline off\n"; s += "@ s0 fill type 0\n"; s += "@ s0 fill rule 0\n"; s += "@ s0 fill color 1\n"; s += "@ s0 fill pattern 1\n"; s += "@ s0 avalue off\n"; s += "@ s0 avalue type 2\n"; s += "@ s0 avalue char size 1.000000\n"; s += "@ s0 avalue font 0\n"; s += "@ s0 avalue color 1\n"; s += "@ s0 avalue rot 0\n"; s += "@ s0 avalue format general\n"; s += "@ s0 avalue prec 3\n"; s += "@ s0 avalue prepend \"\"\n"; s += "@ s0 avalue append \"\"\n"; s += "@ s0 avalue offset 0.000000 , 0.000000\n"; s += "@ s0 errorbar off\n"; s += "@ s0 errorbar place both\n"; s += "@ s0 errorbar color 2\n"; s += "@ s0 errorbar pattern 1\n"; s += "@ s0 errorbar size 1.000000\n"; s += "@ s0 errorbar linewidth 1.0\n"; s += "@ s0 errorbar linestyle 1\n"; s += "@ s0 errorbar riser linewidth 1.0\n"; s += "@ s0 errorbar riser linestyle 1\n"; s += "@ s0 errorbar riser clip off\n"; s += "@ s0 errorbar riser clip length 0.100000\n"; s += "@ s0 comment \"Exported from Traverso\"\n"; s += "@ s0 legend \"\"\n"; s += "@target G0.S0\n"; s += "@type xy\n"; int n = qMin(m_map_idx2freq.size(), m_avg_db.size()); QString str; for (int i = 0; i < n; ++i) { s += str.sprintf("%.6f %.6f\n", m_map_idx2freq.at(i), m_avg_db.at(i)); } s += "&\n"; return s; } /*******************************************/ /* SpectralMeterConfWidget */ /*******************************************/ SpectralMeterConfigWidget::SpectralMeterConfigWidget( QWidget * parent ) : QDialog(parent) { setupUi(this); groupBoxAdvanced->hide(); load_configuration(); connect(buttonAdvanced, SIGNAL(toggled(bool)), this, SLOT(advancedButton_toggled(bool))); } void SpectralMeterConfigWidget::on_buttonApply_clicked() { save_configuration(); emit configChanged(); } void SpectralMeterConfigWidget::on_buttonClose_clicked( ) { hide(); } void SpectralMeterConfigWidget::advancedButton_toggled(bool b) { if (b) { groupBoxAdvanced->show(); } else { groupBoxAdvanced->hide(); } } void SpectralMeterConfigWidget::save_configuration( ) { config().set_property( "SpectralMeter", "UpperFrequenty", qMax(spinBoxLowerFreq->value(), spinBoxUpperFreq->value()) ); config().set_property( "SpectralMeter", "LowerFrequenty", qMin(spinBoxLowerFreq->value(), spinBoxUpperFreq->value()) ); config().set_property( "SpectralMeter", "UpperdB", qMax(spinBoxUpperDb->value(), spinBoxLowerDb->value()) ); config().set_property( "SpectralMeter", "LowerdB", qMin(spinBoxUpperDb->value(), spinBoxLowerDb->value()) ); config().set_property("SpectralMeter", "NumberOfBands", spinBoxNumBands->value() ); config().set_property("SpectralMeter", "ShowAvarage", checkBoxAverage->isChecked() ); config().set_property("SpectralMeter", "FFTSize", comboBoxFftSize->currentText().toInt() ); config().set_property("SpectralMeter", "WindowingFunction", comboBoxWindowing->currentIndex() ); } void SpectralMeterConfigWidget::load_configuration( ) { int value; value = config().get_property("SpectralMeter", "UpperFrequenty", 22050).toInt(); spinBoxUpperFreq->setValue(value); value = config().get_property("SpectralMeter", "LowerFrequenty", 20).toInt(); spinBoxLowerFreq->setValue(value); value = config().get_property("SpectralMeter", "UpperdB", 0).toInt(); spinBoxUpperDb->setValue(value); value = config().get_property("SpectralMeter", "LowerdB", -90).toInt(); spinBoxLowerDb->setValue(value); value = config().get_property("SpectralMeter", "NumberOfBands", 16).toInt(); spinBoxNumBands->setValue(value); value = config().get_property("SpectralMeter", "ShowAvarage", 0).toInt(); checkBoxAverage->setChecked(value); value = config().get_property("SpectralMeter", "FFTSize", 2048).toInt(); QString str; str = QString("%1").arg(value); int idx = comboBoxFftSize->findText(str); idx = idx == -1 ? 3 : idx; comboBoxFftSize->setCurrentIndex(idx); value = config().get_property("SpectralMeter", "WindowingFunction", 1).toInt(); comboBoxWindowing->setCurrentIndex(value); } //eof traverso-0.49.4/src/traverso/widgets/VUMeter.h000644 001750 001750 00000010210 11163362147 021557 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2006 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: VUMeter.h,v 1.1 2008/05/24 17:41:03 r_sijrier Exp $ */ #ifndef VUMETER_H #define VUMETER_H #include #include #include #include class AudioBus; class AudioChannel; class VUMeterLevel; class QLabel; class VUMeterRuler : public QWidget { Q_OBJECT public: VUMeterRuler(QWidget* parent); protected: void paintEvent( QPaintEvent* e); private: std::vector presetMark; std::vector lineMark; QFont m_font; }; class VUMeter : public QWidget { Q_OBJECT public: VUMeter(QWidget* parent, AudioBus* bus); ~VUMeter(); void reset(); static QVector* vumeter_lut(); protected: void resizeEvent( QResizeEvent* e); void paintEvent( QPaintEvent* e); QSize sizeHint () const; QSize minimumSizeHint () const; private: bool isActive; int m_channels; int m_minSpace; QString m_name; QLabel* channelNameLabel; VUMeterRuler* ruler; static QVector lut; QList m_levels; static void calculate_lut_data(); private slots: void peak_monitoring_stopped(); void peak_monitoring_started(); }; /** * This function returns a pointer to a lookup table mapping dB values * to level meter deflection in percent. The transformation is compliant * with the IEC 60268-18 standard for digital level meters. * * The lookup table covers a range from +6 dB to -70 dB with a resolution * of 0.2 dB, starting with the highest value. +6.0 dB corresponds to * 115% deflection, 0.0 dB to 100%, -70.0 dB close to 0%. * * @return Pointer to the lookup table, which is of format QVector */ inline QVector* VUMeter::vumeter_lut() { if (lut.isEmpty()) { calculate_lut_data(); } return &lut; } class VUMeterOverLed : public QWidget { Q_OBJECT public: VUMeterOverLed(QWidget* parent); public slots: /** * Switches the LED indicator on and off. Connect this slot with the signal * VUMeterLevel::activate_over_led(bool). * * @param b new state of the LED indicator. */ void set_active(bool b); protected: void paintEvent( QPaintEvent* e); private: bool isActive; }; class VUMeterLevel : public QWidget { Q_OBJECT public: VUMeterLevel(QWidget* parent, AudioChannel* chan); void reset(); protected: void paintEvent( QPaintEvent* e); void resizeEvent( QResizeEvent * ); QSize sizeHint () const; QSize minimumSizeHint () const; private: bool activeTail; bool peakHoldFalling; AudioChannel* m_channel; QColor levelClearColor; QPixmap levelPixmap; QPixmap clearPixmap; QTimer timer, phTimer; QLinearGradient gradient2D; float presetMark[7]; float tailDeltaY; float prevPeakValue; float peak; float rms; float maxFalloff; float peakHoldValue; float peakHistory[50]; short unsigned int rmsIndex; short unsigned int overCount; void resize_level_pixmap(); void create_gradients(); int get_meter_position(float); private slots: void stop(); void start(); void update_peak(); void reset_peak_hold_value(); signals: /** * Connect this signal to VUMeterOverLed::set_active(bool). * 'true' is emitted if a signal >0.0 dB is detected. 'false' is emitted * if the connected LED should reset. */ void activate_over_led(bool); }; #endif traverso-0.49.4/src/traverso/widgets/SpectralMeterWidget.h000644 001750 001750 00000006362 11163362147 024163 0ustar00remonremon000000 000000 /* Copyright (C) 2008 Remon Sijrier Copyright (C) 2006 Nicola Doebelin This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef SPECTRALMETERWIDGET_H #define SPECTRALMETERWIDGET_H #include "MeterWidget.h" #include #include "ui_SpectralMeterConfigWidget.h" #include class Sheet; class Project; class QRect; class QPixmap; class Command; class SpectralMeterView; class SpectralMeterConfigWidget : public QDialog, private Ui::SpectralMeterConfigWidget { Q_OBJECT public: SpectralMeterConfigWidget(QWidget* parent = 0); private: void save_configuration(); void load_configuration(); private slots: void on_buttonClose_clicked(); void on_buttonApply_clicked(); void advancedButton_toggled(bool); signals: void configChanged(); }; class SpectralMeterWidget : public MeterWidget { public: SpectralMeterWidget(QWidget* parent); private: SpectralMeterView* get_item(); }; class SpectralMeterView : public MeterView { Q_OBJECT Q_CLASSINFO("edit_properties", tr("Settings...")) Q_CLASSINFO("set_mode", tr("Toggle avarage curve")) Q_CLASSINFO("reset", tr("Reset average curve")) Q_CLASSINFO("export_avarage_curve", tr("Export avarage curve")) Q_CLASSINFO("screen_capture", tr("Capture Screen")) public: SpectralMeterView(SpectralMeterWidget* widget); void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); virtual void resize(); private: QVector specl; QVector specr; QVector m_spectrum; QVector m_history; QVector m_bands; QVector m_freq_labels; QVector m_avg_db; QVector m_map_idx2xpos; QVector m_map_idx2freq; QRect m_rect; SpectralMeterConfigWidget *m_config; QPixmap bgPixmap; uint num_bands; uint sample_rate; float upper_freq; float lower_freq; float upper_db; float lower_db; int margin_l; int margin_r; int margin_t; int margin_b; uint sample_weight; uint fft_size; float xfactor; float upper_freq_log; float lower_freq_log; float freq_step; int bar_offset; bool show_average; bool update_average; void reduce_bands(); void update_layout(); void update_freq_map(); float db2ypos(float); float freq2xpos(float); void update_background(); float freq2db(float, float); QString get_xmgr_string(); private slots: void update_data(); public slots: void load_configuration(); void set_sheet(Sheet* sheet); Command* edit_properties(); Command* set_mode(); Command* reset(); Command* export_avarage_curve(); Command* screen_capture(); }; #endif traverso-0.49.4/src/traverso/widgets/MeterWidget.h000644 001750 001750 00000003661 11163362147 022464 0ustar00remonremon000000 000000 /* Copyright (C) 2008 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef METER_WIDGET_H #define METER_WIDGET_H #include #include #include class MeterView; class Sheet; class Project; class Plugin; class MeterWidget : public ViewPort { public: MeterWidget(QWidget* parent, MeterView* item); ~MeterWidget(); void get_pointed_context_items(QList &list); protected: void resizeEvent( QResizeEvent* e); void hideEvent ( QHideEvent * event ); void showEvent ( QShowEvent * event ); QSize minimumSizeHint () const; QSize sizeHint () const; MeterView* m_item; }; class MeterView : public ViewItem { Q_OBJECT public: MeterView(MeterWidget* widget); ~MeterView(); virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) {}; virtual void resize(); void hide_event(); void show_event(); protected: MeterWidget* m_widget; Plugin* m_meter; QTimer timer; QTimer m_delayTimer; Project* m_project; Sheet* m_sheet; void set_sheet( Sheet* ); private slots: void set_project( Project* ); virtual void update_data() {}; void transport_started(); void transport_stopped(); void delay_timeout(); }; #endif traverso-0.49.4/src/traverso/widgets/CorrelationMeterWidget.h000644 001750 001750 00000003145 11163362147 024663 0ustar00remonremon000000 000000 /* Copyright (C) 2008 Remon Sijrier Copyright (C) 2005-2006 Nicola Doebelin This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef CORRELATIONMETERWIDGET_H #define CORRELATIONMETERWIDGET_H #include "MeterWidget.h" class Command; class QLinearGradient; class QColor; class CorrelationMeterWidget : public MeterWidget { public: CorrelationMeterWidget(QWidget* parent); }; class CorrelationMeterView : public MeterView { Q_OBJECT Q_CLASSINFO("set_mode", tr("Toggle display range")) public: CorrelationMeterView(CorrelationMeterWidget* widget); void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); private: float coeff; float direction; QLinearGradient gradPhase; int range; void save_configuration(); void load_configuration(); private slots: void update_data(); void set_sheet(Sheet* sheet); public slots: Command* set_mode(); }; #endif traverso-0.49.4/src/traverso/widgets/CorrelationMeterWidget.cpp000644 001750 001750 00000012071 11163362147 025214 0ustar00remonremon000000 000000 /* Copyright (C) 2008 Remon Sijrier Copyright (C) 2005-2006 Nicola Doebelin This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "CorrelationMeterWidget.h" #include #include #include #include #include #include #include // used for fabs // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" static const float SMOOTH_SHIFT = 0.05; CorrelationMeterWidget::CorrelationMeterWidget(QWidget* parent) : MeterWidget(parent, new CorrelationMeterView(this)) { PENTERCONS; } CorrelationMeterView::CorrelationMeterView(CorrelationMeterWidget* widget) : MeterView(widget) { gradPhase.setColorAt(0.0, themer()->get_color("CorrelationMeter:foreground:side")); gradPhase.setColorAt(0.5, themer()->get_color("CorrelationMeter:foreground:center")); gradPhase.setColorAt(1.0, themer()->get_color("CorrelationMeter:foreground:side")); load_configuration(); } void CorrelationMeterView::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { Q_UNUSED(option); Q_UNUSED(widget); PENTER3; float r = 90.0f / range; painter->fillRect(0, 0, m_widget->width(), m_widget->height(), themer()->get_color("CorrelationMeter:background")); int lend = int(0.5*m_widget->width() - (-coeff + 1.0) * r * m_widget->width() * (1.0 - fabs(direction))); int rend = int(0.5*m_widget->width() + (-coeff + 1.0) * r * m_widget->width() * (1.0 - fabs(direction))); int wdt = abs(lend - rend); int centerOffset = int(m_widget->width() * r * direction); int lpos = int((0.50 - r) * m_widget->width()); int cpos = m_widget->width()/2; int rpos = int((0.50 + r) * m_widget->width()); gradPhase.setStart(QPointF(float(lend + centerOffset), 0.0)); gradPhase.setFinalStop(QPointF(float(rend + centerOffset), 0.0)); painter->fillRect(lend + centerOffset, 0, wdt, m_widget->height(), gradPhase); // center line QPen pen(themer()->get_color("CorrelationMeter:centerline")); pen.setWidth(3); painter->setPen(pen); painter->drawLine(m_widget->width()/2 + centerOffset, 0, m_widget->width()/2 + centerOffset, m_widget->height()); painter->setPen(themer()->get_color("CorrelationMeter:grid")); painter->drawLine(cpos, 0, cpos, m_widget->height()); if (range > 180) { painter->drawLine(lpos, 0, lpos, m_widget->height()); painter->drawLine(rpos, 0, rpos, m_widget->height()); } painter->setFont(themer()->get_font("CorrelationMeter:fontscale:label")); QFontMetrics fm(themer()->get_font("CorrelationMeter:fontscale:label")); if (m_widget->height() < 2*fm.height()) { return; } painter->setPen(themer()->get_color("CorrelationMeter:text")); painter->fillRect(0, 0, m_widget->width(), fm.height() + 1, themer()->get_color("CorrelationMeter:margin")); painter->drawText(cpos - fm.width("C")/2, fm.ascent() + 1, "C"); if (range == 180) { painter->drawText(1, fm.ascent() + 1, "L"); painter->drawText(m_widget->width() - fm.width("R") - 1, fm.ascent() + 1, "R"); } else { painter->drawText(lpos - fm.width("L")/2, fm.ascent() + 1, "L"); painter->drawText(rpos - fm.width("R")/2, fm.ascent() + 1, "R"); } } void CorrelationMeterView::update_data() { if (!m_meter) { return; } // MultiMeter::get_data() will assign it's data to coef and direction // if no data was available, return, so we _only_ update the widget when // it needs to be! if (((CorrelationMeter*)m_meter)->get_data(coeff, direction) == 0) { return; } update(); } void CorrelationMeterView::set_sheet(Sheet *sheet) { MeterView::set_sheet(sheet); if ( ! m_sheet ) { return; } PluginChain* chain = m_sheet->get_plugin_chain(); foreach(Plugin* plugin, chain->get_plugin_list()) { m_meter = dynamic_cast(plugin); if (m_meter) { return; } } m_meter = new CorrelationMeter(); m_meter->init(); Command::process_command( chain->add_plugin(m_meter, false) ); } Command* CorrelationMeterView::set_mode() { switch (range) { case 180 : range = 240; break; case 240 : range = 360; break; case 360 : range = 180; break; } update(); save_configuration(); return 0; } void CorrelationMeterView::save_configuration() { config().set_property("CorrelationMeter", "Range", range); } void CorrelationMeterView::load_configuration() { range = config().get_property("CorrelationMeter", "Range", 360).toInt(); } //eof traverso-0.49.4/src/traverso/widgets/TransportConsoleWidget.h000644 001750 001750 00000003266 11163362147 024730 0ustar00remonremon000000 000000 /* Copyright (C) 2008 Nicola Doebelin This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef TRANSPORTCONSOLEWIDGET_H #define TRANSPORTCONSOLEWIDGET_H #include #include #include "defines.h" class Project; class Sheet; class QPushButton; class TransportConsoleWidget : public QToolBar { Q_OBJECT public: TransportConsoleWidget(QWidget* parent); private: QPushButton* m_timeLabel; Project* m_project; Sheet* m_sheet; QAction* m_toStartAction; QAction* m_toLeftAction; QAction* m_recAction; QAction* m_playAction; QAction* m_toEndAction; QAction* m_toRightAction; QTimer m_updateTimer; TimeRef m_lastSnapPosition; protected slots: void set_project(Project*); void set_sheet(Sheet*); private slots: void to_start(); void to_left(); void rec_toggled(); void play_toggled(); void to_end(); void to_right(); void transport_started(); void transport_stopped(); void update_recording_state(); void update_label(); void update_layout(); }; #endif traverso-0.49.4/src/traverso/widgets/VUMeter.cpp000644 001750 001750 00000047242 11163362147 022131 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2006 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: VUMeter.cpp,v 1.1 2008/05/24 17:41:03 r_sijrier Exp $ */ #include "VUMeter.h" #include #include #include #include #include #include #include #include #include "Themer.h" #include "Mixer.h" #include #include #include // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" /** * \class VUMeter * \brief A widget holding level indicators, 'over' LEDs, and a scale * * The VUMeter class is a widget that holds one or more level indicators (VUMeterLevel), * one or more 'over' LEDs (VUMeterOverLed), and one scale (VUMeterRuler). Usually one * VUMeter per track is created, which contains one level indicator and 'over' LED per * audio channel (2 for stereo) and one scale. The name of the track is shown below * the level indicators. * * The scale is hidden automatically if the width of the widget becomes too narrow. * * All VUMeter related classes are designed to be arranged in a QGridLayout so as to * resize correctly. */ static const int MAXIMUM_WIDTH = 150; static const int VULED_HEIGHT = 8; // initialize static variables QVector VUMeter::lut; VUMeter::VUMeter(QWidget* parent, AudioBus* bus) : QWidget(parent) { setMaximumWidth(MAXIMUM_WIDTH); m_minSpace = 0; int vulevelspacing = themer()->get_property("VUMeter:layout:vuspacing", 3).toInt(); int vulayoutspacing = themer()->get_property("VUMeter:layout:vulayoutspacing", 5).toInt(); int mainlayoutmargin = themer()->get_property("VUMeter:layout:mainlayoutmargin", 1).toInt(); int mainlayoutspacing = themer()->get_property("VUMeter:layout:mainlayoutspacing", 2).toInt(); QWidget* levelLedLayoutwidget = new QWidget(this); QHBoxLayout* levelLedLayout = new QHBoxLayout(levelLedLayoutwidget); levelLedLayout->setSpacing(0); levelLedLayout->setMargin(0); levelLedLayout->addSpacing(vulayoutspacing); levelLedLayoutwidget->setLayout(levelLedLayout); m_minSpace += levelLedLayout->spacing(); for (int i = 0; i < bus->get_channel_count(); ++i) { QWidget* widget = new QWidget(this); QVBoxLayout* levellayout = new QVBoxLayout(widget); levellayout->setMargin(0); levellayout->setSpacing(0); VUMeterOverLed* led = new VUMeterOverLed(levelLedLayoutwidget); VUMeterLevel* level = new VUMeterLevel(levelLedLayoutwidget, bus->get_channel(i)); m_levels.append(level); connect(level, SIGNAL(activate_over_led(bool)), led, SLOT(set_active(bool))); levellayout->addWidget(led); levellayout->addWidget(level, 5); m_minSpace += level->minimumWidth(); levelLedLayout->addWidget(widget); if (i < bus->get_channel_count() - 1) { levelLedLayout->addSpacing(vulevelspacing); m_minSpace += vulevelspacing; } } // add a ruler with tickmarks and labels ruler = new VUMeterRuler(this); levelLedLayout->addWidget(ruler); m_minSpace += ruler->maximumWidth(); levelLedLayout->addSpacing(vulayoutspacing); m_minSpace += vulayoutspacing; // add a tooltip showing the channel name m_name = bus->get_name(); m_channels = bus->get_channel_count(); setToolTip(m_name); // initialize some stuff isActive = false; setAutoFillBackground(false); setAttribute(Qt::WA_OpaquePaintEvent); channelNameLabel = new QLabel(this); channelNameLabel->setFont(themer()->get_font("VUMeter:fontscale:label")); channelNameLabel->setAlignment(Qt::AlignHCenter); QVBoxLayout* mainlayout = new QVBoxLayout; mainlayout->addSpacing(5); mainlayout->addWidget(levelLedLayoutwidget, 5); mainlayout->addWidget(channelNameLabel); mainlayout->setMargin(mainlayoutmargin); mainlayout->setSpacing(mainlayoutspacing); m_minSpace += mainlayout->spacing(); setLayout(mainlayout); } VUMeter::~ VUMeter( ) {} void VUMeter::paintEvent( QPaintEvent * ) { PENTER3; QPainter painter(this); painter.fillRect( 0 , 0 , width(), height() , themer()->get_color("VUMeter:background:widget") ); } void VUMeter::resizeEvent( QResizeEvent * ) { PENTER3; QFontMetrics fm(themer()->get_font("VUMeter:fontscale:label")); // Comment by Remon: Why the -1 here???? Without the -1 it seems to work correctly too? // Reply by Nic: It doesn't here (PPC). The label can't become smaller than the text width, // so we have to elide the text before the label reaches it's minimum width. QString label = fm.elidedText(m_name, Qt::ElideMiddle, channelNameLabel->width()-1); if (label.length() == 1) { label = m_name.left(1) + m_name.right(1); } channelNameLabel->setText(label); if (width() >= m_minSpace) { ruler->show(); } else { ruler->hide(); } } QSize VUMeter::sizeHint() const { return QSize(100, 200); } QSize VUMeter::minimumSizeHint() const { return QSize(100, 200); } void VUMeter::calculate_lut_data() { for (int i = 60; i >= -700; i -= 2) { if (i >= -200) { lut.push_back(100.0 + (float)i * 2.5 / 10.0); } else if (i >= -300) { lut.push_back( 50.0 + float(i+200) * 2.0 / 10.0); } else if (i >= -400) { lut.push_back( 30.0 + float(i+300) * 1.5 / 10.0); } else if (i >= -500) { lut.push_back( 15.0 + float(i+400) * 0.75 / 10.0); } else { lut.push_back( 7.5 + float(i+500) * 0.5 / 10.0); } } } void VUMeter::peak_monitoring_stopped() { hide(); } void VUMeter::peak_monitoring_started() { show(); } void VUMeter::reset() { foreach(VUMeterLevel* level, m_levels) { level->reset(); } } /**********************************************************************/ /* VUMeterRuler */ /**********************************************************************/ /** * \class VUMeterRuler * \brief A scale which places tick marks and labels from +6.0 to -60.0 dB * * The scale is compliant with IEC standard 60268-18 and uses VUMeter::vumeter_lut() * to map dB values to widget positions. */ static const int TICK_LINE_LENGTH = 3; static const float LUT_MULTIPLY = 5.0; VUMeterRuler::VUMeterRuler(QWidget* parent) : QWidget(parent) { setAutoFillBackground(false); QFontMetrics fm(themer()->get_font("VUMeter:fontscale:label")); setMinimumWidth(fm.width("-XX")+TICK_LINE_LENGTH + 3); setMaximumWidth(fm.width("-XX")+TICK_LINE_LENGTH + 4); // labels presetMark.push_back(6); presetMark.push_back(0); presetMark.push_back(-5); presetMark.push_back(-10); presetMark.push_back(-15); presetMark.push_back(-20); presetMark.push_back(-25); presetMark.push_back(-30); presetMark.push_back(-35); presetMark.push_back(-40); presetMark.push_back(-50); presetMark.push_back(-60); // tick marks for (int i = 6; i >= -20; --i) { lineMark.push_back(i); } lineMark.push_back(-25); lineMark.push_back(-30); lineMark.push_back(-35); lineMark.push_back(-40); lineMark.push_back(-45); lineMark.push_back(-50); lineMark.push_back(-60); } void VUMeterRuler::paintEvent( QPaintEvent* ) { PENTER4; QFontMetrics fm(themer()->get_font("VUMeter:fontscale:label")); QString spm; int deltaY; QPainter painter(this); painter.setFont(themer()->get_font("VUMeter:fontscale:label")); // offset is the space occupied by the 'over' LED float levelRange = float(height() - VULED_HEIGHT); // draw line marks painter.setPen(themer()->get_color("VUMeter:font:inactive")); for (uint j = 0; j < lineMark.size(); ++j) { int idx = int(LUT_MULTIPLY * float((-lineMark[j] + 6))); if ((idx < 0) || (idx >= VUMeter::vumeter_lut()->size())) { continue; } deltaY = (int) ( VUMeter::vumeter_lut()->at(idx)/115.0 * levelRange ); painter.drawLine(0, height() - deltaY, TICK_LINE_LENGTH, height() - deltaY); } painter.setPen(themer()->get_color("VUMeter:font:active")); QRect markRect(0, 0, width(), fm.ascent()); // draw the labels for (uint j = 0; j < presetMark.size(); ++j) { // skip some labels if the widget is too small if ((height() < 120) && ((j == 0) || (j == 2) || (j == 4) || (j == 6) || (j == 7) || (j == 9))) { continue; } // skip some labels if the widget is too small if ((height() < 220) && ((j == 8) || (j == 10))) { continue; } int idx = int(LUT_MULTIPLY * float(-presetMark[j] + 6)); // check the LUT index (I had exceptions without that check) if ((idx < 0) || (idx >= VUMeter::vumeter_lut()->size())) { continue; } deltaY = (int) ( VUMeter::vumeter_lut()->at(idx)/115.0 * levelRange ); spm.sprintf("%2i", presetMark[j]); markRect.setY(height() - deltaY - fm.ascent()/2 - 1); markRect.setHeight(fm.ascent()); if (markRect.bottom() >= height()) { markRect.translate(0, height() - markRect.bottom() - 1); } painter.drawText(markRect, Qt::AlignRight, spm); painter.drawLine(0, height() - deltaY, TICK_LINE_LENGTH, height() - deltaY); } } /**********************************************************************/ /* VUMeterOverLed */ /**********************************************************************/ /** * \class VUMeterOverLed * \brief An LED-styled widget indicating audio levels > 0.0 dB * * An LED-styled widget that indicates audio levels > 0.0 dB. It looks like a warning lamp * and can be switched on and off. It doesn't analyze audio data itself. * * A VUMeterOverLed is usually constructed within a VUMeter object in conjunction with a * VUMeterLevel object. It can be switched on to indicate the occurrence of audio levels * > 0.0 dB. */ static const int THREE_D_LIMIT = 8; VUMeterOverLed::VUMeterOverLed(QWidget* parent) : QWidget(parent) { int minimumwidth = themer()->get_property("VUMeter:layout:minimumlevelwidth", 6).toInt(); setAutoFillBackground(false); setMinimumWidth(minimumwidth); setMinimumHeight(VULED_HEIGHT); isActive = false; } void VUMeterOverLed::paintEvent( QPaintEvent* ) { PENTER4; QPainter painter(this); if (!isActive) { painter.fillRect(0, 0, width(), height(), themer()->get_color("VUMeter:overled:inactive")); return; } if (width() < THREE_D_LIMIT) { painter.fillRect(0, 0, width(), height(), themer()->get_color("VUMeter:overled:active")); return; } // draw in 3d mode QColor col = themer()->get_color("VUMeter:overled:active"); painter.fillRect(0, 0, width(), height(), themer()->get_color("VUMeter:background:bar")); painter.fillRect(2, 2, width()-4, height()-4, col); col.setRgb(255, 255, 255); col.setAlpha(200); painter.setPen(col); painter.drawLine(1, 1, 1, height()-2); painter.drawLine(1, 1, width()-2, 1); col.setRgb(0, 0, 0); col.setAlpha(100); painter.setPen(col); painter.drawLine(width()-2, 1, width()-2, height()-2); painter.drawLine(1, height()-2, width()-2, height()-2); } void VUMeterOverLed::set_active(bool b) { if (b == isActive) { return; } isActive = b; update(); } /**********************************************************************/ /* VUMeterLevel */ /**********************************************************************/ /** * \class VUMeterLevel * \brief An audio level indicator widget * * This is a digital audio level meter which is compliant with the IEC standard * 60268-18. It ranges from +6.0 dB to -70.0 dB. * * A VUMeterLevel is usually constructed within a VUMeter object. The audio level is * read from an AudioChannel object, which must be given in the constructor. The * VUMeterLevel is optimized for efficient space usage and switches from 3D look * to 2D look for narrow sizes. */ static const int OVER_SAMPLES_COUNT = 2; // sensitivity of the 'over' indicator static const int RMS_SAMPLES = 50; // number of updates to be stored for RMS calculation static const int UPDATE_FREQ = 40; // frame rate of the level meter (update interval in ms) static const int PEAK_HOLD_TIME = 1000; // peak hold time (ms) static const int PEAK_HOLD_MODE = 1; // 0 = no peak hold, 1 = dynamic, 2 = constant static const bool SHOW_RMS = false; // toggle RMS lines on / off VUMeterLevel::VUMeterLevel(QWidget* parent, AudioChannel* chan) : QWidget(parent) , m_channel(chan) { levelClearColor = themer()->get_color("VUMeter:background:bar"); int minimumwidth = themer()->get_property("VUMeter:layout:minimumlevelwidth", 6).toInt(); tailDeltaY = peakHoldValue = rms = -120.0; overCount = rmsIndex = 0; peakHoldFalling = false; peak = 0.0; // falloff speed, according to IEC 60268-18: 20 dB in 1.7 sec. maxFalloff = 20.0 / (1700.0 / (float)UPDATE_FREQ); for (int i = 0; i < RMS_SAMPLES; i++) { peakHistory[i] = 0.0; } create_gradients(); setAttribute(Qt::WA_OpaquePaintEvent); setAttribute(Qt::WA_PaintOnScreen); setAutoFillBackground(false); setMinimumWidth(minimumwidth); connect(&audiodevice(), SIGNAL(stopped()), this, SLOT(stop())); connect(&timer, SIGNAL(timeout()), this, SLOT(update_peak())); connect(&phTimer, SIGNAL(timeout()), this, SLOT(reset_peak_hold_value())); timer.start(UPDATE_FREQ); if (PEAK_HOLD_MODE == 1) { phTimer.start(PEAK_HOLD_TIME); } } void VUMeterLevel::paintEvent( QPaintEvent* ) { PENTER4; QPixmap pix(width(), height()); QPainter painter(&pix); QPainter directpainter(this); // convert the peak value to dB and make sure it's in a valid range float dBVal = coefficient_to_dB(peak); if (dBVal > 6.0) { dBVal = 6.0; } // calculate smooth falloff if (tailDeltaY - dBVal > maxFalloff) { dBVal = tailDeltaY - maxFalloff; tailDeltaY -= maxFalloff; } else { tailDeltaY = dBVal; } // check for a new peak hold value if (peakHoldFalling && (peakHoldValue >= -120.0)) { // smooth falloff, a little faster than the level meter, looks better peakHoldValue -= 1.2*maxFalloff; } if (peakHoldValue <= dBVal) { peakHoldFalling = false; peakHoldValue = dBVal; // Comment by Remon: EHH?? The phTimer is still running since it _is_ allready started from the // constructor, right? We don't stop the timer anywhere... // Reply by Nic: The timer is REstarted here, which is done by QTimer::start(int) as well. // We want the new peak hold value to be held for 1 sec., so we restart the timer // as soon as a new phvalue was detected. if (PEAK_HOLD_MODE == 1) { phTimer.start(PEAK_HOLD_TIME); } } // convert dB values into widget position int meterLevel = get_meter_position(dBVal); int rmsLevel = get_meter_position(coefficient_to_dB(rms)); int peakHoldLevel = get_meter_position(peakHoldValue); // draw levels painter.drawPixmap(0, 0, clearPixmap, 0, 0, width(), meterLevel); if (meterLevel < height()) { painter.drawPixmap(0, meterLevel, levelPixmap, 0, meterLevel, width(), height() - meterLevel); } // draw RMS lines if (SHOW_RMS) { painter.setPen(Qt::white); // Comment by Remon: Somehow the line seems to be one pixel shorter // at the right size. Makes the lines look odd (just one pixel) // when vu's are very small. Changing - 4 to - 3 solves it for me // any ideas? // Reply by Nic: Indeed, obviously drawing stops 1 pixel before the // length specified. painter.drawLine(2, rmsLevel, width() - 3, rmsLevel); } // draw Peak hold lines if (PEAK_HOLD_MODE) { painter.setPen(themer()->get_color("VUMeter:overled:active")); // Comment by Remon: Same here painter.drawLine(2, peakHoldLevel, width() - 3, peakHoldLevel); } directpainter.drawPixmap(0, 0, pix); } void VUMeterLevel::resize_level_pixmap( ) { levelPixmap = QPixmap(width(), height()); QPainter painter(&levelPixmap); gradient2D.setFinalStop(QPointF(0.0, height())); painter.fillRect(0, 0, width(), height(), gradient2D); // 3D look if there's enough space if (width() >= THREE_D_LIMIT) { QColor lcol(Qt::white); QColor rcol(Qt::black); lcol.setAlpha(200); rcol.setAlpha(100); painter.setPen(lcol); painter.drawLine(1, 0, 1, height()); painter.setPen(rcol); painter.drawLine(width()-2, 0, width()-2, height()); painter.setPen(QPen(themer()->get_color("VUMeter:background:bar"))); painter.drawLine(0, 0, 0, height()); painter.drawLine(width()-1, 0, width()-1, height()); } clearPixmap = QPixmap(width(), height()); clearPixmap.fill(levelClearColor); } void VUMeterLevel::update_peak( ) { peak = m_channel->get_peak_value(); // if the meter drops to -inf, reset the 'over LED' and peak hold values if ((peak == 0.0) && (tailDeltaY <= -70.0)) { peakHoldValue = -120.0; emit activate_over_led(false); return; } // RMS lines if (SHOW_RMS) { // use some kind of 'ring buffer' to store the last couple of peak values if (rmsIndex >= RMS_SAMPLES) { rmsIndex = 0; } peakHistory[rmsIndex] = peak; // calculate the RMS float squares = 0.0; for (int i = 0; i < RMS_SAMPLES; i++) { squares += peakHistory[i] * peakHistory[i]; } rms = sqrt(squares / float(RMS_SAMPLES)); rmsIndex++; } // 'over' detection if (peak >= 1.0) overCount++; if (peak < 1.0) overCount = 0; if (overCount >= OVER_SAMPLES_COUNT) { emit activate_over_led(true); overCount = 0; } update(); } void VUMeterLevel::stop( ) { timer.stop(); emit activate_over_led(false); } void VUMeterLevel::start( ) { } void VUMeterLevel::resizeEvent(QResizeEvent *) { resize_level_pixmap(); } QSize VUMeterLevel::sizeHint() const { return QSize(10, 40); } QSize VUMeterLevel::minimumSizeHint() const { return QSize(10, 40); } void VUMeterLevel::reset_peak_hold_value() { peakHoldFalling = true; } void VUMeterLevel::create_gradients() { float zeroDB = 1.0 - 100.0/115.0; // 0 dB position float msixDB = 1.0 - 80.0/115.0; // -6 dB position float smooth = 0.05; gradient2D.setStart(0,0); gradient2D.setColorAt(0.0 , themer()->get_color("VUMeter:foreground:6db")); gradient2D.setColorAt(zeroDB-smooth, themer()->get_color("VUMeter:foreground:6db")); gradient2D.setColorAt(zeroDB+smooth, themer()->get_color("VUMeter:foreground:0db")); gradient2D.setColorAt(msixDB-smooth, themer()->get_color("VUMeter:foreground:0db")); gradient2D.setColorAt(msixDB+smooth, themer()->get_color("VUMeter:foreground:-6db")); gradient2D.setColorAt(1.0 , themer()->get_color("VUMeter:foreground:-60db")); } // accepts dB-values and returns the position in the widget from top int VUMeterLevel::get_meter_position(float f) { int idx = int(LUT_MULTIPLY * (-f + 6.0)); // Comment by Remon: If it happens, then it's a coding error? // if so, it could be an idea to hard check for this by using: // Q_ASSERT(idx < 0) (iirc) or, using something like a // qDebug("....") thing. Just an idea... // Reply by Nic: It's not a coding error, it happens for f > +6.0. // The following part clips the value to +6.0, which is the // highest value the LUT contains. I changed the comment accordingly. // clipping to the highest value covered by the LUT (+6.0 dB) if (idx < 0) { idx = 0; } // if idx > size of the LUT, dBVal is somewhere < -70 dB, which is not displayed if (idx >= VUMeter::vumeter_lut()->size()) { return height(); } else { return height() - int(VUMeter::vumeter_lut()->at(idx)/115.0 * (float)height()); } } void VUMeterLevel::reset() { tailDeltaY = -120.0; peakHoldValue = -120.0; overCount = 0; emit activate_over_led(false); peak = 0; update(); } traverso-0.49.4/src/traverso/widgets/ResourcesWidget.h000644 001750 001750 00000005662 11163362147 023365 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef RESOURCESWIDGET_H #define RESOURCESWIDGET_H #include #include #include "ui_ResourcesWidget.h" class Project; class Sheet; class AudioClip; class ReadSource; class SourceTreeItem; class QShowEvent; class QListView; class QDirModel; class QComboBox; class FileWidget : public QWidget { Q_OBJECT public: FileWidget(QWidget* parent=0) : QWidget(parent) { m_dirModel = 0; } void showEvent ( QShowEvent * event ); void set_current_path(const QString& path) const; private slots: void dirview_item_clicked(const QModelIndex & index); void dir_up_button_clicked(); void refresh_button_clicked(); void box_actived(int i); private: QListView* m_dirView; QDirModel* m_dirModel; QComboBox* m_box; }; class ClipTreeItem : public QObject, public QTreeWidgetItem { Q_OBJECT public: ClipTreeItem(SourceTreeItem* parent, AudioClip* clip); void apply_filter(Sheet* sheet); public slots: void clip_state_changed(); private: AudioClip* m_clip; }; class SourceTreeItem : public QObject, public QTreeWidgetItem { Q_OBJECT public: SourceTreeItem(QTreeWidget* parent, ReadSource* source); void apply_filter(Sheet* sheet); private: ReadSource* m_source; public slots: void source_state_changed(); }; class ResourcesWidget : public QWidget, protected Ui::ResourcesWidget { Q_OBJECT public: ResourcesWidget(QWidget* parent=0); ~ResourcesWidget(); protected: void showEvent( QShowEvent * event ); void resizeEvent( QResizeEvent * e ); private: Project* m_project; Sheet* m_currentSheet; FileWidget* m_filewidget; QHash m_clipindices; QHash m_sourceindices; void update_clip_state(AudioClip* clip); void update_source_state(qint64 id); void filter_on_current_sheet(); private slots: void set_project(Project* project); void project_load_finished(); void view_combo_box_index_changed(int index); void sheet_combo_box_index_changed(int index); void sheet_added(Sheet* sheet); void sheet_removed(Sheet* sheet); void set_current_sheet(Sheet* sheet); void add_clip(AudioClip* clip); void remove_clip(AudioClip* clip); void add_source(ReadSource* source); void remove_source(ReadSource* source); }; #endif traverso-0.49.4/src/traverso/widgets/ExportFormatOptionsWidget.h000644 001750 001750 00000002534 11163362147 025414 0ustar00remonremon000000 000000 /* Copyright (C) 2008 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef EXPORT_FORMAT_OPTIONS_WIDGET_H #define EXPORT_FORMAT_OPTIONS_WIDGET_H #include "ui_ExportFormatOptionsWidget.h" #include struct ExportSpecification; class ExportFormatOptionsWidget : public QWidget, protected Ui::ExportFormatOptionsWidget { Q_OBJECT public: ExportFormatOptionsWidget(QWidget* parent = 0); ~ExportFormatOptionsWidget(); void get_format_options(ExportSpecification* spec); private slots: void audio_type_changed(int index); void mp3_method_changed(int index); void ogg_method_changed(int index); }; #endif //eof traverso-0.49.4/src/traverso/widgets/TransportConsoleWidget.cpp000644 001750 001750 00000012417 11163362147 025261 0ustar00remonremon000000 000000 /* Copyright (C) 2008 Nicola Doebelin This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "TransportConsoleWidget.h" #include "Themer.h" #include "Sheet.h" #include "Utils.h" #include "Track.h" #include "ProjectManager.h" #include "Project.h" #include "Config.h" #include "Information.h" #include #include #include #include #include #include // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" TransportConsoleWidget::TransportConsoleWidget(QWidget* parent) : QToolBar(parent) { setEnabled(false); m_timeLabel = new QPushButton(this); m_timeLabel->setFocusPolicy(Qt::NoFocus); m_timeLabel->setStyleSheet( "color: lime;" "background-color: black;" "font: 19px;" "border: 2px solid gray;" "border-radius: 10px;" "padding: 0 8 0 8;"); m_toStartAction = addAction(QIcon(":/skipleft"), tr("Skip to Start"), this, SLOT(to_start())); m_toLeftAction = addAction(QIcon(":/seekleft"), tr("Previous Snap Position"), this, SLOT(to_left())); m_recAction = addAction(QIcon(":/record"), tr("Record"), this, SLOT(rec_toggled())); m_playAction = addAction(QIcon(":/playstart"), tr("Play / Stop"), this, SLOT(play_toggled())); m_toRightAction = addAction(QIcon(":/seekright"), tr("Next Snap Position"), this, SLOT(to_right())); m_toEndAction = addAction(QIcon(":/skipright"), tr("Skip to End"), this, SLOT(to_end())); addWidget(m_timeLabel); m_recAction->setCheckable(true); m_playAction->setCheckable(true); m_lastSnapPosition = TimeRef(); connect(&pm(), SIGNAL(projectLoaded(Project*)), this, SLOT(set_project(Project*))); connect(&m_updateTimer, SIGNAL(timeout()), this, SLOT(update_label())); update_layout(); } void TransportConsoleWidget::set_project(Project* project) { m_project = project; if (m_project) { connect(m_project, SIGNAL(currentSheetChanged(Sheet*)), this, SLOT(set_sheet(Sheet*))); } else { m_updateTimer.stop(); set_sheet(0); } } void TransportConsoleWidget::set_sheet(Sheet* sheet) { m_sheet = sheet; if (!m_sheet) { m_updateTimer.stop(); setEnabled(false); return; } setEnabled(true); connect(m_sheet, SIGNAL(recordingStateChanged()), this, SLOT(update_recording_state())); connect(m_sheet, SIGNAL(transportStarted()), this, SLOT(transport_started())); connect(m_sheet, SIGNAL(transportStopped()), this, SLOT(transport_stopped())); connect(m_sheet, SIGNAL(transportPosSet()), this, SLOT(update_label())); update_label(); } void TransportConsoleWidget::to_start() { m_sheet->skip_to_start(); } void TransportConsoleWidget::to_left() { m_sheet->prev_skip_pos(); } void TransportConsoleWidget::rec_toggled() { m_sheet->set_recordable(); } void TransportConsoleWidget::play_toggled() { m_sheet->start_transport(); } void TransportConsoleWidget::to_end() { m_sheet->skip_to_end(); } void TransportConsoleWidget::to_right() { m_sheet->next_skip_pos(); } void TransportConsoleWidget::transport_started() { // use an odd number for the update interval, because // a round number (e.g. 100) lets the last digit stay // the same most of the time, but not always, which // looks jerky m_updateTimer.start(123); m_playAction->setChecked(true); m_playAction->setIcon(QIcon(":/playstop")); m_recAction->setEnabled(false); // this is needed when the record button is pressed, but no track is armed. // uncheck the rec button in that case if (!m_sheet->is_recording()) { m_recAction->setChecked(false); } } void TransportConsoleWidget::transport_stopped() { m_updateTimer.stop(); m_playAction->setChecked(false); m_playAction->setIcon(QIcon(":/playstart")); m_recAction->setEnabled(true); } void TransportConsoleWidget::update_recording_state() { if (!m_sheet) { return; } if (m_sheet->is_recording()) { QString recordFormat = config().get_property("Recording", "FileFormat", "wav").toString(); int count = 0; foreach(Track* track, m_sheet->get_tracks()) { if (track->armed()) { count++; } } info().information(tr("Recording to %1 Tracks, encoding format: %2").arg(count).arg(recordFormat)); m_recAction->setChecked(true); } else { m_recAction->setChecked(false); } } void TransportConsoleWidget::update_label() { QString currentTime; if (!m_sheet) { currentTime = "0:00.0"; } else { currentTime = timeref_to_ms_2(m_sheet->get_transport_location()); } m_timeLabel->setText(currentTime); } void TransportConsoleWidget::update_layout() { int iconsize = config().get_property("Themer", "transportconsolesize", "22").toInt(); setIconSize(QSize(iconsize, iconsize)); } //eof traverso-0.49.4/src/traverso/widgets/MeterWidget.cpp000644 001750 001750 00000011461 11163362147 023014 0ustar00remonremon000000 000000 /* Copyright (C) 2008 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "MeterWidget.h" #include "Command.h" #include "ContextPointer.h" #include "PluginChain.h" #include "ProjectManager.h" #include "Project.h" #include "Sheet.h" // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" static const int STOP_DELAY = 6000; // in ms MeterWidget::MeterWidget(QWidget* parent, MeterView* item) : ViewPort(parent) , m_item(item) { PENTERCONS; setMinimumWidth(40); setMinimumHeight(10); QGraphicsScene* scene = new QGraphicsScene(this); setScene(scene); if (m_item) { scene->addItem(m_item); m_item->setPos(0,0); } setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); } MeterWidget::~MeterWidget() { } void MeterWidget::resizeEvent( QResizeEvent * ) { if (m_item) { m_item->resize(); } } void MeterWidget::hideEvent(QHideEvent * event) { QWidget::hideEvent(event); if (m_item) { m_item->hide_event(); } } void MeterWidget::showEvent(QShowEvent * event) { QWidget::showEvent(event); if (m_item) { m_item->show_event(); } } QSize MeterWidget::minimumSizeHint() const { return QSize(150, 50); } QSize MeterWidget::sizeHint() const { return QSize(220, 50); } void MeterWidget::get_pointed_context_items(QList &list) { printf("MeterWidget::get_pointed_view_items\n"); QList itemlist = items(cpointer().on_first_input_event_x(), cpointer().on_first_input_event_y()); foreach(QGraphicsItem* item, itemlist) { if (ViewItem::is_viewitem(item)) { list.append((ViewItem*)item); } } printf("itemlist size is %d\n", itemlist.size()); } MeterView::MeterView(MeterWidget* widget) : ViewItem(0, 0) , m_widget(widget) , m_meter(0) , m_sheet(0) { // Nicola: Not sure if we need to initialize here, perhaps a // call to resize would suffice ? m_boundingRect = QRectF(); // Connections to core: connect(&pm(), SIGNAL(projectLoaded(Project*)), this, SLOT(set_project(Project*))); connect(&timer, SIGNAL(timeout()), this, SLOT(update_data())); m_delayTimer.setSingleShot(true); connect(&m_delayTimer, SIGNAL(timeout()), this, SLOT(delay_timeout())); } MeterView::~MeterView() { if (m_meter) { // FIXME crashes here when deleting and not shown! // delete m_meter; } } void MeterView::resize() { PENTER; prepareGeometryChange(); // Nicola: Make this as large as the MeterWidget // by setting the boundingrect. m_boundingRect = QRectF(0, 0, m_widget->width(), m_widget->height()); } void MeterView::set_project(Project *project) { if (project) { connect(project, SIGNAL(currentSheetChanged(Sheet *)), this, SLOT(set_sheet(Sheet*))); m_project = project; } else { m_project = 0; set_sheet(0); timer.stop(); } } void MeterView::set_sheet(Sheet *sheet) { if (m_widget->parentWidget()->isHidden()) { m_sheet = sheet; return; } if (m_sheet) { if (m_meter) { // FIXME The removed plugin still needs to be deleted!!!!!! Command::process_command(m_sheet->get_plugin_chain()->remove_plugin(m_meter, false)); timer.stop(); disconnect(m_sheet, SIGNAL(transportStopped()), this, SLOT(transport_stopped())); disconnect(m_sheet, SIGNAL(transportStarted()), this, SLOT(transport_started())); } } m_sheet = sheet; if ( ! m_sheet ) { return; } connect(m_sheet, SIGNAL(transportStopped()), this, SLOT(transport_stopped())); connect(m_sheet, SIGNAL(transportStarted()), this, SLOT(transport_started())); } void MeterView::hide_event() { if (m_sheet) { if (m_meter) { Command::process_command(m_sheet->get_plugin_chain()->remove_plugin(m_meter, false)); timer.stop(); } } } void MeterView::show_event() { if (m_sheet) { if (m_meter) { Command::process_command(m_sheet->get_plugin_chain()->add_plugin(m_meter, false)); timer.start(40); } else { set_sheet(m_sheet); } } } void MeterView::transport_started() { timer.start(40); m_delayTimer.stop(); } void MeterView::transport_stopped() { m_delayTimer.start(STOP_DELAY); } void MeterView::delay_timeout() { timer.stop(); } //eof traverso-0.49.4/src/traverso/widgets/ExportFormatOptionsWidget.cpp000644 001750 001750 00000032313 11163362147 025745 0ustar00remonremon000000 000000 /** Copyright (C) 2008 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "ExportFormatOptionsWidget.h" #include "ui_ExportFormatOptionsWidget.h" #include "AudioDevice.h" #include "Config.h" #include "Export.h" RELAYTOOL_WAVPACK; RELAYTOOL_FLAC; RELAYTOOL_MP3LAME; RELAYTOOL_VORBISENC; // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" ExportFormatOptionsWidget::ExportFormatOptionsWidget( QWidget * parent ) : QWidget(parent) { setupUi(this); //bitdepthComboBox->addItem("8", 8); bitdepthComboBox->addItem("16", 16); bitdepthComboBox->addItem("24", 24); bitdepthComboBox->addItem("32", 32); bitdepthComboBox->addItem("32 (float)", 1); channelComboBox->addItem("Mono", 1); channelComboBox->addItem("Stereo", 2); sampleRateComboBox->addItem("8.000 Hz", 8000); sampleRateComboBox->addItem("11.025 Hz", 11025); sampleRateComboBox->addItem("22.050 Hz", 22050); sampleRateComboBox->addItem("44.100 Hz", 44100); sampleRateComboBox->addItem("48.000 Hz", 48000); sampleRateComboBox->addItem("88.200 Hz", 88200); sampleRateComboBox->addItem("96.000 Hz", 96000); resampleQualityComboBox->addItem(tr("Best"), 0); // Best resampleQualityComboBox->addItem(tr("High"), 1); // Medium resampleQualityComboBox->addItem(tr("Medium"), 2); // Fastest resampleQualityComboBox->addItem(tr("Fast"), 4); // Linear (Should we use ZERO_HOLD(3) instead?) audioTypeComboBox->addItem("WAV", "wav"); audioTypeComboBox->addItem("AIFF", "aiff"); if (libFLAC_is_present) { audioTypeComboBox->addItem("FLAC", "flac"); } if (libwavpack_is_present) { audioTypeComboBox->addItem("WAVPACK", "wavpack"); } #if defined MP3_ENCODE_SUPPORT if (libmp3lame_is_present) { audioTypeComboBox->addItem("MP3", "mp3"); } #endif if (libvorbisenc_is_present) { audioTypeComboBox->addItem("OGG", "ogg"); } channelComboBox->setCurrentIndex(channelComboBox->findData(2)); int rateIndex = sampleRateComboBox->findData(audiodevice().get_sample_rate()); sampleRateComboBox->setCurrentIndex(rateIndex >= 0 ? rateIndex : 3); connect(audioTypeComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(audio_type_changed(int))); QString option; int index; bool checked; // Mp3 Options Setup mp3MethodComboBox->addItem("Constant Bitrate", "cbr"); mp3MethodComboBox->addItem("Average Bitrate", "abr"); mp3MethodComboBox->addItem("Variable Bitrate", "vbr-new"); mp3MinBitrateComboBox->addItem("32 Kbps - recommended", "32"); mp3MinBitrateComboBox->addItem("64 Kbps", "64"); mp3MinBitrateComboBox->addItem("96 Kbps", "96"); mp3MinBitrateComboBox->addItem("128 Kbps", "128"); mp3MinBitrateComboBox->addItem("160 Kbps", "160"); mp3MinBitrateComboBox->addItem("192 Kbps", "192"); mp3MinBitrateComboBox->addItem("256 Kbps", "256"); mp3MinBitrateComboBox->addItem("320 Kbps", "320"); mp3MaxBitrateComboBox->addItem("32 Kbps", "32"); mp3MaxBitrateComboBox->addItem("64 Kbps", "64"); mp3MaxBitrateComboBox->addItem("96 Kbps", "96"); mp3MaxBitrateComboBox->addItem("128 Kbps", "128"); mp3MaxBitrateComboBox->addItem("160 Kbps", "160"); mp3MaxBitrateComboBox->addItem("192 Kbps", "192"); mp3MaxBitrateComboBox->addItem("256 Kbps", "256"); mp3MaxBitrateComboBox->addItem("320 Kbps", "320"); // First set to VBR, so that if we default to something else, it will trigger mp3_method_changed() index = mp3MethodComboBox->findData("vbr-new"); mp3MethodComboBox->setCurrentIndex(index >=0 ? index : 0); connect(mp3MethodComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(mp3_method_changed(int))); option = config().get_property("ExportFormatOptionsWidget", "mp3MethodComboBox", "vbr-new").toString(); index = mp3MethodComboBox->findData(option); mp3MethodComboBox->setCurrentIndex(index >=0 ? index : 0); option = config().get_property("ExportFormatOptionsWidget", "mp3MinBitrateComboBox", "32").toString(); index = mp3MinBitrateComboBox->findData(option); mp3MinBitrateComboBox->setCurrentIndex(index >=0 ? index : 0); option = config().get_property("ExportFormatOptionsWidget", "mp3MaxBitrateComboBox", "192").toString(); index = mp3MaxBitrateComboBox->findData(option); mp3MaxBitrateComboBox->setCurrentIndex(index >=0 ? index : 0); mp3OptionsGroupBox->hide(); // Ogg Options Setup oggMethodComboBox->addItem("Constant Bitrate", "manual"); oggMethodComboBox->addItem("Variable Bitrate", "vbr"); oggBitrateComboBox->addItem("45 Kbps", "45"); oggBitrateComboBox->addItem("64 Kbps", "64"); oggBitrateComboBox->addItem("96 Kbps", "96"); oggBitrateComboBox->addItem("112 Kbps", "112"); oggBitrateComboBox->addItem("128 Kbps", "128"); oggBitrateComboBox->addItem("160 Kbps", "160"); oggBitrateComboBox->addItem("192 Kbps", "192"); oggBitrateComboBox->addItem("224 Kbps", "224"); oggBitrateComboBox->addItem("256 Kbps", "256"); oggBitrateComboBox->addItem("320 Kbps", "320"); oggBitrateComboBox->addItem("400 Kbps", "400"); // First set to VBR, so that if we default to something else, it will trigger ogg_method_changed() index = oggMethodComboBox->findData("vbr"); oggMethodComboBox->setCurrentIndex(index >=0 ? index : 0); connect(oggMethodComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(ogg_method_changed(int))); option = config().get_property("ExportFormatOptionsWidget", "oggMethodComboBox", "vbr").toString(); index = oggMethodComboBox->findData(option); oggMethodComboBox->setCurrentIndex(index >=0 ? index : 0); ogg_method_changed(index >=0 ? index : 0); option = config().get_property("ExportFormatOptionsWidget", "oggBitrateComboBox", "160").toString(); index = oggBitrateComboBox->findData(option); oggBitrateComboBox->setCurrentIndex(index >= 0 ? index : 0); oggOptionsGroupBox->hide(); // WavPack option wacpackGroupBox->hide(); wavpackCompressionComboBox->addItem("Very high", "very_high"); wavpackCompressionComboBox->addItem("High", "high"); wavpackCompressionComboBox->addItem("Fast", "fast"); option = config().get_property("ExportFormatOptionsWidget", "wavpackCompressionComboBox", "very_high").toString(); index = wavpackCompressionComboBox->findData(option); wavpackCompressionComboBox->setCurrentIndex(index >= 0 ? index : 0); checked = config().get_property("ExportFormatOptionsWidget", "skipWVXCheckBox", "false").toBool(); skipWVXCheckBox->setChecked(checked); option = config().get_property("ExportFormatOptionsWidget", "audioTypeComboBox", "wav").toString(); index = audioTypeComboBox->findData(option); audioTypeComboBox->setCurrentIndex(index >= 0 ? index : 0); checked = config().get_property("ExportFormatOptionsWidget", "normalizeCheckBox", "false").toBool(); normalizeCheckBox->setChecked(checked); index = config().get_property("ExportFormatOptionsWidget", "resampleQualityComboBox", "1").toInt(); index = resampleQualityComboBox->findData(index); resampleQualityComboBox->setCurrentIndex(index >= 0 ? index : 1); option = config().get_property("ExportFormatOptionsWidget", "bitdepthComboBox", "16").toString(); index = bitdepthComboBox->findData(option); bitdepthComboBox->setCurrentIndex(index >= 0 ? index : 0); } ExportFormatOptionsWidget::~ ExportFormatOptionsWidget( ) { config().set_property("ExportDialog", "mp3MethodComboBox", mp3MethodComboBox->itemData(mp3MethodComboBox->currentIndex()).toString()); config().set_property("ExportDialog", "mp3MinBitrateComboBox", mp3MinBitrateComboBox->itemData(mp3MinBitrateComboBox->currentIndex()).toString()); config().set_property("ExportDialog", "mp3MaxBitrateComboBox", mp3MaxBitrateComboBox->itemData(mp3MaxBitrateComboBox->currentIndex()).toString()); config().set_property("ExportDialog", "oggMethodComboBox", oggMethodComboBox->itemData(oggMethodComboBox->currentIndex()).toString()); config().set_property("ExportDialog", "oggBitrateComboBox", oggBitrateComboBox->itemData(oggBitrateComboBox->currentIndex()).toString()); config().set_property("ExportDialog", "wavpackCompressionComboBox", wavpackCompressionComboBox->itemData(wavpackCompressionComboBox->currentIndex()).toString()); config().set_property("ExportDialog", "audioTypeComboBox", audioTypeComboBox->itemData(audioTypeComboBox->currentIndex()).toString()); config().set_property("ExportDialog", "normalizeCheckBox", normalizeCheckBox->isChecked()); config().set_property("ExportDialog", "skipWVXCheckBox", skipWVXCheckBox->isChecked()); config().set_property("ExportDialog", "resampleQualityComboBox", resampleQualityComboBox->itemData(resampleQualityComboBox->currentIndex()).toString()); config().set_property("ExportDialog", "bitdepthComboBox", bitdepthComboBox->itemData(bitdepthComboBox->currentIndex()).toString()); } void ExportFormatOptionsWidget::audio_type_changed(int index) { QString newType = audioTypeComboBox->itemData(index).toString(); if (newType == "mp3") { oggOptionsGroupBox->hide(); wacpackGroupBox->hide(); mp3OptionsGroupBox->show(); } else if (newType == "ogg") { mp3OptionsGroupBox->hide(); wacpackGroupBox->hide(); oggOptionsGroupBox->show(); } else if (newType == "wavpack") { mp3OptionsGroupBox->hide(); oggOptionsGroupBox->hide(); wacpackGroupBox->show(); } else { mp3OptionsGroupBox->hide(); wacpackGroupBox->hide(); oggOptionsGroupBox->hide(); } if (newType == "mp3" || newType == "ogg" || newType == "flac") { bitdepthComboBox->setCurrentIndex(bitdepthComboBox->findData(16)); bitdepthComboBox->setDisabled(true); } else { bitdepthComboBox->setEnabled(true); } } void ExportFormatOptionsWidget::mp3_method_changed(int index) { QString method = mp3MethodComboBox->itemData(index).toString(); if (method == "cbr") { mp3MinBitrateComboBox->hide(); mp3MinBitrateLabel->hide(); mp3MaxBitrateLabel->setText(tr("Bitrate")); } else if (method == "abr") { mp3MinBitrateComboBox->hide(); mp3MinBitrateLabel->hide(); mp3MaxBitrateLabel->setText(tr("Average Bitrate")); } else { // VBR new or VBR old mp3MinBitrateComboBox->show(); mp3MinBitrateLabel->show(); mp3MaxBitrateLabel->setText(tr("Maximum Bitrate")); } } void ExportFormatOptionsWidget::ogg_method_changed(int index) { QString method = oggMethodComboBox->itemData(index).toString(); if (method == "manual") { oggQualitySlider->hide(); oggQualityLabel->hide(); oggBitrateComboBox->show(); oggBitrateLabel->show(); } else { // VBR oggBitrateComboBox->hide(); oggBitrateLabel->hide(); oggQualitySlider->show(); oggQualityLabel->show(); } } void ExportFormatOptionsWidget::get_format_options(ExportSpecification * spec) { QString audioType = audioTypeComboBox->itemData(audioTypeComboBox->currentIndex()).toString(); if (audioType == "wav") { spec->writerType = "sndfile"; spec->extraFormat["filetype"] = "wav"; } else if (audioType == "aiff") { spec->writerType = "sndfile"; spec->extraFormat["filetype"] = "aiff"; } else if (audioType == "flac") { spec->writerType = "flac"; } else if (audioType == "wavpack") { spec->writerType = "wavpack"; spec->extraFormat["quality"] = wavpackCompressionComboBox->itemData(wavpackCompressionComboBox->currentIndex()).toString(); spec->extraFormat["skip_wvx"] = skipWVXCheckBox->isChecked() ? "true" : "false"; } else if (audioType == "mp3") { spec->writerType = "lame"; spec->extraFormat["method"] = mp3MethodComboBox->itemData(mp3MethodComboBox->currentIndex()).toString(); spec->extraFormat["minBitrate"] = mp3MinBitrateComboBox->itemData(mp3MinBitrateComboBox->currentIndex()).toString(); spec->extraFormat["maxBitrate"] = mp3MaxBitrateComboBox->itemData(mp3MaxBitrateComboBox->currentIndex()).toString(); spec->extraFormat["quality"] = QString::number(mp3QualitySlider->value()); } else if (audioType == "ogg") { spec->writerType = "vorbis"; spec->extraFormat["mode"] = oggMethodComboBox->itemData(oggMethodComboBox->currentIndex()).toString(); if (spec->extraFormat["mode"] == "manual") { spec->extraFormat["bitrateNominal"] = oggBitrateComboBox->itemData(oggBitrateComboBox->currentIndex()).toString(); spec->extraFormat["bitrateUpper"] = oggBitrateComboBox->itemData(oggBitrateComboBox->currentIndex()).toString(); } else { spec->extraFormat["vbrQuality"] = QString::number(oggQualitySlider->value()); } } spec->data_width = bitdepthComboBox->itemData(bitdepthComboBox->currentIndex()).toInt(); spec->channels = channelComboBox->itemData(channelComboBox->currentIndex()).toInt(); spec->sample_rate = sampleRateComboBox->itemData(sampleRateComboBox->currentIndex()).toInt(); spec->src_quality = resampleQualityComboBox->itemData(resampleQualityComboBox->currentIndex()).toInt(); spec->normalize = normalizeCheckBox->isChecked(); //TODO Make a ComboBox for this one too! spec->dither_type = GDitherTri; } traverso-0.49.4/src/traverso/widgets/BusMonitor.h000644 001750 001750 00000002640 11163362147 022341 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2006 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. $Id: BusMonitor.h,v 1.1 2008/05/24 17:41:02 r_sijrier Exp $ */ #ifndef BUSMONITOR_H #define BUSMONITOR_H #include #include class VUMeter; class Project; class QMenu; class BusMonitor : public QWidget { Q_OBJECT public: BusMonitor(QWidget* parent); ~BusMonitor(); protected: void enterEvent ( QEvent * ); void mousePressEvent ( QMouseEvent * e ); void keyPressEvent ( QKeyEvent* e); QSize sizeHint () const; QSize minimumSizeHint () const; private: QList inMeters; QList outMeters; QMenu* m_menu; void show_menu(); private slots: void create_vu_meters(); void set_project(Project* project); void reset_vu_meters(); }; #endif traverso-0.49.4/src/traverso/ui/000755 001750 001750 00000000000 11163362261 017031 5ustar00remonremon000000 000000 traverso-0.49.4/src/traverso/ui/ResourcesWidget.ui000644 001750 001750 00000007046 11163362147 022520 0ustar00remonremon000000 000000 ResourcesWidget 0 0 540 530 Form 0 6 0 6 5 0 2 0 Sources Files Qt::Horizontal 2 20 0 6 false QAbstractItemView::DoubleClicked|QAbstractItemView::EditKeyPressed|QAbstractItemView::NoEditTriggers true 16 16 Qt::ElideMiddle false false Name Length Start End 0 0 2 2 0 6 traverso-0.49.4/src/traverso/ui/KeyboardConfigPage.ui000644 001750 001750 00000025172 11163362147 023065 0ustar00remonremon000000 000000 KeyboardConfigPage 0 0 290 293 Form Configure Keyboard 6 0 <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Double fact timeout:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The maximum time in miliseconds between 2 key presses </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">to determine if the 2 key presses are a double fact ( &lt;&lt; K &gt;&gt; or &lt;&lt; KK &gt;&gt;)</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> or 2 individual key presses ( a &lt; K &gt; and &lt; K &gt; action, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">or &lt; KK &gt; and &lt; KK &gt; action for example).</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Experienced users can set this value as low as 150 ms, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">if you don't have much experience yet, please leave the default of 180 ms.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">For more information, see chapter 7: Key Actions. of the User Manual</p></body></html> <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Bitstream Vera Sans; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Double fact timeout (ms)</p></body></html> 100 16777215 100 300 200 6 0 <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Hold timeout:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The maximum time to consider a pressed key a hold key fact, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">like [ K ] or [ KK ].</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The shorter this time, the sooner a pressed key will be </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">detected as a hold action. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Experienced users can set this value as low as 110 ms, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">if you don't have much experience yet, please leave the default of 150 ms.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">For more information, see chapter 7: "Key Actions" of the User Manual.</p></body></html> <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Bitstream Vera Sans; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Hold timeout (ms)</p></body></html> 100 16777215 100 300 200 Keymap 6 0 Select keymap false 0 0 false QFrame::NoFrame Qt::ScrollBarAlwaysOff false Qt::NoTextInteraction 6 0 Qt::Horizontal 40 20 Export Keymap Print Keymap Qt::Vertical 236 16 traverso-0.49.4/src/traverso/ui/ProjectInfoWidget.ui000644 001750 001750 00000015520 11163362147 022764 0ustar00remonremon000000 000000 ProjectInfoWidget 0 0 424 193 Project Information Widget 8 6 Qt::Vertical 199 31 0 6 Bitstream Vera Sans 10 50 false false false false Bitdepth 120 0 Bitstream Vera Sans 10 50 false false false false - -1 20 0 Bitstream Vera Sans 10 50 false false false false - 60 0 Bitstream Vera Sans 10 50 false false false false Rate 45 0 Bitstream Vera Sans 10 50 false false false false - 20 0 Bitstream Vera Sans 10 50 false false false false - Sans Serif 10 50 false false false false Songs 40 0 60 16777215 Sans Serif 10 50 false false false false Project Qt::PlainText Qt::Vertical Qt::Horizontal 40 20 traverso-0.49.4/src/traverso/ui/InsertSilenceDialog.ui000644 001750 001750 00000004616 11163362147 023271 0ustar00remonremon000000 000000 InsertSilenceDialog 0 0 261 87 Insert Silence 9 6 0 6 Insert Silence (seconds): 3 3600.000000000000000 0.001000000000000 10.000000000000000 Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok buttonBox accepted() InsertSilenceDialog accept() 251 77 157 274 buttonBox rejected() InsertSilenceDialog reject() 251 77 286 274 traverso-0.49.4/src/traverso/ui/OpenProjectDialog.ui000644 001750 001750 00000011004 11163362147 022737 0ustar00remonremon000000 000000 OpenProjectDialog 0 0 269 356 Open Project 9 6 16 90 Selected Project 9 6 0 6 false 7 0 1 0 50 0 true false Load 0 6 Delete Qt::Horizontal 61 27 0 6 Select Project Dir Qt::Horizontal QDialogButtonBox::Close buttonBox clicked(QAbstractButton*) OpenProjectDialog accept() 163 218 223 228 projectListView activated(QModelIndex) loadProjectButton click() 115 64 145 125 traverso-0.49.4/src/traverso/ui/CDWritingDialog.ui000644 001750 001750 00000021374 11163362147 022354 0ustar00remonremon000000 000000 CDWritingDialog 0 0 357 403 CD Writing 9 6 General Options 9 6 0 6 Write current Sheet true Write all Sheets Calculate and apply normalization Export wav and toc files only (don't write CD) Burning Device 9 6 0 6 5 0 5 0 0 6 Number of copies 1 1 0 6 Simulate Speed Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter auto 1x 2x 4x 8x 12x 16x 20x 24x 28x 32x 36x 40x 44x 48x Status 9 6 Information 0 Qt::Horizontal 0 6 Qt::Horizontal 40 20 7 0 0 0 Start Writing Abort Close traverso-0.49.4/src/traverso/ui/QuickStart.ui000755 001750 001750 00000023624 10754275670 021510 0ustar00remonremon000000 000000 QuickStartDialog 0 0 515 370 Traverso: Getting Started ../../../resources/images/traverso.png 9 6 Qt::ScrollBarAlwaysOff <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"><span style=" font-size:18pt; font-weight:600;">Traverso: Getting Started</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">When you record or import an audio file into Traverso, it shows up as an Audio Clip in one of the horizontal Tracks in the current Sheet. You can edit many aspects of these Clips by placing the mouse pointer over a Clip and pressing or holding different keys on your keyboard and mouse. You can also change settings of a Track, the Sheet as a whole, and other objects in the Sheet.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">To see a list of what commands are available for any given object in the Sheet, move the mouse over that object, and Right-Click (or press Q). The keyboard shortcuts for each command are shown in the menu. The notation used is shown below.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; K &gt; </span> means press and release the K key. (Like a click.)</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"><span style=" font-weight:600;">&lt;&lt; K &gt;&gt;</span> means press the K key two times fast. (Like a double click.)</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ K ]</span> means drag the mouse while holding down the K key.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; KL &gt; </span> means press the K and L keys at the same time.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ KL ] </span> means drag the mouse while holding down the K and L keys at the same time.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">Here are some basic commands:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; SPACE &gt;</span> is Play/Stop.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; SHIFT &gt;</span> sets the Playhead. (Blue vertical line where playing starts.)</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; W &gt;</span> sets the Work Cursor. (Red vertical line.)</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; V &gt; </span> moves the Playhead back to the Work Cursor.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ D ] </span> move objects around (Audio Clip, Curve Nodes, etc)</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ Z ]</span> zooms in and out.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ TAB ]</span> scroll omnidirectional (aka Shuttle) </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">And some Audio Clip Commands:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ E ] </span> drags a Clip's left or right edge.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ F ]</span> adjusts the length of a Clip's Fade In / Fade Out.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ G ] </span>addust the Gain of a clip (also works on Tracks, Sheet)</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; X &gt;</span> splits the Clip at the cursor's position.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">For more information, right-click on everything, or check out the Traverso manual.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p></body></html> Qt::Horizontal QDialogButtonBox::Ok buttonBox clicked(QAbstractButton*) QuickStartDialog close() 262 324 314 -10 traverso-0.49.4/src/traverso/ui/ProjectManagerDialog.ui000644 001750 001750 00000052341 11163362147 023421 0ustar00remonremon000000 000000 ProjectManagerDialog 0 0 581 308 600 500 Dialog 9 6 0 Project 9 6 Informational 9 6 0 6 100 0 Title true true 0 6 100 0 Description 16777215 50 0 6 100 0 Engineer 150 0 Export 9 9 Sheet(s) Template Qt::Vertical 20 40 Qt::Vertical QSizePolicy::Maximum 385 20 Sheets 9 6 0 0 10 5 330 120 Sheet Name Tracks Length 0 6 Selected Sheet 9 6 0 0 0 6 Delete false Qt::Horizontal QSizePolicy::Minimum 1 20 Rename New Sheet 9 6 0 6 Create new Sheet Qt::Vertical 20 40 CD Text 9 6 100 0 Performer 100 0 Disc ID: 100 0 UPC EAN: 100 0 Genre: Unused Undefined Adult Contemporary Alternative Rock Childrens Classical Contemporary Christian Country Dance Easy Listening Erotic Folk Gospel Hip Hop Jazz Latin Musical New Age Opera Operette Pop Music Rap Reggae Rock Music Rhythm and Blues Sound Effects Spoken Word World Music Qt::Horizontal 40 20 Arranger Songwriter Message 0 6 0 6 16777215 22 <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Undo last change</p></body></html> 16777215 22 <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Redo last change</p></body></html> Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok buttonBox accepted() ProjectManagerDialog accept() 543 250 576 219 buttonBox rejected() ProjectManagerDialog reject() 477 254 492 240 traverso-0.49.4/src/traverso/ui/AudioDriverConfigPage.ui000644 001750 001750 00000021377 11163362147 023545 0ustar00remonremon000000 000000 AudioDriverConfigPage 0 0 250 344 Form Driver Selection Driver: Configure driver 6 0 <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Duplex mode:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Defines if both the Playback and Capture buses </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">of your soundcard are to be used, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">or only the Playback or Capture bus(es).</p></body></html> Duplex mode Full Playback Capture 6 0 <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Sample rate:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The sample rate used by the audio card.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">New projects will use this samplerate as </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">the project's sample rate on creation.</p></body></html> Sample rate 22050 32000 44100 48000 88200 96000 6 0 <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Buffer latency:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The latency introduced by the size of the audio buffers.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Some people need low latencies, if you don't need it, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">or don't know what it means, please leave the default setting!</p></body></html> Buffer latency (ms) Qt::Horizontal 40 20 Restart Driver Jack 6 9 Enable Jack transport control Qt::Vertical 20 40 traverso-0.49.4/src/traverso/ui/PaDriverPage.ui000644 001750 001750 00000006365 11163362147 021716 0ustar00remonremon000000 000000 PaDriverPage 0 0 307 63 Form 0 9 Portaudio drivers 9 9 0 6 <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">PortAudio Driver:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The driver which should drive the PortAudio backend</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">PortAudio supports many driver backends, some of which Traverso has native support for too. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It is recommended to use Traverso's native drivers instead of using PortAudio's, however, if the native drivers give problems, you might try the ones supplied by PortAudio instead!</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">PortAudio provides transparent driver support for multiple platforms, including Windows (see the wmme, direct x and asio options), and Mac OS X (see the CoreAudio and jack options)</p></body></html> Driver traverso-0.49.4/src/traverso/ui/ExportDialog.ui000644 001750 001750 00000020254 11163362147 021777 0ustar00remonremon000000 000000 ExportDialog 0 0 453 258 0 1 Export 9 9 9 9 9 0 0 16777215 350 General Options 6 9 9 9 9 6 0 0 0 0 Export current Sheet true Export all Sheets Qt::Horizontal 0 20 6 0 0 0 0 Export directory Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 5 0 0 0 Export status 6 9 9 9 9 6 0 0 0 0 - Qt::Horizontal 40 20 0 Qt::Horizontal 6 0 0 0 0 Qt::Horizontal 40 20 200 0 Abort Export 140 0 Start Export Close traverso-0.49.4/src/traverso/ui/NewSheetDialog.ui000644 001750 001750 00000012615 11163362147 022242 0ustar00remonremon000000 000000 NewSheetDialog Qt::NonModal 0 0 286 174 New Sheet(s) 9 6 0 6 0 6 New Sheet name Sheet count Track count Use Template 0 6 0 6 Qt::Horizontal 40 20 1 0 0 0 1 1 0 6 Qt::Horizontal 40 20 Qt::NonModal 1 0 0 0 Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok buttonBox accepted() NewSheetDialog accept() 248 254 157 274 buttonBox rejected() NewSheetDialog reject() 316 260 286 274 traverso-0.49.4/src/traverso/ui/ImportClipsDialog.ui000644 001750 001750 00000003616 11163362147 022766 0ustar00remonremon000000 000000 ImportClipsDialog 0 0 344 103 Import Audio Clips Import to Track: Add Markers Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok buttonBox accepted() ImportClipsDialog accept() 248 254 157 274 buttonBox rejected() ImportClipsDialog reject() 316 260 286 274 traverso-0.49.4/src/traverso/ui/SpectralMeterConfigWidget.ui000644 001750 001750 00000020420 11163362147 024435 0ustar00remonremon000000 000000 SpectralMeterConfigWidget 0 0 377 364 FFT-Spectrum Configuration 9 6 Frequency Range 9 6 Show average spectrum 2048 4 16 Number of bands: 0 -140 -140 Lower dB value: 12 -24 Upper dB value: Hz 20000 1 20 Lower Limit: Hz 96000 100 20000 Upper Limit: Advanced FFT Options 9 6 FFT Size: 3 256 512 1024 2048 4096 8192 Rectangle Hanning Hamming Blackman Windowing function: 0 6 Advanced true Qt::Horizontal 271 20 Apply true &Close spinBoxUpperFreq spinBoxLowerFreq spinBoxUpperDb spinBoxLowerDb spinBoxNumBands checkBoxAverage comboBoxFftSize comboBoxWindowing buttonApply buttonClose buttonAdvanced checkBoxAverage clicked() buttonApply animateClick() 29 204 270 341 traverso-0.49.4/src/traverso/ui/RecordingConfigPage.ui000644 001750 001750 00000026441 11163362147 023241 0ustar00remonremon000000 000000 RecordingConfigPage 0 0 354 248 0 1 Form Recording 6 9 6 0 <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">WAV</span> : A format without compression. Uses more hard disk space then compressed encoding formats, but needs very little cpu.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Limits : ~ 1.7 hours of recording time @ Stereo - 44.1 KHz</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">WavPack</span> : A format with compression, up to 2 times smaller compared to WAV, and no quality loss. Uses significantly more cpu then WAV, but with modern (year 2005 and above) cpu's this shouldn't be a problem.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Using this format stresses the hard disk much less, increasing hard disk live, and less chance of saturating the hard disk bandwidth.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Limits : ~ 5 hours recording time @ Stereo - 44.1 KHz</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">WAV64</span> : WAV format with 64 bit header, support by other programs is currently limited.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Limits : None, thousands of hours of recording time, supposed that your hard disk can hold it.</p></body></html> Encoding format Qt::Horizontal 40 20 WavPack options 6 9 6 0 Compression type <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This option reduces the storage of some floating-point data files by up to about 10% by eliminating some information that has virtually no effect on the audio data. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">While this does technically make the compression lossy, it retains all the advantages of floating point data (&gt;600 dB of dynamic range, no clipping, and 25 bits of resolution). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This also affects large integer compression by limiting the resolution to 24 bits.</p></body></html> Skip WVX for extra compression (semi-lossless) Resampling 6 9 Enable on the fly resampling (Playback only) 6 0 6 0 On the fly resample quality Default export resample quality 6 0 Best High Medium Fast Best High Medium Fast Qt::Vertical 20 3 traverso-0.49.4/src/traverso/ui/NewProjectDialog.ui000644 001750 001750 00000030606 11163362147 022600 0ustar00remonremon000000 000000 NewProjectDialog 0 0 414 454 New Project 70 0 Name 2 0 0 0 Description 0 0 16777215 50 70 0 Engineer 2 0 Import Audio Files true Empty Project 0 0 0 Import Audio Files ... ... Qt::Horizontal 40 20 ... ... QAbstractItemView::ExtendedSelection false 2 Track Name File Copy files to project directory Empty Project 6 0 0 0 0 2 0 Number of Sheets 1 0 40 0 1 1 6 0 0 0 0 2 0 Tracks per Sheet 1 0 6 0 0 0 0 Use Template 2 0 Qt::Vertical 20 40 Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok buttonBox accepted() NewProjectDialog accept() 252 591 157 274 buttonBox rejected() NewProjectDialog reject() 268 591 286 274 traverso-0.49.4/src/traverso/ui/BehaviorConfigPage.ui000644 001750 001750 00000016145 11163362147 023064 0ustar00remonremon000000 000000 BehaviorConfigPage 0 0 336 412 Form Project Settings 6 9 6 0 On close: Qt::Horizontal 20 23 Save true Ask Don't save Load last used project at startup New Sheet Settings 6 9 6 0 Number of tracks 1 1024 1 Audio Clip Settings 6 9 Lock Audio Clips by default Playback Settings 6 9 6 0 <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Keep the play cursor in view while playing or recording.</p></body></html> Scroll playback true Jump Stay Centered Animated Continuously adjust audio while dragging false Qt::Vertical 20 51 keepCursorVisibleCheckBox toggled(bool) scrollModeComboBox setEnabled(bool) 178 325 224 326 traverso-0.49.4/src/traverso/ui/AudioSourcesManagerWidget.ui000644 001750 001750 00000006520 11163362147 024442 0ustar00remonremon000000 000000 AudioSourcesManagerWidget 0 0 778 459 Form 8 6 Qt::Vertical 20 40 Qt::Horizontal 40 20 0 6 Qt::Horizontal 40 20 Remove sources 8 6 Remove source Remove all sources Remove unused sources AudioSources 700 0 traverso-0.49.4/src/traverso/ui/SheetManagerDialog.ui000644 001750 001750 00000017276 11163362147 023073 0ustar00remonremon000000 000000 ProjectManagerDialog 0 0 600 309 600 500 Dialog 9 6 1 Project Sheets 9 6 7 7 10 5 250 120 0 6 Selected Sheet 9 6 0 0 0 6 Delete false Qt::Horizontal QSizePolicy::Minimum 10 20 Rename New Sheet 9 6 0 6 Create new Sheet Qt::Vertical 20 40 0 6 0 6 16777215 22 undotext 16777215 22 redotext Qt::Horizontal QDialogButtonBox::Close buttonBox clicked(QAbstractButton*) ProjectManagerDialog accept() 520 424 526 327 selectedSheetName returnPressed() renameSheetButton animateClick() 484 114 497 148 traverso-0.49.4/src/traverso/ui/PerformanceConfigPage.ui000644 001750 001750 00000031707 11163362147 023567 0ustar00remonremon000000 000000 PerformanceConfigPage 0 0 343 234 Form Audio file buffering 12 9 9 9 9 6 0 0 0 0 <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Read buffer size:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The amount of audio data that can be stored in the </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">read buffers in seconds.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The default value of 1 second should do just fine.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">However, if you're tight on memory, you can make this value lower.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If you experience buffer underruns when the hard disk bandwidth is </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(almost) saturated, or when buffer underruns happen regularly due </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">the hard disk can't keep up for some reason, you can try a larger </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">value, like 1.5 or 2.0 seconds.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Keep in mind that when using a larger buffer, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">it will take considerably more time to move (i.e. seeking) </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">the playhead to another positions, since all the buffers </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(one for each audioclip * channel count) need to be refilled!</p></body></html> Read buffer size (seconds) 0 1 1 0.400000000000000 3.000000000000000 0.100000000000000 1.000000000000000 6 0 0 0 0 40 0 info icon 1 0 Changing the buffer size only will take into effect after (re)loading a project. Painting 6 9 9 9 9 6 0 0 0 0 <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The number of times per second at which the Graphical</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Items are repainted during a jog action, like moving an</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">AudioClip, or changing the Gain.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The default frames per second of 35 is a perfect compromise </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">between smooth painting, and low cpu usage.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">However, if you find the painting to be not smooth enough,</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">change this value to a higher one, but keep in mind that it</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">will consume considerably more cpu!</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If for example moving an AudioClip still takes to much cpu,</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">you should consider to lower this value.</p></body></html> Jog repaint speed (fps) 100 16777215 10 50 25 <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Accelerates the painting of AudioClips and Tracks by using</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">the 3D engine of your graphics card.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Depending on your graphics card and driver support, this </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">can speed up painting considerably!</p></body></html> Use hardware acceleration Qt::Vertical 20 40 traverso-0.49.4/src/traverso/ui/PluginSelectorDialog.ui000644 001750 001750 00000005762 11163362147 023464 0ustar00remonremon000000 000000 PluginSelectorDialog 0 0 471 433 Plugin Selector 9 6 Add Plugin too Plugin Name Type In/Out 0 6 Qt::Horizontal 131 31 OK Cancel cancelButton clicked() PluginSelectorDialog reject() 421 401 179 282 okButton clicked() PluginSelectorDialog accept() 335 401 96 254 pluginTreeWidget activated(QModelIndex) okButton click() 330 224 311 389 traverso-0.49.4/src/traverso/ui/AlsaDevicesPage.ui000644 001750 001750 00000024570 11163362147 022363 0ustar00remonremon000000 000000 AlsaDevicesPage 0 0 356 141 Form ALSA Device 6 9 9 9 9 6 0 0 0 0 <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Device:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The real or virtual ALSA device to be used.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A real device is the audiocard installed in your system.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A virtual device is one created in the .asoundrc file, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">often located in your home folder.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If unsure, use either the default device, this will use the audiodevice </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">configured by your distribution, or the device that names your audio card.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">In the latter case, please make sure no application uses the audiocard, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">else the driver won't be able to initialize!</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">For more info see chapter 3.1: "The Driver Backend" of the User Manual</p></body></html> Device 6 0 0 0 0 <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Number of Periods:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Audio is managed in small chunks called periods. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This value determines how many of these chunks are </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">to be used by the driver of the audiocard.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The default should work just fine, and gives optimal latency behavior.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">However, some (buggy) alsa drivers don't work correctly </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">with the default of 2, if you experience very choppy audio, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">please try to use 3 periods.</p></body></html> Nr. of periods 2 3 6 0 0 0 0 <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Dither is used to make the audio cleaner. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The best way to describe it is to imagine a painting with many dots. If you view it up close you can see each dot and the image is not very clear. If you view it from far away the image becomes clearer because your eyes/brain dither the dots to smooth out the image. It is a murky subject and obviously a very personal choice as to what dither is the best. For most people it is just plain magic. Anyone running at 16bit who cares about quality or has CPU cycles to spare should run with dither. Triangular is probably the best compromise of quality vs cpu cost (its very fast), but shaped is the best</p></body></html> Dither None Shaped Rectangular Triangular traverso-0.49.4/src/traverso/ui/BusSelectorDialog.ui000644 001750 001750 00000013543 11163362147 022753 0ustar00remonremon000000 000000 BusSelectorDialog 0 0 321 389 Bus Selector 9 6 0 6 0 0 2 0 Track Qt::Horizontal 40 20 5 0 4 0 Capture Buses 9 6 0 6 Channels Both true Left Right Qt::Vertical 20 1 Playback Buses 9 6 0 6 Channels Both true Left Right Qt::Vertical 20 1 Qt::Horizontal QDialogButtonBox::Close|QDialogButtonBox::NoButton|QDialogButtonBox::Ok traverso-0.49.4/src/traverso/ui/AppearenceConfigPage.ui000644 001750 001750 00000033031 11163362147 023361 0ustar00remonremon000000 000000 AppearenceConfigPage 0 0 352 531 Form 0 Theme 1 0 Theme selector 12 9 6 0 6 0 Path to theme files Qt::Horizontal 40 20 6 0 true 5 0 true true false 6 0 1 0 Available themes 1 0 6 0 Adjust theme color 200 100 Theme Options 6 9 Paint audio rectified <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Painting the waveform with an outline is more detailed, but requires more cpu.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If you experience slowness when painting many clips, or during animated scroll, unselect this option!</p></body></html> Paint audio with outline Paint stereo audio as mono audio Draw lines at 0 and -6 dB Style Options 6 0 1 0 Select style 1 0 Use selected style's palette Qt::Vertical 20 40 Toolbars Toolbars Icon size Button style Transport Console size Qt::Vertical 20 40 Language Interface Language QComboBox::InsertAlphabetically Changing the language of the Interface will take effect after restarting Traverso! Qt::Vertical 20 40 traverso-0.49.4/src/traverso/ui/ExportFormatOptionsWidget.ui000644 001750 001750 00000070054 11163362147 024553 0ustar00remonremon000000 000000 ExportFormatOptionsWidget 0 0 866 414 Export Format Options 0 0 0 0 0 0 Format Options 9 9 9 9 9 Encoding 12 9 9 9 9 18 0 0 0 0 6 0 0 0 0 File Type Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Channels Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 6 0 0 0 0 4 0 6 0 0 0 0 0 0 Normalize Audio 6 0 0 0 0 0 0 Bitdepth Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter Qt::Horizontal 0 20 6 0 0 0 0 0 0 WavPack options (lossless compression) 6 9 9 9 9 6 0 0 0 0 Compression type <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This option reduces the storage of some floating-point data files by up to about 10% by eliminating some information that has virtually no effect on the audio data. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">While this does technically make the compression lossy, it retains all the advantages of floating point data (&gt;600 dB of dynamic range, no clipping, and 25 bits of resolution). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This also affects large integer compression by limiting the resolution to 24 bits.</p></body></html> Skip WVX for extra compression (semi-lossless) 0 0 Ogg Options 9 9 9 9 9 9 4 0 Bitrate Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 5 0 Qt::LeftToRight false 0 10 1 7 true Qt::Horizontal false false QSlider::TicksAbove 1 5 0 4 0 Quality (Smallest <-> Best) Qt::AlignBottom|Qt::AlignRight|Qt::AlignTrailing 4 0 Encoding Method Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 0 0 MP3 Options 9 9 9 9 9 9 4 0 Encoding Method Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 4 0 Maximum Bitrate Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 4 0 Minimum Bitrate Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 4 0 Quality (Fastest <-> Best) Qt::AlignBottom|Qt::AlignRight|Qt::AlignTrailing 5 0 5 0 5 0 Qt::LeftToRight false 1 9 1 3 true Qt::Horizontal true false QSlider::TicksAbove 1 0 0 Sample Rate 12 9 9 9 9 12 0 0 0 0 0 0 Sample Rate 0 0 QComboBox::AdjustToContents 0 0 Conversion quality 0 0 Qt::Horizontal 0 40 traverso-0.49.4/src/traverso/ui/PluginSelector.ui000644 001750 001750 00000004760 11163362147 022341 0ustar00remonremon000000 000000 Dialog 0 0 400 315 Dialog 9 6 0 6 0 6 Qt::Horizontal 131 31 OK Cancel okButton clicked() Dialog accept() 278 253 96 254 cancelButton clicked() Dialog reject() 369 253 179 282 traverso-0.49.4/src/traverso/ui/NewTrackDialog.ui000644 001750 001750 00000005147 11163362147 022240 0ustar00remonremon000000 000000 NewTrackDialog 0 0 239 111 New Track(s) 9 6 0 6 Track name 0 6 Track count 1 1 Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok buttonBox accepted() NewTrackDialog accept() 248 254 157 274 buttonBox rejected() NewTrackDialog reject() 316 260 286 274 traverso-0.49.4/src/traverso/ui/SheetInfoWidget.ui000644 001750 001750 00000025335 11163362147 022433 0ustar00remonremon000000 000000 SongInfoWidget 0 0 502 320 SongInfoWidget 9 6 0 6 0 6 0 6 50 0 Song 110 0 Sans Serif 10 50 false false false false - Qt::Horizontal 40 20 0 6 0 6 50 0 Snap 30 0 Sans Serif 10 50 false false false false - Qt::Horizontal 70 20 0 6 40 0 Gain - 0 6 50 0 Sans Serif 10 50 false false false false SMPTE 5 5 5 0 40 0 Sans Serif 11 50 false false false false - Qt::Horizontal QSizePolicy::Expanding 0 20 0 6 50 0 Zoom 5 5 5 0 40 0 Sans Serif 11 50 false false false false - Qt::Horizontal QSizePolicy::Expanding 0 20 Qt::Vertical 161 147 Qt::Horizontal 51 156 Qt::Vertical traverso-0.49.4/src/traverso/ui/ProjectConverterDialog.ui000644 001750 001750 00000007553 11163362147 024023 0ustar00remonremon000000 000000 ProjectConverterDialog 0 0 452 480 Project Converter 9 6 Project XXX (no translation needed) 7 7 0 5 Conversion information 7 7 0 1 Conversion progress 0 Qt::Horizontal 0 6 Qt::Horizontal 40 20 Start conversion Stop conversion Load Project Close closeButton clicked() ProjectConverterDialog reject() 388 454 449 454 startButton clicked() ProjectConverterDialog accept() 103 455 10 457 traverso-0.49.4/src/traverso/ui/SystemInfoWidget.ui000644 001750 001750 00000017322 11163362147 022644 0ustar00remonremon000000 000000 SystemInfoWidget 0 0 434 245 SystemInfoWidget 9 6 0 6 0 6 Card Name (na) Qt::Horizontal 40 20 0 0 0 0 24 0 20 16777215 image 0 0 image buffer size (na) rate 65 0 Sans Serif 10 50 false false false false - GB drivertype (na) Qt::Horizontal QSizePolicy::Preferred 20 65 0 0 xruns (na) latency (na) - % 24 0 image bitdepth Qt::Horizontal 40 20 Qt::Vertical 219 89 Qt::Horizontal 31 233 traverso-0.49.4/src/traverso/ui/RestoreProjectBackupDialog.ui000644 001750 001750 00000005610 11163362147 024615 0ustar00remonremon000000 000000 RestoreProjectBackupDialog 0 0 323 358 Restore from backup Set the date to restore the selected backup. Current date and time: Last backup: - - Date Time Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok buttonBox accepted() RestoreProjectBackupDialog accept() 248 254 157 274 buttonBox rejected() RestoreProjectBackupDialog reject() 316 260 286 274 traverso-0.49.4/src/traverso/ui/MarkerDialog.ui000644 001750 001750 00000027643 11163362147 021750 0ustar00remonremon000000 000000 MarkerDialog 0 0 400 558 Markers 6 9 QAbstractItemView::AnyKeyPressed|QAbstractItemView::DoubleClicked|QAbstractItemView::EditKeyPressed false Position Title Options 9 6 ISRC: Apply to all ... ../../../../../../../usr/share/icons/crystalsvg/16x16/actions/tab_duplicate.png../../../../../../../usr/share/icons/crystalsvg/16x16/actions/tab_duplicate.png Apply to all ... ../../../../../../../usr/share/icons/crystalsvg/16x16/actions/tab_duplicate.png../../../../../../../usr/share/icons/crystalsvg/16x16/actions/tab_duplicate.png Pre-Emphasis Copy protection Position: (MM:SS:75ths) 0 CD-Text 9 6 Title: Apply to all ... ../../../../../../../usr/share/icons/crystalsvg/16x16/actions/tab_duplicate.png../../../../../../../usr/share/icons/crystalsvg/16x16/actions/tab_duplicate.png Performer: Apply to all ... ../../../../../../../usr/share/icons/crystalsvg/16x16/actions/tab_duplicate.png../../../../../../../usr/share/icons/crystalsvg/16x16/actions/tab_duplicate.png Composer: Apply to all ... ../../../../../../../usr/share/icons/crystalsvg/16x16/actions/tab_duplicate.png../../../../../../../usr/share/icons/crystalsvg/16x16/actions/tab_duplicate.png CD-Text optional 9 6 Songwriter Arranger: Message: Apply to all ... ../../../../../../../usr/share/icons/crystalsvg/16x16/actions/tab_duplicate.png../../../../../../../usr/share/icons/crystalsvg/16x16/actions/tab_duplicate.png Apply to all ... ../../../../../../../usr/share/icons/crystalsvg/16x16/actions/tab_duplicate.png../../../../../../../usr/share/icons/crystalsvg/16x16/actions/tab_duplicate.png Apply to all ... ../../../../../../../usr/share/icons/crystalsvg/16x16/actions/tab_duplicate.png../../../../../../../usr/share/icons/crystalsvg/16x16/actions/tab_duplicate.png 6 0 &Remove &Export Qt::Horizontal 281 20 &Ok false &Cancel markersTreeWidget checkBoxCopy toolButtonCopyAll checkBoxPreEmph toolButtonPEmphAll lineEditIsrc tabWidget lineEditTitle toolButtonTitleAll lineEditPerformer toolButtonPerformerAll lineEditComposer toolButtonComposerAll lineEditSongwriter lineEditArranger toolButtonArrangerAll lineEditMessage toolButtonMessageAll pushButtonOk traverso-0.49.4/src/traverso/Traverso.cpp000755 001750 001750 00000023415 11163362147 020740 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2007 Remon Sijrier This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include #include "../config.h" #include #include "Traverso.h" #include "Mixer.h" #include "ProjectManager.h" #include #include "Interface.h" #include "Themer.h" #include #include #include #include #include "defines.h" #include "fpu.h" #ifdef __SSE__ #include #endif #if defined (__APPLE__) #include // For Gestalt #endif // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" /** * \mainpage Traverso developers documentation * * Traverso makes use of frameworks provided by the 'core' library, to implement the Contextual Interface,
thread save insertion / removal of objects in the audio processing chain, and creating historable actions.
The framework that forms the Contextual or "Soft Selection' enabled Interface is provided by: ViewPort, ContextItem, ContextPointer, Command, InputEngine and the Qt Undo Framework.
The Qt Undo Framework and the Command class account for the 'History' framework in Traverso. The ViewPort, ContextPointer, InputEngine and Command classes together also make it possible to create 'analog' type of actions.
The actual implementation for analog actions is done by reimplementing the virtual Command::jog() function.
The traversoengine library provides a driver abstraction
for the audio hardware, currently ALSA, PortAudio and Jack are supported as drivers.
The Tsar class (singleton) is the key behind lockless, thus non blocking removing and adding of audio processing objects in the audio processing chain.
The AddRemove Command class is to be used for adding/removing items to/from ContextItem objects.
This class detects if the add/remove function can be called directly, or in a thread save way, and uses therefore the Tsar class, and the Sheet object in case it was given as a parameter.
See for more information the AddRemove, AudioDevice and Tsar class documentation. */ Traverso::Traverso(int &argc, char **argv ) : QApplication ( argc, argv ) { QCoreApplication::setOrganizationName("Traverso-DAW"); QCoreApplication::setApplicationName("Traverso"); QCoreApplication::setOrganizationDomain("traverso-daw.org"); qRegisterMetaType("InfoStruct"); qRegisterMetaType("TimeRef"); config().check_and_load_configuration(); // Initialize random number generator srand ( time(NULL) ); init_sse(); QMetaObject::invokeMethod(this, "create_interface", Qt::QueuedConnection); // create_interface(); connect(this, SIGNAL(lastWindowClosed()), &pm(), SLOT(exit())); } Traverso::~Traverso() { PENTERDES; delete Interface::instance(); delete themer(); config().save(); } #include #include void Traverso::create_interface( ) { themer()->load(); Interface* iface = Interface::instance(); prepare_audio_device(); iface->show(); QString projectToLoad = ""; foreach(QString string, QCoreApplication::arguments ()) { if (string.contains("project.tpf")) { projectToLoad = string; break; } } // The user clicked on a project.tpf file, start extracting the // baseproject directory, and the project name from the filename. if (!projectToLoad.isEmpty()) { QFileInfo fi(projectToLoad); QDir projectdir(fi.path()); QDir baseprojectdir(fi.path()); baseprojectdir.cdUp(); QString baseprojectdirpath = baseprojectdir.path(); QString projectdirpath = projectdir.path(); QString projectname = projectdirpath.mid(baseprojectdirpath.length() + 1, projectdirpath.length()); if (!projectname.isEmpty() && ! baseprojectdirpath.isEmpty()) { pm().start(baseprojectdirpath, projectname); return; } } pm().start(); } void Traverso::shutdown( int signal ) { PENTER; // Just in case the mouse was grabbed... cpointer().jog_finished(); QApplication::sendPostedEvents(); switch(signal) { case SIGINT: printf("\nCatched the SIGINT signal!\nShutting down Traverso!\n\n"); pm().exit(); return; break; case SIGSEGV: printf("\nCatched the SIGSEGV signal!\n"); QMessageBox::critical( Interface::instance(), "Crash", "The program made an invalid operation and crashed :-(\n" "Please, report this to us!"); } printf("Stopped\n"); exit(0); } void Traverso::init_sse( ) { bool generic_mix_functions = true; FPU fpu; #if defined (ARCH_X86) && defined (SSE_OPTIMIZATIONS) if (fpu.has_sse()) { printf("Using SSE optimized routines\n"); // SSE SET Mixer::compute_peak = x86_sse_compute_peak; Mixer::apply_gain_to_buffer = x86_sse_apply_gain_to_buffer; Mixer::mix_buffers_with_gain = x86_sse_mix_buffers_with_gain; Mixer::mix_buffers_no_gain = x86_sse_mix_buffers_no_gain; generic_mix_functions = false; } #elif defined (__APPLE__) && defined (BUILD_VECLIB_OPTIMIZATIONS) long sysVersion = 0; if (noErr != Gestalt(gestaltSystemVersion, &sysVersion)) sysVersion = 0; if (sysVersion >= 0x00001040) { // Tiger at least Mixer::compute_peak = veclib_compute_peak; Mixer::apply_gain_to_buffer = veclib_apply_gain_to_buffer; Mixer::mix_buffers_with_gain = veclib_mix_buffers_with_gain; Mixer::mix_buffers_no_gain = veclib_mix_buffers_no_gain; generic_mix_functions = false; printf("Apple VecLib H/W specific optimizations in use\n"); } #endif /* consider FPU denormal handling to be "h/w optimization" */ setup_fpu (); if (generic_mix_functions) { Mixer::compute_peak = default_compute_peak; Mixer::apply_gain_to_buffer = default_apply_gain_to_buffer; Mixer::mix_buffers_with_gain = default_mix_buffers_with_gain; Mixer::mix_buffers_no_gain = default_mix_buffers_no_gain; printf("No Hardware specific optimizations in use\n"); } } void Traverso::setup_fpu() { // export TRAVERSO_RUNNING_UNDER_VALGRIND to disable assembler stuff below! if (getenv("TRAVERSO_RUNNING_UNDER_VALGRIND")) { printf("TRAVERSO_RUNNING_UNDER_VALGRIND=TRUE\n"); // valgrind doesn't understand this assembler stuff // September 10th, 2007 return; } #if defined(ARCH_X86) && defined(USE_XMMINTRIN) int MXCSR; FPU fpu; /* XXX use real code to determine if the processor supports DenormalsAreZero and FlushToZero */ if (!fpu.has_flush_to_zero() && !fpu.has_denormals_are_zero()) { return; } MXCSR = _mm_getcsr(); /* switch (Config->get_denormal_model()) { case DenormalNone: MXCSR &= ~(_MM_FLUSH_ZERO_ON|0x8000); break; case DenormalFTZ: if (fpu.has_flush_to_zero()) { MXCSR |= _MM_FLUSH_ZERO_ON; } break; case DenormalDAZ:*/ MXCSR &= ~_MM_FLUSH_ZERO_ON; if (fpu.has_denormals_are_zero()) { MXCSR |= 0x8000; } // break; // // case DenormalFTZDAZ: // if (fpu.has_flush_to_zero()) { // if (fpu.has_denormals_are_zero()) { // MXCSR |= _MM_FLUSH_ZERO_ON | 0x8000; // } else { // MXCSR |= _MM_FLUSH_ZERO_ON; // } // } // break; // } _mm_setcsr (MXCSR); #endif } void Traverso::prepare_audio_device( ) { int rate = config().get_property("Hardware", "samplerate", 44100).toInt(); int bufferSize = config().get_property("Hardware", "buffersize", 512).toInt(); #if defined (Q_WS_X11) QString driverType = config().get_property("Hardware", "drivertype", "ALSA").toString(); #else QString driverType = config().get_property("Hardware", "drivertype", "PortAudio").toString(); #endif QString cardDevice = config().get_property("Hardware", "carddevice", "default").toString(); QString ditherShape = config().get_property("Hardware", "DitherShape", "None").toString(); bool capture = config().get_property("Hardware", "capture", 1).toInt(); bool playback = config().get_property("Hardware", "playback", 1).toInt(); if (bufferSize == 0) { qWarning("BufferSize read from Settings is 0 !!!"); bufferSize = 1024; } if (rate == 0) { qWarning("Samplerate read from Settings is 0 !!!"); rate = 44100; } if (driverType.isEmpty()) { qWarning("Driver type read from Settings is an empty String !!!"); driverType = "ALSA"; } #if defined (ALSA_SUPPORT) if (driverType == "ALSA") { cardDevice = config().get_property("Hardware", "carddevice", "default").toString(); } #endif #if defined (PORTAUDIO_SUPPORT) if (driverType == "PortAudio") { #if defined (Q_WS_X11) cardDevice = config().get_property("Hardware", "pahostapi", "alsa").toString(); #elif defined (Q_WS_MAC) cardDevice = config().get_property("Hardware", "pahostapi", "coreaudio").toString(); #elif defined (Q_WS_WIN) cardDevice = config().get_property("Hardware", "pahostapi", "wmme").toString(); #endif } #endif // end PORTAUDIO_SUPPORT audiodevice().set_parameters(rate, bufferSize, driverType, capture, playback, cardDevice, ditherShape); } void Traverso::saveState( QSessionManager & manager) { manager.setRestartHint(QSessionManager::RestartIfRunning); QStringList command; command << "traverso" << "-session" << QApplication::sessionId(); manager.setRestartCommand(command); } void Traverso::commitData( QSessionManager & ) { pm().save_project(); } // eof traverso-0.49.4/src/audiofileio/000755 001750 001750 00000000000 11163362200 017031 5ustar00remonremon000000 000000 traverso-0.49.4/src/audiofileio/CMakeLists.txt000644 001750 001750 00000001722 11163362147 021605 0ustar00remonremon000000 000000 INCLUDE_DIRECTORIES( ${CMAKE_SOURCE_DIR}/src/audiofileio/decode ${CMAKE_SOURCE_DIR}/src/audiofileio/encode ) SET(TRAVERSO_AUDIOFILEIO_SOURCES decode/AbstractAudioReader.cpp decode/SFAudioReader.cpp decode/FlacAudioReader.cpp decode/ResampleAudioReader.cpp decode/VorbisAudioReader.cpp decode/WPAudioReader.cpp encode/AbstractAudioWriter.cpp encode/SFAudioWriter.cpp encode/WPAudioWriter.cpp encode/FlacAudioWriter.cpp encode/VorbisAudioWriter.cpp ) IF(HAVE_MP3_DECODING) SET(TRAVERSO_AUDIOFILEIO_SOURCES ${TRAVERSO_AUDIOFILEIO_SOURCES} decode/MadAudioReader.cpp ) ENDIF(HAVE_MP3_DECODING) IF(HAVE_MP3_ENCODING) SET(TRAVERSO_AUDIOFILEIO_SOURCES ${TRAVERSO_AUDIOFILEIO_SOURCES} encode/LameAudioWriter.cpp ) ENDIF(HAVE_MP3_ENCODING) SET(TRAVERSO_AUDIOFILEIO_LIBRARY "traversoaudiofileio") ADD_LIBRARY(${TRAVERSO_AUDIOFILEIO_LIBRARY} STATIC ${TRAVERSO_AUDIOFILEIO_SOURCES}) IF(USE_PCH) ADD_DEPENDENCIES(traversoaudiofileio precompiled_headers) ENDIF(USE_PCH) traverso-0.49.4/src/audiofileio/decode/000755 001750 001750 00000000000 12357214027 020265 5ustar00remonremon000000 000000 traverso-0.49.4/src/audiofileio/decode/MadAudioReader.h000644 001750 001750 00000002645 11163362147 023254 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Ben Levitt This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef MADAUDIOREADER_H #define MADAUDIOREADER_H #include extern "C" { #include } class MadAudioReader : public AbstractAudioReader { public: MadAudioReader(QString filename); ~MadAudioReader(); QString decoder_type() const {return "mad";} void clear_buffers(); static bool can_decode(QString filename); protected: bool seek_private(nframes_t start); nframes_t read_private(DecodeBuffer* buffer, nframes_t frameCount); void create_buffers(); bool initDecoderInternal(); unsigned long countFrames(); bool createPcmSamples(mad_synth* synth); static int MaxAllowedRecoverableErrors; class MadDecoderPrivate; MadDecoderPrivate* d; }; #endif traverso-0.49.4/src/audiofileio/decode/VorbisAudioReader.h000644 001750 001750 00000002452 11163362147 024013 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Ben Levitt This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef VORBISAUDIOREADER_H #define VORBISAUDIOREADER_H #include "AbstractAudioReader.h" #include "vorbis/codec.h" #include "vorbis/vorbisfile.h" #include "stdio.h" class VorbisAudioReader : public AbstractAudioReader { public: VorbisAudioReader(QString filename); ~VorbisAudioReader(); QString decoder_type() const {return "vorbis";} static bool can_decode(QString filename); protected: bool seek_private(nframes_t start); nframes_t read_private(DecodeBuffer* buffer, nframes_t frameCount); FILE* m_file; OggVorbis_File m_vf; vorbis_info* m_vi; }; #endif traverso-0.49.4/src/audiofileio/decode/FlacAudioReader.h000644 001750 001750 00000002332 11163362147 023411 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Ben Levitt This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef FLACAUDIOREADER_H #define FLACAUDIOREADER_H #include "AbstractAudioReader.h" class FlacPrivate; class FlacAudioReader : public AbstractAudioReader { public: FlacAudioReader(QString filename); ~FlacAudioReader(); QString decoder_type() const {return "flac";} void clear_buffers(); static bool can_decode(QString filename); protected: bool seek_private(nframes_t start); nframes_t read_private(DecodeBuffer* buffer, nframes_t sampleCount); FlacPrivate *m_flac; }; #endif traverso-0.49.4/src/audiofileio/decode/WPAudioReader.cpp000644 001750 001750 00000007500 11163362147 023427 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Ben Levitt This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "WPAudioReader.h" #include #include "Utils.h" RELAYTOOL_WAVPACK; // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" WPAudioReader::WPAudioReader(QString filename) : AbstractAudioReader(filename) { char error[80]; m_wp = WavpackOpenFileInput(m_fileName.toUtf8().data(), error, OPEN_2CH_MAX | OPEN_NORMALIZE | OPEN_WVC, 0); if (m_wp == 0) { qWarning("Couldn't open soundfile (%s) %s", QS_C(filename), error); return; } m_isFloat = ((WavpackGetMode(m_wp) & MODE_FLOAT) != 0); m_bitsPerSample = WavpackGetBitsPerSample(m_wp); m_bytesPerSample = WavpackGetBytesPerSample(m_wp); m_channels = WavpackGetReducedChannels(m_wp); m_nframes = WavpackGetNumSamples(m_wp); m_rate = WavpackGetSampleRate(m_wp); m_length = TimeRef(m_nframes, m_rate); } WPAudioReader::~WPAudioReader() { if (m_wp) { WavpackCloseFile(m_wp); } } bool WPAudioReader::can_decode(QString filename) { if (!libwavpack_is_present) { return false; } char error[80]; WavpackContext *wp = WavpackOpenFileInput(filename.toUtf8().data(), error, OPEN_2CH_MAX | OPEN_NORMALIZE | OPEN_WVC, 0); if (wp == 0) { return false; } WavpackCloseFile(wp); return true; } bool WPAudioReader::seek_private(nframes_t start) { Q_ASSERT(m_wp); if (start >= m_nframes) { return false; } if (!WavpackSeekSample(m_wp, start)) { PERROR("could not seek to frame %d within %s", start, QS_C(m_fileName)); return false; } return true; } nframes_t WPAudioReader::read_private(DecodeBuffer* buffer, nframes_t frameCount) { Q_ASSERT(m_wp); // WavPack only reads into a int32_t buffer... int32_t* readbuffer = (int32_t*)buffer->readBuffer; nframes_t framesRead = WavpackUnpackSamples(m_wp, readbuffer, frameCount); const uint divider = ((uint)1<<(m_bytesPerSample * 8 - 1)); // De-interlace if (m_isFloat) { switch (m_channels) { case 1: memcpy(buffer->destination[0], readbuffer, framesRead * sizeof(audio_sample_t)); break; case 2: for (nframes_t f = 0; f < framesRead; f++) { uint pos = f*2; buffer->destination[0][f] = ((float*)readbuffer)[pos]; buffer->destination[1][f] = ((float*)readbuffer)[pos + 1]; } break; default: for (nframes_t f = 0; f < framesRead; f++) { for (int c = 0; c < m_channels; c++) { buffer->destination[c][f] = ((float*)readbuffer)[f * m_channels + c]; } } } } else { switch (m_channels) { case 1: for (nframes_t f = 0; f < framesRead; f++) { buffer->destination[0][f] = (float)((float)readbuffer[f]/ divider); } break; case 2: for (nframes_t f = 0; f < framesRead; f++) { uint pos = f*2; buffer->destination[0][f] = (float)((float)readbuffer[pos]/ divider); buffer->destination[1][f] = (float)((float)readbuffer[pos + 1]/ divider); } break; default: for (nframes_t f = 0; f < framesRead; f++) { for (int c = 0; c < m_channels; c++) { buffer->destination[c][f] = (float)((float)readbuffer[f * m_channels + c]/ divider); } } } } return framesRead; } traverso-0.49.4/src/audiofileio/decode/ResampleAudioReader.cpp000644 001750 001750 00000021652 12357214027 024654 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Ben Levitt This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "ResampleAudioReader.h" #include #include #define OVERFLOW_SIZE 512 // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" // On init, creates a child AudioReader for any filetype, and a samplerate converter ResampleAudioReader::ResampleAudioReader(QString filename, const QString& decoder) : AbstractAudioReader(filename) { m_reader = AbstractAudioReader::create_audio_reader(filename, decoder); if (!m_reader) { PERROR("ResampleAudioReader: couldn't create AudioReader"); m_channels = m_nframes = 0; } else { m_channels = m_reader->get_num_channels(); m_rate = m_reader->get_file_rate(); m_nframes = m_reader->get_nframes(); m_length = m_reader->get_length(); m_outputRate = m_rate; } m_isResampleAvailable = false; m_overflowBuffers = 0; m_overflowUsed = 0; m_resampleDecodeBufferIsMine = false; m_resampleDecodeBuffer = 0; m_convertorType = -1; } ResampleAudioReader::~ResampleAudioReader() { if (m_reader) { delete m_reader; } while (m_srcStates.size()) { src_delete(m_srcStates.back()); m_srcStates.pop_back(); } if (m_overflowBuffers) { for (int chan = 0; chan < m_channels; chan++) { delete [] m_overflowBuffers[chan]; } delete [] m_overflowBuffers; } if (m_resampleDecodeBufferIsMine) { delete m_resampleDecodeBuffer; } } void ResampleAudioReader::clear_buffers() { if (m_overflowBuffers) { for (int chan = 0; chan < m_channels; chan++) { delete [] m_overflowBuffers[chan]; } delete [] m_overflowBuffers; m_overflowBuffers = 0; } if (m_reader) { m_reader->clear_buffers(); } } // Clear the samplerateconverter to a clean state (used on seek) void ResampleAudioReader::reset() { foreach(SRC_STATE* state, m_srcStates) { src_reset(state); } m_srcData.end_of_input = 0; m_overflowUsed = 0; // Read extra frames from the child reader on the first read after a seek. // This keeps the resampler supplied with plenty of samples to produce the // requested output on each read. m_readExtraFrames = OVERFLOW_SIZE; } void ResampleAudioReader::set_converter_type(int converter_type) { PENTER; int error; if ( (float(m_outputRate) / get_file_rate()) > 2.0 && converter_type == 3 ) { if (m_convertorType == 2) { return; } printf("ResampleAudioReader::set_converter_type: src does not support a resample ratio > 2 with converter type Fast, using quality Medium\n"); m_convertorType = 2; } else { m_convertorType = converter_type; } while (m_srcStates.size()) { src_delete(m_srcStates.back()); m_srcStates.pop_back(); } clear_buffers(); for (int c = 0; c < m_reader->get_num_channels(); c++) { m_srcStates.append(src_new(m_convertorType, 1, &error)); if (!m_srcStates[c]) { PERROR("ResampleAudioReader: couldn't create libSampleRate SRC_STATE"); m_isResampleAvailable = false; break; } else { m_isResampleAvailable = true; } } // seek_private will reset the src states! seek_private(pos()); } int ResampleAudioReader::get_output_rate() { return m_outputRate; } int ResampleAudioReader::get_file_rate() { return m_reader->get_file_rate(); } void ResampleAudioReader::set_output_rate(int rate) { if (!m_reader) { return; } m_outputRate = rate; m_nframes = file_to_resampled_frame(m_reader->get_nframes()); m_length = TimeRef(m_nframes, m_outputRate); reset(); } // if no conversion is necessary, pass the seek straight to the child AudioReader, // otherwise convert and seek bool ResampleAudioReader::seek_private(nframes_t start) { Q_ASSERT(m_reader); if (m_outputRate == m_rate || !m_isResampleAvailable) { return m_reader->seek(start); } reset(); // printf("ResampleAudioReader::seek_private: start: %d\n", resampled_to_file_frame(start)); return m_reader->seek(resampled_to_file_frame(start)); } // If no conversion is necessary, pass the read straight to the child AudioReader, // otherwise get data from childreader and use libsamplerate to convert nframes_t ResampleAudioReader::read_private(DecodeBuffer* buffer, nframes_t frameCount) { Q_ASSERT(m_reader); // pass through if not changing sampleRate. if (m_outputRate == m_rate || !m_isResampleAvailable) { return m_reader->read(buffer, frameCount); } else if (!m_overflowBuffers) { create_overflow_buffers(); } nframes_t bufferUsed; nframes_t framesRead = 0; nframes_t fileCnt = resampled_to_file_frame(frameCount); if (frameCount && !fileCnt) { fileCnt = 1; } if (!m_resampleDecodeBuffer) { m_resampleDecodeBuffer = new DecodeBuffer; m_resampleDecodeBufferIsMine = true; } if (!m_resampleDecodeBuffer->destination) { reset(); } bufferUsed = m_overflowUsed; if (m_overflowUsed) { // Copy pre-existing overflow into the buffer for (int chan = 0; chan < m_channels; chan++) { memcpy(m_resampleDecodeBuffer->destination[chan], m_overflowBuffers[chan], m_overflowUsed * sizeof(audio_sample_t)); } } if (!m_reader->eof()) { if (m_overflowUsed) { for (int chan = 0; chan < m_channels; chan++) { m_resampleDecodeBuffer->destination[chan] += m_overflowUsed; } } bufferUsed += m_reader->read(m_resampleDecodeBuffer, fileCnt + m_readExtraFrames - m_overflowUsed); if (m_overflowUsed) { for (int chan = 0; chan < m_channels; chan++) { m_resampleDecodeBuffer->destination[chan] -= m_overflowUsed; } } //printf("Resampler: Read %lu of %lu (%lu)\n", bufferUsed, fileCnt + OVERFLOW_SIZE - m_overflowUsed, m_reader->get_length()); } // Don't read extra frames next time. m_readExtraFrames = 0; if (m_reader->eof()) { m_srcData.end_of_input = 1; } nframes_t framesToConvert = frameCount; if (frameCount > m_nframes - m_readPos) { framesToConvert = m_nframes - m_readPos; } for (int chan = 0; chan < m_channels; chan++) { // Set up sample rate converter struct for s.r.c. processing m_srcData.data_in = m_resampleDecodeBuffer->destination[chan]; m_srcData.input_frames = bufferUsed; m_srcData.data_out = buffer->destination[chan]; m_srcData.output_frames = framesToConvert; m_srcData.src_ratio = (double) m_outputRate / m_rate; src_set_ratio(m_srcStates[chan], m_srcData.src_ratio); if (src_process(m_srcStates[chan], &m_srcData)) { PERROR("Resampler: src_process() error!"); return 0; } framesRead = m_srcData.output_frames_gen; } m_overflowUsed = bufferUsed - m_srcData.input_frames_used; if (m_overflowUsed < 0) { m_overflowUsed = 0; } if (m_overflowUsed) { // If there was overflow, save it for the next read. for (int chan = 0; chan < m_channels; chan++) { memcpy(m_overflowBuffers[chan], m_resampleDecodeBuffer->destination[chan] + m_srcData.input_frames_used, m_overflowUsed * sizeof(audio_sample_t)); } } // Pad end of file with 0s if necessary if (framesRead == 0 && m_readPos < get_nframes()) { int padLength = get_nframes() - m_readPos; printf("Resampler: padding: %d\n", padLength); for (int chan = 0; chan < m_channels; chan++) { memset(buffer->destination[chan] + framesRead, 0, padLength * sizeof(audio_sample_t)); } framesRead += padLength; } // Truncate so we don't return too many samples if (m_readPos + framesRead > get_nframes()) { printf("Resampler: truncating: %d\n", framesRead - (get_nframes() - m_readPos)); framesRead = get_nframes() - m_readPos; } // printf("framesRead: %lu of %lu (overflow: %lu) (at: %lu of %lu)\n", framesRead, frameCount, m_overflowUsed, m_readPos /*+ framesRead*/, get_nframes()); return framesRead; } nframes_t ResampleAudioReader::resampled_to_file_frame(nframes_t frame) { TimeRef location(frame, m_outputRate); return location.to_frame(m_rate); } nframes_t ResampleAudioReader::file_to_resampled_frame(nframes_t frame) { TimeRef location(frame, m_rate); return location.to_frame(m_outputRate); } void ResampleAudioReader::create_overflow_buffers() { m_overflowBuffers = new audio_sample_t*[m_channels]; for (int chan = 0; chan < m_channels; chan++) { m_overflowBuffers[chan] = new audio_sample_t[OVERFLOW_SIZE]; } } void ResampleAudioReader::set_resample_decode_buffer(DecodeBuffer * buffer) { if (m_resampleDecodeBufferIsMine && m_resampleDecodeBuffer) { delete m_resampleDecodeBuffer; m_resampleDecodeBufferIsMine = false; } m_resampleDecodeBuffer = buffer; reset(); } traverso-0.49.4/src/audiofileio/decode/SFAudioReader.h000644 001750 001750 00000002365 11163362147 023062 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Ben Levitt This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef SFAUDIOREADER_H #define SFAUDIOREADER_H #include #include "sndfile.h" #include class SFAudioReader : public AbstractAudioReader { public: SFAudioReader(QString filename); ~SFAudioReader(); QString decoder_type() const {return "sndfile";} static bool can_decode(QString filename); protected: bool seek_private(nframes_t start); nframes_t read_private(DecodeBuffer* buffer, nframes_t frameCount); SNDFILE* m_sf; SF_INFO m_sfinfo; private: QFile m_file; }; #endif traverso-0.49.4/src/audiofileio/decode/VorbisAudioReader.cpp000644 001750 001750 00000006223 11163362147 024346 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Ben Levitt This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "VorbisAudioReader.h" #include #include #include "Utils.h" #ifdef _WIN32 #include #include #endif RELAYTOOL_VORBISFILE; // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" VorbisAudioReader::VorbisAudioReader(QString filename) : AbstractAudioReader(filename) { m_file = fopen(filename.toUtf8().data(), "rb"); if (!m_file) { PERROR("Couldn't open file %s.", QS_C(filename)); return; } if (ov_open(m_file, &m_vf, 0, 0) < 0) { PERROR("Input does not appear to be an Ogg bitstream."); fclose(m_file); return; } ov_pcm_seek(&m_vf, 0); m_vi = ov_info(&m_vf,-1); m_channels = m_vi->channels; m_nframes = ov_pcm_total(&m_vf, -1); m_rate = m_vi->rate; m_length = TimeRef(m_nframes, m_rate); } VorbisAudioReader::~VorbisAudioReader() { if (m_file) { ov_clear(&m_vf); } } bool VorbisAudioReader::can_decode(QString filename) { if (!libvorbisfile_is_present) { return false; } FILE* file = fopen(filename.toUtf8().data(), "rb"); if (!file) { PERROR("Could not open file: %s", QS_C(filename)); return false; } OggVorbis_File of; if (ov_test(file, &of, 0, 0)) { fclose(file); return false; } ov_clear(&of); return true; } bool VorbisAudioReader::seek_private(nframes_t start) { Q_ASSERT(m_file); if (start >= m_nframes) { return false; } if (int result = ov_pcm_seek(&m_vf, start) < 0) { PERROR("VorbisAudioReader: could not seek to frame %d within %s (%d)", start, QS_C(m_fileName), result); Q_UNUSED(result); return false; } return true; } nframes_t VorbisAudioReader::read_private(DecodeBuffer* buffer, nframes_t frameCount) { Q_ASSERT(m_file); nframes_t totalFramesRead = 0; while (totalFramesRead < frameCount) { audio_sample_t** tmp; int bs; int framesRead = ov_read_float(&m_vf, &tmp, frameCount - totalFramesRead, &bs); if (framesRead == OV_HOLE) { // Hole detected: recursive retry PERROR("VorbisAudioReader: OV_HOLE"); return read(buffer, frameCount); } else if (framesRead == 0) { /* EOF */ break; } else if (framesRead < 0) { /* error in the stream. */ PERROR("VorbisFile decoding error"); break; } for (int c=0; c < m_channels; c++) { memcpy(buffer->destination[c] + totalFramesRead, tmp[c], framesRead * sizeof(audio_sample_t)); } totalFramesRead += framesRead; } return totalFramesRead; } traverso-0.49.4/src/audiofileio/decode/FlacAudioReader.cpp000644 001750 001750 00000042732 11163362147 023754 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Ben Levitt * Based on the FLAC decoder module for K3b. * Based on the Ogg Vorbis module for same. * Copyright (C) 1998-2007 Sebastian Trueg * Copyright (C) 2003-2004 John Steele Scott This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "FlacAudioReader.h" #include #include #include "Utils.h" #include "FLAC/export.h" #if !defined FLAC_API_VERSION_CURRENT || FLAC_API_VERSION_CURRENT < 6 #define LEGACY_FLAC #include "FLAC/seekable_stream_decoder.h" #else #undef LEGACY_FLAC #include "FLAC/stream_decoder.h" #endif RELAYTOOL_FLAC; // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" class FlacPrivate { public: FlacPrivate(QString filename) { internalBuffer = 0; bufferSize = 0; bufferUsed = 0; bufferStart = 0; open(filename); } ~FlacPrivate() { cleanup(); } bool open(QString filename) { file = new QFile(filename); if (!file->open(QIODevice::ReadOnly)) { return false; } #ifdef LEGACY_FLAC flac = FLAC__seekable_stream_decoder_new(); FLAC__seekable_stream_decoder_set_read_callback(flac, FlacPrivate::read_callback); FLAC__seekable_stream_decoder_set_seek_callback(flac, FlacPrivate::seek_callback); FLAC__seekable_stream_decoder_set_tell_callback(flac, FlacPrivate::tell_callback); FLAC__seekable_stream_decoder_set_length_callback(flac, FlacPrivate::length_callback); FLAC__seekable_stream_decoder_set_eof_callback(flac, FlacPrivate::eof_callback); FLAC__seekable_stream_decoder_set_write_callback(flac, FlacPrivate::write_callback); FLAC__seekable_stream_decoder_set_metadata_callback(flac, FlacPrivate::metadata_callback); FLAC__seekable_stream_decoder_set_error_callback(flac, FlacPrivate::error_callback); FLAC__seekable_stream_decoder_set_client_data(flac, this); FLAC__seekable_stream_decoder_init(flac); FLAC__seekable_stream_decoder_process_until_end_of_metadata(flac); #else flac = FLAC__stream_decoder_new(); FLAC__stream_decoder_init_stream(flac, FlacPrivate::read_callback, FlacPrivate::seek_callback, FlacPrivate::tell_callback, FlacPrivate::length_callback, FlacPrivate::eof_callback, FlacPrivate::write_callback, FlacPrivate::metadata_callback, FlacPrivate::error_callback, this); FLAC__stream_decoder_process_until_end_of_metadata(flac); #endif return true; } bool is_valid() { return (flac != 0); } #ifdef LEGACY_FLAC bool flush() { return FLAC__seekable_stream_decoder_flush(flac); } bool finish() { return FLAC__seekable_stream_decoder_finish(flac); } bool reset() { return FLAC__seekable_stream_decoder_reset(flac); } bool process_single() { return FLAC__seekable_stream_decoder_process_single(flac); } FLAC__SeekableStreamDecoderState get_state() { return FLAC__seekable_stream_decoder_get_state(flac); } #else bool flush() { return FLAC__stream_decoder_flush(flac); } bool finish() { return FLAC__stream_decoder_finish(flac); } bool reset() { return FLAC__stream_decoder_reset(flac); } bool process_single() { return FLAC__stream_decoder_process_single(flac); } FLAC__StreamDecoderState get_state() { return FLAC__stream_decoder_get_state(flac); } #endif void cleanup() { clear_buffers(); file->close(); delete file; finish(); #ifdef LEGACY_FLAC FLAC__seekable_stream_decoder_delete(flac); #else FLAC__stream_decoder_delete(flac); #endif } void clear_buffers() { if (internalBuffer) { delete [] internalBuffer; internalBuffer = 0; } } bool seek(nframes_t start) { #ifdef LEGACY_FLAC return FLAC__seekable_stream_decoder_seek_absolute(flac, start); #else return FLAC__stream_decoder_seek_absolute(flac, start); #endif } uint m_channels; uint m_rate; uint m_bitsPerSample; uint m_samples; audio_sample_t *internalBuffer; int bufferSize; int bufferUsed; int bufferStart; protected: #ifdef LEGACY_FLAC static FLAC__SeekableStreamDecoderReadStatus read_callback(const FLAC__SeekableStreamDecoder *decoder, FLAC__byte buffer[], unsigned *bytes, void *client_data); static FLAC__SeekableStreamDecoderSeekStatus seek_callback(const FLAC__SeekableStreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data); static FLAC__SeekableStreamDecoderTellStatus tell_callback(const FLAC__SeekableStreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data); static FLAC__SeekableStreamDecoderLengthStatus length_callback(const FLAC__SeekableStreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data); static FLAC__bool eof_callback(const FLAC__SeekableStreamDecoder *decoder, void *client_data); static void error_callback(const FLAC__SeekableStreamDecoder *decoder, FLAC__StreamDecoderErrorStatus s, void *client_data){ Q_UNUSED(decoder); Q_UNUSED(client_data); printf("!!! %d !!!\n", s); }; static void metadata_callback(const FLAC__SeekableStreamDecoder *decoder, const ::FLAC__StreamMetadata *metadata, void *client_data); static FLAC__StreamDecoderWriteStatus write_callback(const FLAC__SeekableStreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data); #else static FLAC__StreamDecoderReadStatus read_callback(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data); static FLAC__StreamDecoderSeekStatus seek_callback(const FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data); static FLAC__StreamDecoderTellStatus tell_callback(const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data); static FLAC__StreamDecoderLengthStatus length_callback(const FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data); static FLAC__bool eof_callback(const FLAC__StreamDecoder *decoder, void *client_data); static void error_callback(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus s, void *client_data){Q_UNUSED(decoder); Q_UNUSED(client_data); printf("!!! %d !!!\n", s); }; static void metadata_callback(const FLAC__StreamDecoder *decoder, const ::FLAC__StreamMetadata *metadata, void *client_data); static FLAC__StreamDecoderWriteStatus write_callback(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data); #endif QFile *file; #ifdef LEGACY_FLAC FLAC__SeekableStreamDecoder *flac; #else FLAC__StreamDecoder *flac; #endif }; #ifdef LEGACY_FLAC FLAC__StreamDecoderWriteStatus FlacPrivate::write_callback(const FLAC__SeekableStreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data) #else FLAC__StreamDecoderWriteStatus FlacPrivate::write_callback(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data) #endif { Q_UNUSED(decoder); FlacPrivate *fp = (FlacPrivate*)client_data; uint c; nframes_t pos = 0; nframes_t frames = frame->header.blocksize; if (fp->bufferUsed > 0) { // This shouldn't be happening PERROR("internalBuffer is already non-empty"); } if (!fp->internalBuffer || (nframes_t)fp->bufferSize < frames * frame->header.channels) { if (fp->internalBuffer) { delete [] fp->internalBuffer; } fp->internalBuffer = new audio_sample_t[frames * frame->header.channels]; fp->bufferSize = frames * frame->header.channels; } for (nframes_t i=0; i < frames; i++) { // in FLAC channel 0 is left, 1 is right for (c=0; c < frame->header.channels; c++) { audio_sample_t value = (audio_sample_t)((float)buffer[c][i] / (float)((uint)1<<(frame->header.bits_per_sample-1))); fp->internalBuffer[pos++] = value; } } fp->bufferUsed = frames * frame->header.channels; return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE; } #ifdef LEGACY_FLAC FLAC__SeekableStreamDecoderReadStatus FlacPrivate::read_callback(const FLAC__SeekableStreamDecoder *decoder, FLAC__byte buffer[], unsigned *bytes, void *client_data) { Q_UNUSED(decoder); FlacPrivate *fp = (FlacPrivate*)client_data; long retval = fp->file->read((char *)buffer, (*bytes)); if(retval == -1) { return FLAC__SEEKABLE_STREAM_DECODER_READ_STATUS_ERROR; } else { (*bytes) = retval; return FLAC__SEEKABLE_STREAM_DECODER_READ_STATUS_OK; } } #else FLAC__StreamDecoderReadStatus FlacPrivate::read_callback(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data) { Q_UNUSED(decoder); FlacPrivate *fp = (FlacPrivate*)client_data; long retval = fp->file->read((char *)buffer, (*bytes)); if(retval == -1) { return FLAC__STREAM_DECODER_READ_STATUS_ABORT; } else { (*bytes) = retval; return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE; } } #endif #ifdef LEGACY_FLAC FLAC__SeekableStreamDecoderSeekStatus FlacPrivate::seek_callback(const FLAC__SeekableStreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data) { Q_UNUSED(decoder); FlacPrivate *fp = (FlacPrivate*)client_data; if(!fp->file->seek(absolute_byte_offset)) return FLAC__SEEKABLE_STREAM_DECODER_SEEK_STATUS_ERROR; else return FLAC__SEEKABLE_STREAM_DECODER_SEEK_STATUS_OK; } #else FLAC__StreamDecoderSeekStatus FlacPrivate::seek_callback(const FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data) { Q_UNUSED(decoder); FlacPrivate *fp = (FlacPrivate*)client_data; if(!fp->file->seek(absolute_byte_offset)) return FLAC__STREAM_DECODER_SEEK_STATUS_ERROR; else return FLAC__STREAM_DECODER_SEEK_STATUS_OK; } #endif #ifdef LEGACY_FLAC FLAC__SeekableStreamDecoderTellStatus FlacPrivate::tell_callback(const FLAC__SeekableStreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data) { Q_UNUSED(decoder); FlacPrivate *fp = (FlacPrivate*)client_data; (*absolute_byte_offset) = fp->file->pos(); return FLAC__SEEKABLE_STREAM_DECODER_TELL_STATUS_OK; } #else FLAC__StreamDecoderTellStatus FlacPrivate::tell_callback(const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data) { Q_UNUSED(decoder); FlacPrivate *fp = (FlacPrivate*)client_data; (*absolute_byte_offset) = fp->file->pos(); return FLAC__STREAM_DECODER_TELL_STATUS_OK; } #endif #ifdef LEGACY_FLAC FLAC__SeekableStreamDecoderLengthStatus FlacPrivate::length_callback(const FLAC__SeekableStreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data) { Q_UNUSED(decoder); FlacPrivate *fp = (FlacPrivate*)client_data; (*stream_length) = fp->file->size(); return FLAC__SEEKABLE_STREAM_DECODER_LENGTH_STATUS_OK; } #else FLAC__StreamDecoderLengthStatus FlacPrivate::length_callback(const FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data) { Q_UNUSED(decoder); FlacPrivate *fp = (FlacPrivate*)client_data; (*stream_length) = fp->file->size(); return FLAC__STREAM_DECODER_LENGTH_STATUS_OK; } #endif #ifdef LEGACY_FLAC void FlacPrivate::metadata_callback(const FLAC__SeekableStreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data) #else void FlacPrivate::metadata_callback(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data) #endif { Q_UNUSED(decoder); FlacPrivate *fp = (FlacPrivate*)client_data; switch (metadata->type) { case FLAC__METADATA_TYPE_STREAMINFO: fp->m_channels = metadata->data.stream_info.channels; fp->m_rate = metadata->data.stream_info.sample_rate; fp->m_bitsPerSample = metadata->data.stream_info.bits_per_sample; fp->m_samples = metadata->data.stream_info.total_samples; break; case FLAC__METADATA_TYPE_VORBIS_COMMENT: //comments = new FLAC::Metadata::VorbisComment((FLAC__StreamMetadata *)metadata, true); break; default: break; } } #ifdef LEGACY_FLAC FLAC__bool FlacPrivate::eof_callback(const FLAC__SeekableStreamDecoder *decoder, void *client_data) #else FLAC__bool FlacPrivate::eof_callback(const FLAC__StreamDecoder *decoder, void *client_data) #endif { Q_UNUSED(decoder); FlacPrivate *fp = (FlacPrivate*)client_data; return fp->file->atEnd(); } FlacAudioReader::FlacAudioReader(QString filename) : AbstractAudioReader(filename) { m_flac = new FlacPrivate(filename); if (m_flac->is_valid()) { m_channels = m_flac->m_channels; m_nframes = m_flac->m_samples; m_rate = m_flac->m_rate; m_length = TimeRef(m_nframes, m_rate); } } FlacAudioReader::~FlacAudioReader() { if (m_flac) { delete m_flac; } } void FlacAudioReader::clear_buffers() { if (m_flac) { m_flac->clear_buffers(); } } bool FlacAudioReader::can_decode(QString filename) { if (!libFLAC_is_present) { return false; } // buffer large enough to read an ID3 tag header char buf[10]; // Note: since file is created on the stack it will be closed automatically // by its destructor when this method (i.e. canDecode) returns. QFile f(filename); if (!f.open(QIODevice::ReadOnly)) { PERROR("Could not open file %s", QS_C(filename)); return false; } // look for a fLaC magic number or ID3 tag header if (10 != f.read(buf, 10)) { //PERROR("File too small to be a FLAC file: %s", QS_C(filename)); return false; } if (0 == memcmp(buf, "ID3", 3)) { // Found ID3 tag, try and seek past it. // See www.id3.org for details of the header, note that the size field // unpacks to 7-bit bytes, then the +10 is for the header itself. int pos; pos = ((buf[6]<<21)|(buf[7]<<14)|(buf[8]<<7)|buf[9]) + 10; if (!f.seek(pos)) { //PERROR("Couldn't seek to %d in file: %s", pos, QS_C(filename)); return false; } else { // seek was okay, try and read magic number into buf if (4 != f.read(buf, 4)) { //PERROR("File has ID3 tag but nothing else: %s", QS_C(filename)); return false; } } } if (memcmp(buf, "fLaC", 4) != 0) { //PERROR("Not a flac file: %s", QS_C(filename)); return false; } f.close(); FlacPrivate flac(filename); bool valid = flac.is_valid(); flac.finish(); return valid; } bool FlacAudioReader::seek_private(nframes_t start) { Q_ASSERT(m_flac); if (start >= m_nframes) { PERROR("FlacAudioReader: could not seek to frame %d within %s, it's past the end.", start, QS_C(m_fileName)); return false; } m_flac->bufferUsed = 0; m_flac->bufferStart = 0; m_flac->flush(); if (!m_flac->seek(start)) { PERROR("FlacAudioReader: could not seek to frame %d within %s", start, QS_C(m_fileName)); return false; } return true; } nframes_t FlacAudioReader::read_private(DecodeBuffer* buffer, nframes_t frameCount) { Q_ASSERT(m_flac); nframes_t framesToCopy; nframes_t framesAvailable; nframes_t framesCoppied = 0; while (framesCoppied < frameCount) { if (m_flac->bufferUsed == 0) { // want more data #ifdef LEGACY_FLAC if (m_flac->get_state() == FLAC__SEEKABLE_STREAM_DECODER_END_OF_STREAM) { //printf("flac file finish\n"); m_flac->flush(); m_flac->reset(); break; } else if(m_flac->get_state() == FLAC__SEEKABLE_STREAM_DECODER_OK) { //printf("process\n"); if (!m_flac->process_single()) { PERROR("process_single() error\n"); m_flac->reset(); seek(m_readPos); return 0; } } else { PERROR("flac_state() = %d\n", int(m_flac->get_state())); m_flac->reset(); seek(m_readPos); return 0; } #else if (m_flac->get_state() == FLAC__STREAM_DECODER_END_OF_STREAM) { //printf("flac file finish\n"); m_flac->flush(); m_flac->reset(); break; } else if(m_flac->get_state() < FLAC__STREAM_DECODER_END_OF_STREAM) { //printf("process\n"); if (!m_flac->process_single()) { PERROR("process_single() error\n"); m_flac->reset(); seek(m_readPos); return 0; } } else { PERROR("flac_state() = %d\n", int(m_flac->get_state())); m_flac->reset(); seek(m_readPos); return 0; } #endif } framesAvailable = (m_flac->bufferUsed - m_flac->bufferStart) / get_num_channels() ; framesToCopy = (frameCount - framesCoppied < framesAvailable) ? frameCount - framesCoppied : framesAvailable; switch (get_num_channels()) { case 1: memcpy(buffer->destination[0] + framesCoppied, m_flac->internalBuffer + m_flac->bufferStart, framesToCopy * sizeof(audio_sample_t)); break; case 2: for (nframes_t i = 0; i < framesToCopy; i++) { buffer->destination[0][framesCoppied + i] = m_flac->internalBuffer[m_flac->bufferStart + i * 2]; buffer->destination[1][framesCoppied + i] = m_flac->internalBuffer[m_flac->bufferStart + i * 2 + 1]; } break; default: for (nframes_t i = 0; i < framesToCopy; i++) { for (int c = 0; c < get_num_channels(); c++) { buffer->destination[c][framesCoppied + i] = m_flac->internalBuffer[m_flac->bufferStart + i * get_num_channels() + c]; } } break; } if(framesToCopy == framesAvailable) { m_flac->bufferUsed = 0; m_flac->bufferStart = 0; } else { m_flac->bufferStart += framesToCopy * get_num_channels(); } framesCoppied += framesToCopy; } return framesCoppied; } traverso-0.49.4/src/audiofileio/decode/ResampleAudioReader.h000644 001750 001750 00000004501 11163362147 024314 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Ben Levitt This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef RESAMPLEAUDIOREADER_H #define RESAMPLEAUDIOREADER_H #include #include #include class ResampleAudioReader : public AbstractAudioReader { public: ResampleAudioReader(QString filename, const QString& decoder); ~ResampleAudioReader(); nframes_t read_from(DecodeBuffer* buffer, nframes_t start, nframes_t count) { return AbstractAudioReader::read_from(buffer, start, count); } nframes_t read_from(DecodeBuffer* buffer, const TimeRef& start, nframes_t count) { TimeRef location = start; return AbstractAudioReader::read_from(buffer, location.to_frame(m_outputRate), count); } QString decoder_type() const {return (m_reader) ? m_reader->decoder_type() : "";} void clear_buffers(); int get_output_rate(); int get_file_rate(); int get_convertor_type() const {return m_convertorType;} void set_output_rate(int rate); void set_converter_type(int converter_type); void set_resample_decode_buffer(DecodeBuffer* buffer); protected: void reset(); bool seek_private(nframes_t start); nframes_t read_private(DecodeBuffer* buffer, nframes_t frameCount); nframes_t resampled_to_file_frame(nframes_t frame); nframes_t file_to_resampled_frame(nframes_t frame); AbstractAudioReader* m_reader; QVector m_srcStates; SRC_DATA m_srcData; audio_sample_t** m_overflowBuffers; long m_overflowUsed; int m_outputRate; int m_convertorType; bool m_isResampleAvailable; nframes_t m_readExtraFrames; private: void create_overflow_buffers(); DecodeBuffer* m_resampleDecodeBuffer; bool m_resampleDecodeBufferIsMine; }; #endif traverso-0.49.4/src/audiofileio/decode/AbstractAudioReader.cpp000644 001750 001750 00000014001 11163362147 024636 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Ben Levitt This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "AbstractAudioReader.h" #include "SFAudioReader.h" #include "FlacAudioReader.h" #if defined MP3_DECODE_SUPPORT #include "MadAudioReader.h" #endif #include "WPAudioReader.h" #include "VorbisAudioReader.h" #include "ResampleAudioReader.h" #include "Utils.h" #include // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" AbstractAudioReader::AbstractAudioReader(const QString& filename) { m_fileName = filename; m_readPos = m_channels = m_nframes = 0; m_length = TimeRef(); } AbstractAudioReader::~AbstractAudioReader() { } // Read cnt frames starting at start from the AudioReader, into dst // uses seek() and read() from AudioReader subclass nframes_t AbstractAudioReader::read_from(DecodeBuffer* buffer, nframes_t start, nframes_t count) { // printf("read_from:: before_seek from %d, framepos is %d\n", start, m_readPos); if (!seek(start)) { return 0; } return read(buffer, count); } int AbstractAudioReader::get_num_channels() { return m_channels; } int AbstractAudioReader::get_file_rate() { return m_rate; } bool AbstractAudioReader::eof() { return (m_readPos >= m_nframes); } nframes_t AbstractAudioReader::pos() { return m_readPos; } bool AbstractAudioReader::seek(nframes_t start) { if (m_readPos != start) { if (!seek_private(start)) { return false; } m_readPos = start; } return true; } nframes_t AbstractAudioReader::read(DecodeBuffer* buffer, nframes_t count) { if (count && m_readPos < m_nframes) { // Make sure the read buffer is big enough for this read buffer->check_buffers_capacity(count, m_channels); // printf("read_from:: after_seek from %d, framepos is %d\n", start, m_readPos); nframes_t framesRead = read_private(buffer, count); m_readPos += framesRead; return framesRead; } return 0; } // Static method used by other classes to get an AudioReader for the correct file type AbstractAudioReader* AbstractAudioReader::create_audio_reader(const QString& filename, const QString& decoder) { AbstractAudioReader* newReader = 0; if ( ! (decoder.isEmpty() || decoder.isNull()) ) { if (decoder == "sndfile") { newReader = new SFAudioReader(filename); } else if (decoder == "wavpack") { newReader = new WPAudioReader(filename); } else if (decoder == "flac") { newReader = new FlacAudioReader(filename); } else if (decoder == "vorbis") { newReader = new VorbisAudioReader(filename); } #if defined MP3_DECODE_SUPPORT else if (decoder == "mad") { newReader = new MadAudioReader(filename); } #endif if (newReader && !newReader->is_valid()) { PERROR("new %s reader is invalid! (channels: %d, frames: %d)", QS_C(newReader->decoder_type()), newReader->get_num_channels(), newReader->get_nframes()); delete newReader; newReader = 0; } } if (!newReader) { if (FlacAudioReader::can_decode(filename)) { newReader = new FlacAudioReader(filename); } else if (VorbisAudioReader::can_decode(filename)) { newReader = new VorbisAudioReader(filename); } else if (WPAudioReader::can_decode(filename)) { newReader = new WPAudioReader(filename); } else if (SFAudioReader::can_decode(filename)) { newReader = new SFAudioReader(filename); } #if defined MP3_DECODE_SUPPORT else if (MadAudioReader::can_decode(filename)) { newReader = new MadAudioReader(filename); } #endif } if (newReader && !newReader->is_valid()) { PERROR("new %s reader is invalid! (channels: %d, frames: %d)", QS_C(newReader->decoder_type()), newReader->get_num_channels(), newReader->get_nframes()); delete newReader; newReader = 0; } return newReader; } DecodeBuffer::DecodeBuffer() { destination = 0; readBuffer = 0; m_channels = destinationBufferSize = readBufferSize = 0; m_bufferSizeCheckCounter = m_totalCheckSize = m_smallerReadCounter = 0; } void DecodeBuffer::check_buffers_capacity(uint size, uint channels) { /* m_bufferSizeCheckCounter++; m_totalCheckSize += size; float meanvalue = (m_totalCheckSize / (float)m_bufferSizeCheckCounter); if (meanvalue < destinationBufferSize && ((meanvalue + 256) < destinationBufferSize) && !(destinationBufferSize == size)) { m_smallerReadCounter++; if (m_smallerReadCounter > 8) { delete_destination_buffers(); delete_readbuffer(); m_bufferSizeCheckCounter = m_smallerReadCounter = 0; m_totalCheckSize = 0; } }*/ if (destinationBufferSize < size || m_channels < channels) { delete_destination_buffers(); m_channels = channels; destination = new audio_sample_t*[m_channels]; for (uint chan = 0; chan < m_channels; chan++) { destination[chan] = new audio_sample_t[size]; } destinationBufferSize = size; // printf("resizing destination to %.3f KB\n", (float)size*4/1024); } if (readBufferSize < (size*m_channels)) { delete_readbuffer(); readBuffer = new audio_sample_t[size*m_channels]; readBufferSize = (size*m_channels); } } void DecodeBuffer::delete_destination_buffers() { if (destination) { for (uint chan = 0; chan < m_channels; chan++) { delete [] destination[chan]; } delete [] destination; destination = 0; destinationBufferSize = 0; m_channels = 0; } } void DecodeBuffer::delete_readbuffer() { if (readBuffer) { delete [] readBuffer; readBuffer = 0; readBufferSize = 0; } } traverso-0.49.4/src/audiofileio/decode/WPAudioReader.h000644 001750 001750 00000002406 11163362147 023074 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Ben Levitt This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef WPAUDIOREADER_H #define WPAUDIOREADER_H #include #include "wavpack/wavpack.h" class WPAudioReader : public AbstractAudioReader { public: WPAudioReader(QString filename); ~WPAudioReader(); QString decoder_type() const {return "wavpack";} static bool can_decode(QString filename); protected: bool seek_private(nframes_t start); nframes_t read_private(DecodeBuffer* buffer, nframes_t frameCount); WavpackContext* m_wp; bool m_isFloat; int m_bitsPerSample; int m_bytesPerSample; }; #endif traverso-0.49.4/src/audiofileio/decode/AbstractAudioReader.h000644 001750 001750 00000004462 11163362147 024315 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Ben Levitt This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef ABSTRACTAUDIOREADER_H #define ABSTRACTAUDIOREADER_H #include "defines.h" #include class DecodeBuffer { public: DecodeBuffer(); ~DecodeBuffer() { delete_destination_buffers(); delete_readbuffer(); } void check_buffers_capacity(uint size, uint channels); audio_sample_t** destination; audio_sample_t* readBuffer; uint destinationBufferSize; uint readBufferSize; private: uint m_channels; uint m_smallerReadCounter; quint64 m_totalCheckSize; uint m_bufferSizeCheckCounter; void delete_destination_buffers(); void delete_readbuffer(); void delete_resample_buffers(); }; class AbstractAudioReader { public: AbstractAudioReader(const QString& filename); virtual ~AbstractAudioReader(); int get_num_channels(); const TimeRef& get_length() const {return m_length;} nframes_t get_nframes() const {return m_nframes;} int get_file_rate(); bool eof(); nframes_t pos(); nframes_t read_from(DecodeBuffer* buffer, nframes_t start, nframes_t count); bool seek(nframes_t start); nframes_t read(DecodeBuffer* buffer, nframes_t frameCount); bool is_valid() {return (m_channels > 0 && m_nframes > 0);} virtual QString decoder_type() const = 0; virtual void clear_buffers() {} static AbstractAudioReader* create_audio_reader(const QString& filename, const QString& decoder = 0); protected: virtual bool seek_private(nframes_t start) = 0; virtual nframes_t read_private(DecodeBuffer* buffer, nframes_t frameCount) = 0; QString m_fileName; nframes_t m_readPos; int m_channels; TimeRef m_length; nframes_t m_nframes; int m_rate; }; #endif traverso-0.49.4/src/audiofileio/decode/MadAudioReader.cpp000644 001750 001750 00000051032 11163362147 023601 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Ben Levitt * This file is based on the mp3 decoding plugin of the K3b project. * Copyright (C) 1998-2007 Sebastian Trueg This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "MadAudioReader.h" #include #include #include #include "Utils.h" RELAYTOOL_MAD; // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" static const int INPUT_BUFFER_SIZE = 5*8192; class K3bMad { public: K3bMad(); ~K3bMad(); bool open(const QString& filename); /** * @return true if the mad stream contains data * false if there is no data left or an error occurred. * In the latter case inputError() returns true. */ bool fillStreamBuffer(); /** * Skip id3 tags. * * This will reset the input file. */ bool skipTag(); /** * Find first frame and seek to the beginning of that frame. * This is used to skip the junk that many mp3 files start with. */ bool seekFirstHeader(); bool eof() const; bool inputError() const; /** * Current position in theinput file. This does NOT * care about the status of the mad stream. Use streamPos() * in that case. */ qint64 inputPos() const; /** * Current absolut position of the decoder stream. */ qint64 streamPos() const; bool inputSeek(qint64 pos); void initMad(); void cleanup(); bool decodeNextFrame(); bool findNextHeader(); bool checkFrameHeader(mad_header* header) const; void createInputBuffer(); void clearInputBuffer(); mad_stream* madStream; mad_frame* madFrame; mad_synth* madSynth; mad_timer_t* madTimer; private: QFile m_inputFile; bool m_madStructuresInitialized; unsigned char* m_inputBuffer; bool m_bInputError; int m_channels; int m_sampleRate; }; K3bMad::K3bMad() : m_madStructuresInitialized(false), m_bInputError(false) { madStream = new mad_stream; madFrame = new mad_frame; madSynth = new mad_synth; madTimer = new mad_timer_t; m_inputBuffer = 0; } K3bMad::~K3bMad() { cleanup(); delete madStream; delete madFrame; delete madSynth; delete madTimer; clearInputBuffer(); } void K3bMad::createInputBuffer() { if (!m_inputBuffer) { // // we allocate additional MAD_BUFFER_GUARD bytes to always be able to append the // zero bytes needed for decoding the last frame. // m_inputBuffer = new unsigned char[INPUT_BUFFER_SIZE+MAD_BUFFER_GUARD]; memset(m_inputBuffer, 0, INPUT_BUFFER_SIZE+MAD_BUFFER_GUARD); } } void K3bMad::clearInputBuffer() { if (m_inputBuffer) { delete [] m_inputBuffer; m_inputBuffer = 0; } } bool K3bMad::open(const QString& filename) { cleanup(); m_bInputError = false; m_channels = m_sampleRate = 0; m_inputFile.setFileName(filename); if (!m_inputFile.open(QIODevice::ReadOnly)) { PERROR("could not open file %s", QS_C(filename)); return false; } initMad(); return true; } bool K3bMad::inputError() const { return m_bInputError; } bool K3bMad::fillStreamBuffer() { /* The input bucket must be filled if it becomes empty or if * it's the first execution of the loop. */ if (madStream->buffer == 0 || madStream->error == MAD_ERROR_BUFLEN) { if (eof()) { return false; } if (!m_inputBuffer) { createInputBuffer(); } long readSize, remaining; unsigned char* readStart; if (madStream->next_frame != 0) { remaining = madStream->bufend - madStream->next_frame; memmove(m_inputBuffer, madStream->next_frame, remaining); readStart = m_inputBuffer + remaining; readSize = INPUT_BUFFER_SIZE - remaining; } else { readSize = INPUT_BUFFER_SIZE; readStart = m_inputBuffer; remaining = 0; } // Fill-in the buffer. long result = m_inputFile.read((char*)readStart, readSize); if (result < 0) { //kdDebug() << "(K3bMad) read error on bitstream)" << endl; m_bInputError = true; return false; } else if (result == 0) { //kdDebug() << "(K3bMad) end of input stream" << endl; return false; } else { readStart += result; if (eof()) { //kdDebug() << "(K3bMad::fillStreamBuffer) MAD_BUFFER_GUARD" << endl; memset(readStart, 0, MAD_BUFFER_GUARD); result += MAD_BUFFER_GUARD; } // Pipe the new buffer content to libmad's stream decoder facility. mad_stream_buffer(madStream, m_inputBuffer, result + remaining); madStream->error = MAD_ERROR_NONE; } } return true; } bool K3bMad::skipTag() { // skip the tag at the beginning of the file m_inputFile.seek(0); // // now check if the file starts with an id3 tag and skip it if so // char buf[4096]; int bufLen = 4096; if (m_inputFile.read(buf, bufLen) < bufLen) { //kdDebug() << "(K3bMad) unable to read " << bufLen << " bytes from " // << m_inputFile.name() << endl; return false; } if ((buf[0] == 'I' && buf[1] == 'D' && buf[2] == '3') && ((unsigned short)buf[3] < 0xff && (unsigned short)buf[4] < 0xff)) { // do we have a footer? bool footer = (buf[5] & 0x10); // the size is saved as a synched int meaning bit 7 is always cleared to 0 unsigned int size = ( (buf[6] & 0x7f) << 21 ) | ( (buf[7] & 0x7f) << 14 ) | ( (buf[8] & 0x7f) << 7) | (buf[9] & 0x7f); unsigned int offset = size + 10; if (footer) { offset += 10; } // skip the id3 tag if (!m_inputFile.seek(offset)) { PERROR("Couldn't seek to %u in %s", offset, QS_C(m_inputFile.fileName())); return false; } } else { // reset file return m_inputFile.seek(0); } return true; } bool K3bMad::seekFirstHeader() { // // A lot of mp3 files start with a lot of junk which confuses mad. // We "allow" an mp3 file to start with at most 1 KB of junk. This is just // some random value since we do not want to search the hole file. That would // take way to long for non-mp3 files. // bool headerFound = findNextHeader(); qint64 inputPos = streamPos(); while (!headerFound && !m_inputFile.atEnd() && streamPos() <= inputPos+1024) { headerFound = findNextHeader(); } // seek back to the begin of the frame if (headerFound) { int streamSize = madStream->bufend - madStream->buffer; int bytesToFrame = madStream->this_frame - madStream->buffer; m_inputFile.seek(m_inputFile.pos() - streamSize + bytesToFrame); //kdDebug() << "(K3bMad) found first header at " << m_inputFile.pos() << endl; } // reset the stream to make sure mad really starts decoding at out seek position mad_stream_finish(madStream); mad_stream_init(madStream); return headerFound; } bool K3bMad::eof() const { return m_inputFile.atEnd(); } qint64 K3bMad::inputPos() const { return m_inputFile.pos(); } qint64 K3bMad::streamPos() const { return inputPos() - (madStream->bufend - madStream->this_frame + 1); } bool K3bMad::inputSeek(qint64 pos) { return m_inputFile.seek(pos); } void K3bMad::initMad() { if (!m_madStructuresInitialized) { mad_stream_init(madStream); mad_timer_set(madTimer, 0, 0, 0); mad_frame_init(madFrame); mad_synth_init(madSynth); m_madStructuresInitialized = true; } } void K3bMad::cleanup() { if (m_inputFile.isOpen()) { //kdDebug() << "(K3bMad) cleanup at offset: " // << "Input file at: " << m_inputFile.pos() << " " // << "Input file size: " << m_inputFile.size() << " " // << "stream pos: " // << ( m_inputFile.pos() - (madStream->bufend - madStream->this_frame + 1) ) // << endl; m_inputFile.close(); } if (m_madStructuresInitialized) { mad_frame_finish(madFrame); mad_synth_finish(madSynth); mad_stream_finish(madStream); } m_madStructuresInitialized = false; } // // LOSTSYNC could happen when mad encounters the id3 tag... // bool K3bMad::findNextHeader() { if (!fillStreamBuffer()) { return false; } // // MAD_RECOVERABLE == true: frame was read, decoding failed (about to skip frame) // MAD_RECOVERABLE == false: frame was not read, need data // if (mad_header_decode( &madFrame->header, madStream ) < 0) { if (MAD_RECOVERABLE(madStream->error) || madStream->error == MAD_ERROR_BUFLEN) { return findNextHeader(); } else // kdDebug() << "(K3bMad::findNextHeader) error: " << mad_stream_errorstr( madStream ) << endl; // FIXME probably we should not do this here since we don't do it // in the frame decoding // if(!checkFrameHeader(&madFrame->header)) // return findNextHeader(); return false; } if (!m_channels) { m_channels = MAD_NCHANNELS(&madFrame->header); m_sampleRate = madFrame->header.samplerate; } mad_timer_add(madTimer, madFrame->header.duration); return true; } bool K3bMad::decodeNextFrame() { if (!fillStreamBuffer()) { return false; } if (mad_frame_decode(madFrame, madStream) < 0) { if (MAD_RECOVERABLE(madStream->error) || madStream->error == MAD_ERROR_BUFLEN) { return decodeNextFrame(); } return false; } if (!m_channels) { m_channels = MAD_NCHANNELS(&madFrame->header); m_sampleRate = madFrame->header.samplerate; } mad_timer_add(madTimer, madFrame->header.duration); return true; } // // This is from the arts mad decoder // bool K3bMad::checkFrameHeader(mad_header* header) const { int frameSize = MAD_NSBSAMPLES(header) * 32; if (frameSize <= 0) { return false; } if (m_channels && m_channels != MAD_NCHANNELS(header)) { return false; } return true; } class MadAudioReader::MadDecoderPrivate { public: MadDecoderPrivate() { outputBuffers = 0; outputPos = 0; outputSize = 0; overflowSize = 0; overflowStart = 0; mad_header_init( &firstHeader ); } K3bMad* handle; QVector seekPositions; bool bOutputFinished; audio_sample_t** outputBuffers; nframes_t outputPos; nframes_t outputSize; audio_sample_t** overflowBuffers; nframes_t overflowSize; nframes_t overflowStart; // the first frame header for technical info mad_header firstHeader; bool vbr; }; MadAudioReader::MadAudioReader(QString filename) : AbstractAudioReader(filename) { d = new MadDecoderPrivate(); d->handle = new K3bMad(); initDecoderInternal(); m_nframes = countFrames(); switch( d->firstHeader.mode ) { case MAD_MODE_SINGLE_CHANNEL: m_channels = 1; break; case MAD_MODE_DUAL_CHANNEL: case MAD_MODE_JOINT_STEREO: case MAD_MODE_STEREO: m_channels = 2; } if (m_nframes <= 0) { d->handle->cleanup(); delete d->handle; delete d; d = 0; return; } m_rate = d->firstHeader.samplerate; m_length = TimeRef(m_nframes, m_rate); d->overflowBuffers = 0; seek_private(0); clear_buffers(); } MadAudioReader::~MadAudioReader() { if (d) { d->handle->cleanup(); delete d->handle; clear_buffers(); delete d; } } void MadAudioReader::create_buffers() { if (!d->overflowBuffers) { d->overflowBuffers = new audio_sample_t*[m_channels]; for (int chan = 0; chan < m_channels; chan++) { d->overflowBuffers[chan] = new audio_sample_t[1152]; } } } void MadAudioReader::clear_buffers() { if (d->overflowBuffers) { for (int chan = 0; chan < m_channels; chan++) { delete [] d->overflowBuffers[chan]; } delete [] d->overflowBuffers; d->overflowBuffers = 0; d->overflowStart = 0; d->overflowSize = 0; } if (d && d->handle) { d->handle->clearInputBuffer(); } } bool MadAudioReader::can_decode(QString filename) { if (!libmad_is_present) { return false; } // // HACK: // // I am simply no good at this and this detection code is no good as well // It always takes waves for mp3 files so we introduce this hack to // filter out wave files. :( // QFile f(filename); if (!f.open( QIODevice::ReadOnly)) { return false; } char buffer[12]; if (f.read(buffer, 12) != 12) { return false; } if (!qstrncmp(buffer, "RIFF", 4) && !qstrncmp(buffer + 8, "WAVE", 4)) { return false; } f.close(); K3bMad handle; if (!handle.open(filename)) { return false; } handle.skipTag(); if (!handle.seekFirstHeader()) { return false; } if (handle.findNextHeader()) { int c = MAD_NCHANNELS(&handle.madFrame->header); int layer = handle.madFrame->header.layer; unsigned int s = handle.madFrame->header.samplerate; // // find 4 more mp3 headers (random value since 2 was not enough) // This way we get most of the mp3 files while sorting out // for example wave files. // int cnt = 1; while (handle.findNextHeader()) { // compare the found headers if (MAD_NCHANNELS(&handle.madFrame->header) == c && handle.madFrame->header.layer == layer && handle.madFrame->header.samplerate == s) { // only support layer III for now since otherwise some wave files // are taken for layer I if (++cnt >= 5) { //stdout << "(MadDecoder) valid mpeg 1 layer " << layer //<< " file with " << c << " channels and a samplerate of " //<< s << endl; return (layer == MAD_LAYER_III); } } else { break; } } } //PERROR("unsupported format: %s",QS_C(filename)); return false; } bool MadAudioReader::seek_private(nframes_t start) { Q_ASSERT(d); if (start >= m_nframes) { return false; } // // we need to reset the complete mad stuff // if (!initDecoderInternal()) { return false; } // // search a position // This is all hacking, I don't really know what I am doing here... ;) // double mp3FrameSecs = static_cast(d->firstHeader.duration.seconds) + static_cast(d->firstHeader.duration.fraction) / static_cast(MAD_TIMER_RESOLUTION); double posSecs = static_cast(start) / m_rate; // seekPosition to seek after frame i unsigned int frame = static_cast(posSecs / mp3FrameSecs); nframes_t frameOffset = (nframes_t)(start - (frame * mp3FrameSecs * m_rate + 0.5)); // K3b source: Rob said: 29 frames is the theoretically max frame reservoir limit // (whatever that means...) it seems that mad needs at most 29 frames to get ready // // Ben says: It looks like Rob (the author of MAD) implies here: // http://www.mars.org/mailman/public/mad-dev/2001-August/000321.html // that 3 frames (1 + 2 extra) is enough... much faster, and seems to work fine... unsigned int frameReservoirProtect = (frame > 3 ? 3 : frame); frame -= frameReservoirProtect; // seek in the input file behind the already decoded data d->handle->inputSeek( d->seekPositions[frame] ); // decode some frames ignoring MAD_ERROR_BADDATAPTR errors unsigned int i = 1; while (i <= frameReservoirProtect) { d->handle->fillStreamBuffer(); if (mad_frame_decode( d->handle->madFrame, d->handle->madStream)) { if (MAD_RECOVERABLE( d->handle->madStream->error)) { if (d->handle->madStream->error == MAD_ERROR_BUFLEN) { continue; } else if (d->handle->madStream->error != MAD_ERROR_BADDATAPTR) { //kdDebug() << "(K3bMadDecoder) Seeking: recoverable mad error (" //<< mad_stream_errorstr(d->handle->madStream) << ")" << endl; continue; } else { //kdDebug() << "(K3bMadDecoder) Seeking: ignoring (" //<< mad_stream_errorstr(d->handle->madStream) << ")" << endl; } } else { return false; } } if (i == frameReservoirProtect) { // synth only the last frame (Rob said so ;) mad_synth_frame( d->handle->madSynth, d->handle->madFrame ); } ++i; } d->overflowStart = 0; d->overflowSize = 0; // Seek to exact traverso frame, within this mp3 frame if (frameOffset > 0) { //printf("seekOffset: %lu (start: %lu)\n", frameOffset, start); d->outputBuffers = 0; // Zeros so that we write to overflow d->outputSize = 0; d->outputPos = 0; createPcmSamples(d->handle->madSynth); d->overflowStart = frameOffset; d->overflowSize -= frameOffset; } return true; } bool MadAudioReader::initDecoderInternal() { d->handle->cleanup(); d->bOutputFinished = false; if (!d->handle->open(m_fileName)) { return false; } if (!d->handle->skipTag()) { return false; } if (!d->handle->seekFirstHeader()) { return false; } return true; } unsigned long MadAudioReader::countFrames() { unsigned long frames = 0; bool error = false; d->vbr = false; bool bFirstHeaderSaved = false; d->seekPositions.clear(); while (!error && d->handle->findNextHeader()) { if (!bFirstHeaderSaved) { bFirstHeaderSaved = true; d->firstHeader = d->handle->madFrame->header; } else if (d->handle->madFrame->header.bitrate != d->firstHeader.bitrate) { d->vbr = true; } // // position in stream: position in file minus the not yet used buffer // unsigned long long seekPos = d->handle->inputPos() - (d->handle->madStream->bufend - d->handle->madStream->this_frame + 1); // save the number of bytes to be read to decode i-1 frames at position i // in other words: when seeking to seekPos the next decoded frame will be i d->seekPositions.append(seekPos); } if (!d->handle->inputError() && !error) { frames = d->firstHeader.samplerate * (d->handle->madTimer->seconds + (unsigned long)( (float)d->handle->madTimer->fraction/(float)MAD_TIMER_RESOLUTION)); } d->handle->cleanup(); return frames; } nframes_t MadAudioReader::read_private(DecodeBuffer* buffer, nframes_t frameCount) { d->outputBuffers = buffer->destination; d->outputSize = frameCount; d->outputPos = 0; bool bOutputBufferFull = false; // Deal with existing overflow if (d->overflowSize > 0) { if (d->overflowSize < frameCount) { //printf("output all %d overflow samples\n", d->overflowSize); for (int chan = 0; chan < m_channels; chan++) { memcpy(d->outputBuffers[chan], d->overflowBuffers[chan] + d->overflowStart, d->overflowSize * sizeof(audio_sample_t)); } d->outputPos += d->overflowSize; d->overflowSize = 0; d->overflowStart = 0; } else { //printf("output %d overflow frames, returned from overflow\n", frameCount); for (int chan = 0; chan < m_channels; chan++) { memcpy(d->outputBuffers[chan], d->overflowBuffers[chan] + d->overflowStart, frameCount * sizeof(audio_sample_t)); } d->overflowSize -= frameCount; d->overflowStart += frameCount; return frameCount; } } while (!bOutputBufferFull && d->handle->fillStreamBuffer()) { // a mad_synth contains of the data of one mad_frame // one mad_frame represents a mp3-frame which is always 1152 samples // for us that means we need 1152 samples per channel of output buffer // for every frame if (d->outputPos >= d->outputSize) { bOutputBufferFull = true; } else if (d->handle->decodeNextFrame()) { // // Once decoded the frame is synthesized to PCM samples. No errors // are reported by mad_synth_frame(); // mad_synth_frame( d->handle->madSynth, d->handle->madFrame ); // this fills the output buffer if (!createPcmSamples(d->handle->madSynth)) { PERROR("createPcmSamples"); return 0; } } else if (d->handle->inputError()) { PERROR("inputError"); return 0; } } nframes_t framesWritten = d->outputPos; return framesWritten; } bool MadAudioReader::createPcmSamples(mad_synth* synth) { audio_sample_t **writeBuffers = d->outputBuffers; int offset = d->outputPos; nframes_t nframes = synth->pcm.length; bool overflow = false; nframes_t i; if (!d->overflowBuffers) { create_buffers(); } if (writeBuffers && (m_readPos + d->outputPos + nframes) > m_nframes) { nframes = m_nframes - (m_readPos + offset); } // now create the output for (i = 0; i < nframes; i++) { if (overflow == false && d->outputPos + i >= d->outputSize) { writeBuffers = d->overflowBuffers; offset = 0 - i; overflow = true; } /* Left channel */ writeBuffers[0][offset + i] = mad_f_todouble(synth->pcm.samples[0][i]); /* Right channel. If the decoded stream is monophonic then no right channel */ if (synth->pcm.channels == 2) { writeBuffers[1][offset + i] = mad_f_todouble(synth->pcm.samples[1][i]); } } // pcm conversion if (overflow) { d->overflowSize = i + offset; d->overflowStart = 0; d->outputPos -= offset; // i was stored here when we switched to writing to overflow //printf("written: %d (overflow: %u)\n", nframes - d->overflowSize, d->overflowSize); } else { d->outputPos += i; //printf("written: %d (os=%lu)\n", i, d->overflowSize); } return true; } traverso-0.49.4/src/audiofileio/decode/SFAudioReader.cpp000644 001750 001750 00000006706 11163362147 023420 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Ben Levitt This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "SFAudioReader.h" #include #include "Utils.h" // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" SFAudioReader::SFAudioReader(QString filename) : AbstractAudioReader(filename) { /* although libsndfile says we don't need to set this, valgrind and source code shows us that we do. Really? Look it up ! */ memset (&m_sfinfo, 0, sizeof(m_sfinfo)); m_file.setFileName(m_fileName); if (!m_file.open(QIODevice::ReadOnly)) { qWarning("SFAudioReader::Could not open soundfile (%s)", QS_C(m_fileName)); return; } if ((m_sf = sf_open_fd (m_file.handle(), SFM_READ, &m_sfinfo, false)) == 0) { qWarning("SFAudioReader::Could not open soundfile (%s)", QS_C(m_fileName)); return; } m_channels = m_sfinfo.channels; m_nframes = m_sfinfo.frames; m_rate = m_sfinfo.samplerate; m_length = TimeRef(m_nframes, m_rate); } SFAudioReader::~SFAudioReader() { if (m_sf) { if (sf_close(m_sf)) { qWarning("sf_close returned an error!"); } } } bool SFAudioReader::can_decode(QString filename) { SF_INFO infos; /* although libsndfile says we don't need to set this, valgrind and source code shows us that we do. Really? Look it up ! */ memset (&infos, 0, sizeof(infos)); QFile file(filename); if (!file.open(QIODevice::ReadOnly)) { qWarning("SFAudioReader::can_decode: Couldn't open soundfile (%s)", QS_C(filename)); return false; } SNDFILE* sndfile = sf_open_fd(file.handle(), SFM_READ, &infos, false); //is it supported by libsndfile? if (!sndfile) { return false; } sf_close(sndfile); return true; } bool SFAudioReader::seek_private(nframes_t start) { Q_ASSERT(m_sf); if (start >= m_nframes) { return false; } if (sf_seek (m_sf, (off_t) start, SEEK_SET) < 0) { char errbuf[256]; sf_error_str (0, errbuf, sizeof (errbuf) - 1); PERROR("ReadAudioSource: could not seek to frame %d within %s (%s)", start, QS_C(m_fileName), errbuf); return false; } return true; } nframes_t SFAudioReader::read_private(DecodeBuffer* buffer, nframes_t frameCount) { Q_ASSERT(m_sf); int framesRead = sf_readf_float(m_sf, buffer->readBuffer, frameCount); // De-interlace switch (m_channels) { case 1: memcpy(buffer->destination[0], buffer->readBuffer, framesRead * sizeof(audio_sample_t)); break; case 2: for (int f = 0; f < framesRead; f++) { int pos = f*2; buffer->destination[0][f] = buffer->readBuffer[pos]; buffer->destination[1][f] = buffer->readBuffer[pos + 1]; } break; default: for (int f = 0; f < framesRead; f++) { for (int c = 0; c < m_channels; c++) { buffer->destination[c][f] = buffer->readBuffer[f * m_channels + c]; } } } return framesRead; } traverso-0.49.4/src/audiofileio/encode/000755 001750 001750 00000000000 12357214027 020277 5ustar00remonremon000000 000000 traverso-0.49.4/src/audiofileio/encode/AbstractAudioWriter.cpp000644 001750 001750 00000005726 11163362147 024740 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Ben Levitt This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "AbstractAudioWriter.h" #include "SFAudioWriter.h" #include "WPAudioWriter.h" #if defined MP3_ENCODE_SUPPORT #include "LameAudioWriter.h" #endif #include "VorbisAudioWriter.h" #include "FlacAudioWriter.h" #include RELAYTOOL_WAVPACK; RELAYTOOL_MP3LAME; RELAYTOOL_FLAC; // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" AbstractAudioWriter::AbstractAudioWriter() { m_channels = 0; m_rate = 0; m_sampleWidth = 0; m_writePos = 0; m_isOpen = false; } AbstractAudioWriter::~AbstractAudioWriter() { } void AbstractAudioWriter::set_num_channels(int channels) { m_channels = channels; } void AbstractAudioWriter::set_bits_per_sample(int bits) { m_sampleWidth = bits; } void AbstractAudioWriter::set_rate(int rate) { m_rate = rate; } bool AbstractAudioWriter::set_format_attribute(const QString& key, const QString& value) { Q_UNUSED(key); Q_UNUSED(value); return false; } nframes_t AbstractAudioWriter::pos() { return m_writePos; } bool AbstractAudioWriter::open(const QString& filename) { if (m_isOpen) { close(); } m_writePos = 0; m_fileName = filename; m_isOpen = open_private(); return m_isOpen; } bool AbstractAudioWriter::close() { bool success = false;; if (m_isOpen) { success = close_private(); m_isOpen = false; } return success; } nframes_t AbstractAudioWriter::write(void* buffer, nframes_t count) { if (m_isOpen && buffer && count) { nframes_t framesWritten = write_private(buffer, count); if (framesWritten > 0) { m_writePos += framesWritten; } return framesWritten; } return 0; } // Static method used by other classes to get an AudioWriter for the correct file type AbstractAudioWriter* AbstractAudioWriter::create_audio_writer(const QString& type) { if (type == "sndfile") { return new SFAudioWriter(); } else if (libwavpack_is_present && type == "wavpack") { return new WPAudioWriter(); } #if defined MP3_ENCODE_SUPPORT else if (libmp3lame_is_present && type == "lame") { return new LameAudioWriter(); } #endif else if (type == "vorbis") { return new VorbisAudioWriter(); } else if (libFLAC_is_present && type == "flac") { return new FlacAudioWriter(); } return 0; } traverso-0.49.4/src/audiofileio/encode/WPAudioWriter.cpp000644 001750 001750 00000014751 12357214027 023520 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Ben Levitt This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "WPAudioWriter.h" #include #include "Utils.h" #include // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" WPAudioWriter::WPAudioWriter() : AbstractAudioWriter() { m_wp = 0; m_firstBlock = 0; m_firstBlockSize = 0; m_tmp_buffer = 0; m_tmpBufferSize = 0; m_configFlags = 0; } WPAudioWriter::~WPAudioWriter() { if (m_wp) { close_private(); } if (m_firstBlock) { delete [] m_firstBlock; } } const char* WPAudioWriter::get_extension() { return ".wv"; } bool WPAudioWriter::set_format_attribute(const QString& key, const QString& value) { if (key == "quality") { // Clear quality before or-ing in the new quality value m_configFlags &= ~(CONFIG_FAST_FLAG | CONFIG_HIGH_FLAG | CONFIG_VERY_HIGH_FLAG); if (value == "fast") { m_configFlags |= CONFIG_FAST_FLAG; return true; } else if (value == "high") { // CONFIG_HIGH_FLAG (default) ~ 1.5 times slower then FAST, ~ 20% extra compression then FAST m_configFlags |= CONFIG_HIGH_FLAG; return true; } else if (value == "very_high") { // CONFIG_VERY_HIGH_FLAG ~ 2 times slower then FAST, ~ 25 % extra compression then FAST m_configFlags |= CONFIG_HIGH_FLAG; m_configFlags |= CONFIG_VERY_HIGH_FLAG; return true; } } if (key == "skip_wvx") { if (value == "true") { // This option reduces the storage of some floating-point data files by up to about 10% by eliminating some // information that has virtually no effect on the audio data. While this does technically make the compression // lossy, it retains all the advantages of floating point data (>600 dB of dynamic range, no clipping, and 25 bits // of resolution). This also affects large integer compression by limiting the resolution to 24 bits. m_configFlags |= CONFIG_SKIP_WVX; return true; } else if (value == "false") { m_configFlags &= ~CONFIG_SKIP_WVX; return true; } } return false; } bool WPAudioWriter::open_private() { m_file = fopen(m_fileName.toUtf8().data(), "wb"); if (!m_file) { qWarning("Couldn't open file %s.", QS_C(m_fileName)); return false; } m_wp = WavpackOpenFileOutput(WPAudioWriter::write_block, (void *)this, NULL); if (!m_wp) { fclose(m_file); return false; } memset (&m_config, 0, sizeof(m_config)); m_config.bytes_per_sample = (m_sampleWidth == 1) ? 4 : m_sampleWidth/8; m_config.bits_per_sample = (m_sampleWidth == 1) ? 32 : m_sampleWidth; if (m_sampleWidth == 1) m_config.float_norm_exp = 127; // config->float_norm_exp, select floating-point data (127 for +/-1.0) m_config.channel_mask = (m_channels == 2) ? 3 : 4; // Microsoft standard (mono = 4, stereo = 3) m_config.num_channels = m_channels; m_config.sample_rate = m_rate; m_config.flags = m_configFlags; WavpackSetConfiguration(m_wp, &m_config, -1); if (!WavpackPackInit(m_wp)) { fclose(m_file); WavpackCloseFile(m_wp); m_wp = 0; return false; } m_firstBlock = 0; m_firstBlockSize = 0; return true; } int WPAudioWriter::write_to_file(void *lpBuffer, uint32_t nNumberOfBytesToWrite, uint32_t *lpNumberOfBytesWritten) { uint32_t bcount; *lpNumberOfBytesWritten = 0; while (nNumberOfBytesToWrite) { bcount = fwrite((uchar *) lpBuffer + *lpNumberOfBytesWritten, 1, nNumberOfBytesToWrite, m_file); if (bcount) { *lpNumberOfBytesWritten += bcount; nNumberOfBytesToWrite -= bcount; } else { break; } } int err = ferror(m_file); return !err; } int WPAudioWriter::write_block(void *id, void *data, int32_t length) { WPAudioWriter* writer = (WPAudioWriter*) id; uint32_t bcount; if (writer && writer->m_file && data && length) { if (writer->m_firstBlock == 0) { writer->m_firstBlock = new char[length]; memcpy(writer->m_firstBlock, data, length); writer->m_firstBlockSize = length; } if (!writer->write_to_file(data, (uint32_t)length, (uint32_t*)&bcount) || bcount != (uint32_t)length) { fclose(writer->m_file); writer->m_wp = 0; return false; } } return true; } bool WPAudioWriter::rewrite_first_block() { if (!m_firstBlock || !m_file || !m_wp) { return false; } WavpackUpdateNumSamples (m_wp, m_firstBlock); if (fseek(m_file, 0, SEEK_SET) != 0) { return false; } if (!write_block(this, m_firstBlock, m_firstBlockSize)) { return false; } return true; } nframes_t WPAudioWriter::write_private(void* buffer, nframes_t frameCount) { // FIXME: // Instead of this block, add an option to gdither to leave each // 8bit or 16bit sample in a 0-padded, int32_t // if (m_sampleWidth > 1 && m_sampleWidth < 24) { // Not float, or 32bit int, or 24bit int if (frameCount > m_tmpBufferSize) { if (m_tmp_buffer) { delete [] m_tmp_buffer; } m_tmp_buffer = new int32_t[frameCount * m_channels]; m_tmpBufferSize = frameCount; } for (nframes_t s = 0; s < frameCount * m_channels; s++) { switch (m_sampleWidth) { case 8: m_tmp_buffer[s] = ((int8_t*)buffer)[s]; break; case 16: m_tmp_buffer[s] = ((int16_t*)buffer)[s]; break; default: // Less than 24 bit, but not 8 or 16 ? This won't end well... break; } } if (WavpackPackSamples(m_wp, m_tmp_buffer, frameCount) == false) { return 0; } return frameCount; } if (WavpackPackSamples(m_wp, (int32_t *)buffer, frameCount) == false) { return 0; } return frameCount; } bool WPAudioWriter::close_private() { bool success = true; if (WavpackFlushSamples(m_wp) == false) { success = false; } if (rewrite_first_block() == false) { success = false; } WavpackCloseFile(m_wp); m_wp = 0; fclose(m_file); m_file = 0; if (m_tmp_buffer) { delete [] m_tmp_buffer; m_tmp_buffer = 0; } m_tmpBufferSize = 0; if (m_firstBlock) { delete [] m_firstBlock; m_firstBlock = 0; m_firstBlockSize = 0; } return success; } traverso-0.49.4/src/audiofileio/encode/AbstractAudioWriter.h000644 001750 001750 00000003157 11163362147 024401 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Ben Levitt This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef ABSTRACTAUDIOWRITER_H #define ABSTRACTAUDIOWRITER_H #include "defines.h" class QString; class AbstractAudioWriter { public: AbstractAudioWriter(); virtual ~AbstractAudioWriter(); virtual const char* get_extension() = 0; void set_num_channels(int channels); void set_bits_per_sample(int bits); void set_rate(int rate); virtual bool set_format_attribute(const QString& key, const QString& value); nframes_t pos(); bool open(const QString& filename); nframes_t write(void* buffer, nframes_t frameCount); bool close(); static AbstractAudioWriter* create_audio_writer(const QString& type); protected: virtual bool open_private() = 0; virtual nframes_t write_private(void* buffer, nframes_t frameCount) = 0; virtual bool close_private() = 0; QString m_fileName; bool m_isOpen; int m_sampleWidth; nframes_t m_writePos; int m_channels; int m_rate; }; #endif traverso-0.49.4/src/audiofileio/encode/FlacAudioWriter.cpp000644 001750 001750 00000012714 11163362147 024035 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Ben Levitt * Based on the ogg encoder module for K3b. * Copyright (C) 1998-2007 Sebastian Trueg This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "FlacAudioWriter.h" #include "Utils.h" #include #include "FLAC/export.h" #if !defined FLAC_API_VERSION_CURRENT || FLAC_API_VERSION_CURRENT < 6 #define LEGACY_FLAC #include "FLAC/file_encoder.h" #else #undef LEGACY_FLAC #include "FLAC/stream_encoder.h" #endif RELAYTOOL_FLAC; #include // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" class FlacAudioWriter::Private { public: Private() : encoder(0), quality(5), buffer(0), bufferSize(0) { } ~Private() { if (buffer) { delete [] buffer; } } #ifdef LEGACY_FLAC FLAC__FileEncoder *encoder; #else FLAC__StreamEncoder *encoder; #endif int quality; int32_t *buffer; long bufferSize; }; FlacAudioWriter::FlacAudioWriter() : AbstractAudioWriter() { d = new Private(); } FlacAudioWriter::~FlacAudioWriter() { cleanup(); delete d; } const char* FlacAudioWriter::get_extension() { return ".flac"; } bool FlacAudioWriter::set_format_attribute(const QString& key, const QString& value) { Q_UNUSED(key); Q_UNUSED(value); return false; } bool FlacAudioWriter::open_private() { cleanup(); /* allocate the encoder */ #ifdef LEGACY_FLAC if ((d->encoder = FLAC__file_encoder_new()) == NULL) { #else if ((d->encoder = FLAC__stream_encoder_new()) == NULL) { #endif PERROR("ERROR: allocating encoder"); return false; } bool ok = true; #ifdef LEGACY_FLAC //ok &= FLAC__file_encoder_set_compression_level(d->encoder, d->quality); ok &= FLAC__file_encoder_set_channels(d->encoder, m_channels); ok &= FLAC__file_encoder_set_bits_per_sample(d->encoder, m_sampleWidth); ok &= FLAC__file_encoder_set_sample_rate(d->encoder, m_rate); ok &= FLAC__file_encoder_set_total_samples_estimate(d->encoder, 0); // Set when done ok &= FLAC__file_encoder_set_filename(d->encoder, QS_C(m_fileName)); #else ok &= FLAC__stream_encoder_set_compression_level(d->encoder, d->quality); ok &= FLAC__stream_encoder_set_channels(d->encoder, m_channels); ok &= FLAC__stream_encoder_set_bits_per_sample(d->encoder, m_sampleWidth); ok &= FLAC__stream_encoder_set_sample_rate(d->encoder, m_rate); ok &= FLAC__stream_encoder_set_total_samples_estimate(d->encoder, 0); // Set when done #endif /* initialize encoder */ if (ok) { #ifdef LEGACY_FLAC FLAC__FileEncoderState init_status; init_status = FLAC__file_encoder_init(d->encoder); if (init_status != FLAC__FILE_ENCODER_OK) { PERROR("ERROR: initializing encoder: %s", FLAC__FileEncoderStateString[init_status]); ok = false; } #else FLAC__StreamEncoderInitStatus init_status; init_status = FLAC__stream_encoder_init_file(d->encoder, QS_C(m_fileName), NULL, /*client_data=*/NULL); if (init_status != FLAC__STREAM_ENCODER_INIT_STATUS_OK) { PERROR("ERROR: initializing encoder: %s", FLAC__StreamEncoderInitStatusString[init_status]); ok = false; } #endif } return ok; } nframes_t FlacAudioWriter::write_private(void* buffer, nframes_t frameCount) { FLAC__byte *data = (FLAC__byte *)buffer; if (d->bufferSize < (long)(frameCount * m_channels)) { if (d->buffer) { delete [] d->buffer; } d->bufferSize = frameCount * m_channels; d->buffer = new int32_t[d->bufferSize]; } if (m_sampleWidth == 8) { for (nframes_t i = 0; i < frameCount * m_channels; i++) { d->buffer[i] = data[i]; } } else if (m_sampleWidth == 16) { for (nframes_t i = 0; i < frameCount * m_channels; i++) { d->buffer[i] = (FLAC__int32)(((FLAC__int16)(FLAC__int8)data[2*i+1] << 8) | (FLAC__int16)data[2*i]); } } else if (m_sampleWidth == 24 || m_sampleWidth == 32) { for (nframes_t i = 0; i < frameCount * m_channels; i++) { d->buffer[i] = (FLAC__int64)(((FLAC__int32)(((FLAC__int16)(FLAC__int8)data[4*i+1] << 8) | (FLAC__int16)data[4*i]) << 16) | (FLAC__int64)(((FLAC__int16)(FLAC__int8)data[4*i+3] << 8) | (FLAC__int16)data[4*i+2])); } } #ifdef LEGACY_FLAC bool ok = FLAC__file_encoder_process_interleaved(d->encoder, d->buffer, frameCount); #else bool ok = FLAC__stream_encoder_process_interleaved(d->encoder, d->buffer, frameCount); #endif return ((ok) ? frameCount : 0); } void FlacAudioWriter::cleanup() { if (d->encoder) { #ifdef LEGACY_FLAC FLAC__file_encoder_delete(d->encoder); #else FLAC__stream_encoder_delete(d->encoder); #endif d->encoder = 0; } } bool FlacAudioWriter::close_private() { #ifdef LEGACY_FLAC FLAC__file_encoder_finish(d->encoder); bool success = (FLAC__file_encoder_get_state(d->encoder) == FLAC__FILE_ENCODER_UNINITIALIZED); #else bool success = FLAC__stream_encoder_finish(d->encoder); #endif // FIXME: Rewrite the header to store the real length (num samples) cleanup(); return success; } traverso-0.49.4/src/audiofileio/encode/VorbisAudioWriter.cpp000644 001750 001750 00000022252 11163362147 024432 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Ben Levitt * Based on the ogg encoder module for K3b. * Copyright (C) 1998-2007 Sebastian Trueg This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "VorbisAudioWriter.h" #include #include // for the random generator #include #include #include RELAYTOOL_VORBISFILE; // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" class VorbisAudioWriter::Private { public: Private() : manualBitrate(false), qualityLevel(4), bitrateUpper(-1), bitrateNominal(-1), bitrateLower(-1), sampleRate(0), oggStream(0), oggPage(0), oggPacket(0), vorbisInfo(0), vorbisComment(0), vorbisDspState(0), vorbisBlock(0), fid(0), headersWritten(false) { } // encoding settings bool manualBitrate; // 0 to 10 -> 0.0 - 1.0 int qualityLevel; int bitrateUpper; int bitrateNominal; int bitrateLower; int sampleRate; // encoding structures ogg_stream_state *oggStream; // take physical pages, weld into a logical stream of packets ogg_page *oggPage; // one Ogg bitstream page. Vorbis packets are inside ogg_packet *oggPacket; // one raw packet of data for decode vorbis_info *vorbisInfo; // struct that stores all the static vorbis bitstream settings vorbis_comment *vorbisComment; // struct that stores all the user comments vorbis_dsp_state *vorbisDspState; // central working state for the packet->PCM decoder vorbis_block *vorbisBlock; // local working space for packet->PCM decode FILE *fid; bool headersWritten; }; VorbisAudioWriter::VorbisAudioWriter() : AbstractAudioWriter() { d = new Private(); } VorbisAudioWriter::~VorbisAudioWriter() { cleanup(); delete d; } const char* VorbisAudioWriter::get_extension() { return ".ogg"; } bool VorbisAudioWriter::set_format_attribute(const QString& key, const QString& value) { if (key == "mode") { d->manualBitrate = (value == "manual"); return true; } else if (key == "bitrateLower") { d->bitrateLower = value.toInt(); return true; } else if (key == "bitrateNominal") { d->bitrateNominal = value.toInt(); return true; } else if (key == "bitrateUpper") { d->bitrateUpper = value.toInt(); return true; } else if (key == "vbrQuality") { // -1 to 10 d->qualityLevel = value.toInt(); return true; } return false; } bool VorbisAudioWriter::open_private() { cleanup(); d->fid = fopen(m_fileName.toUtf8().data(), "w+"); if (!d->fid) { return false; } d->oggPage = new ogg_page; d->oggPacket = new ogg_packet; d->vorbisInfo = new vorbis_info; vorbis_info_init(d->vorbisInfo); int ret = 0; if (d->manualBitrate) { ret = vorbis_encode_init(d->vorbisInfo, m_channels, m_rate, d->bitrateUpper != -1 ? d->bitrateUpper*1000 : -1, d->bitrateNominal != -1 ? d->bitrateNominal*1000 : -1, d->bitrateLower != -1 ? d->bitrateLower*1000 : -1 ); } else { if (d->qualityLevel < -1) { d->qualityLevel = -1; } else if (d->qualityLevel > 10) { d->qualityLevel = 10; } ret = vorbis_encode_init_vbr(d->vorbisInfo, m_channels, m_rate, (float)d->qualityLevel/10.0); } if (ret) { PERROR("vorbis_encode_init failed: %d", ret); cleanup(); return false; } // init the comment stuff d->vorbisComment = new vorbis_comment; vorbis_comment_init(d->vorbisComment); // add the encoder tag (so everybody knows we did it! ;) vorbis_comment_add_tag(d->vorbisComment, (char*)"ENCODER", (char*)"Traverso"); // set up the analysis state and auxiliary encoding storage d->vorbisDspState = new vorbis_dsp_state; d->vorbisBlock = new vorbis_block; vorbis_analysis_init(d->vorbisDspState, d->vorbisInfo); vorbis_block_init(d->vorbisDspState, d->vorbisBlock); // set up our packet->stream encoder // pick a random serial number; that way we can more likely build // chained streams just by concatenation d->oggStream = new ogg_stream_state; srand(time(0)); ogg_stream_init(d->oggStream, rand()); return true; } bool VorbisAudioWriter::writeOggHeaders() { if (!d->oggStream) { PERROR("call to writeOggHeaders without init."); return false; } if (d->headersWritten) { PERROR("headers already written."); return true; } // // Vorbis streams begin with three headers; the initial header (with // most of the codec setup parameters) which is mandated by the Ogg // bitstream spec. The second header holds any comment fields. The // third header holds the bitstream codebook. We merely need to // make the headers, then pass them to libvorbis one at a time; // libvorbis handles the additional Ogg bitstream constraints // ogg_packet header; ogg_packet header_comm; ogg_packet header_code; vorbis_analysis_headerout(d->vorbisDspState, d->vorbisComment, &header, &header_comm, &header_code); // automatically placed in its own page ogg_stream_packetin(d->oggStream, &header); ogg_stream_packetin(d->oggStream, &header_comm); ogg_stream_packetin(d->oggStream, &header_code); // // This ensures the actual // audio data will start on a new page, as per spec // QByteArray data; while (ogg_stream_flush(d->oggStream, d->oggPage)) { fwrite((char*)d->oggPage->header, 1, d->oggPage->header_len, d->fid); fwrite((char*)d->oggPage->body, 1, d->oggPage->body_len, d->fid); } d->headersWritten = true; return true; } nframes_t VorbisAudioWriter::write_private(void* buffer, nframes_t frameCount) { if (!d->headersWritten) { if (!writeOggHeaders()) { return 0; } } char* data = (char*)buffer; // expose the buffer to submit data float** writeBuffer = vorbis_analysis_buffer(d->vorbisDspState, frameCount); if (!writeBuffer) { return 0; } // uninterleave samples if (m_channels == 1) { for (nframes_t i = 0; i < frameCount; i++) { // Currently assumes 16bit audio writeBuffer[0][i]=( (data[i*2+1]<<8) | (0x00ff&(int)data[i*2]) ) / 32768.f; } } else { for (nframes_t i = 0; i < frameCount; i++) { // Currently assumes 16bit audio writeBuffer[0][i]=( (data[i*4+1]<<8) | (0x00ff&(int)data[i*4]) ) / 32768.f; writeBuffer[1][i]=( (data[i*4+3]<<8) | (0x00ff&(int)data[i*4+2]) ) / 32768.f; } } // tell the library how much we actually submitted vorbis_analysis_wrote(d->vorbisDspState, frameCount); return ((flushVorbis() != -1) ? frameCount : 0); } long VorbisAudioWriter::flushVorbis() { // vorbis does some data preanalysis, then divvies up blocks for // more involved (potentially parallel) processing. Get a single // block for encoding now long writtenData = 0; bool success = true; while (vorbis_analysis_blockout( d->vorbisDspState, d->vorbisBlock ) == 1) { // analysis vorbis_analysis(d->vorbisBlock, 0); vorbis_bitrate_addblock(d->vorbisBlock); while (vorbis_bitrate_flushpacket(d->vorbisDspState, d->oggPacket)) { // weld the packet into the bitstream ogg_stream_packetin(d->oggStream, d->oggPacket); // write out pages (if any) while (ogg_stream_pageout(d->oggStream, d->oggPage)) { if (fwrite((char*)d->oggPage->header, 1, d->oggPage->header_len, d->fid) != (uint)d->oggPage->header_len || fwrite((char*)d->oggPage->body, 1, d->oggPage->body_len, d->fid) != (uint)d->oggPage->body_len) { success = false; } writtenData += (d->oggPage->header_len + d->oggPage->body_len); } } } return ((success) ? writtenData : -1); } void VorbisAudioWriter::cleanup() { if (d->oggStream) { ogg_stream_clear(d->oggStream); delete d->oggStream; d->oggStream = 0; } if (d->vorbisBlock) { vorbis_block_clear(d->vorbisBlock); delete d->vorbisBlock; d->vorbisBlock = 0; } if (d->vorbisDspState) { vorbis_dsp_clear(d->vorbisDspState); delete d->vorbisDspState; d->vorbisDspState = 0; } if (d->vorbisComment) { vorbis_comment_clear(d->vorbisComment); delete d->vorbisComment; d->vorbisComment = 0; } if (d->vorbisInfo) { vorbis_info_clear(d->vorbisInfo); delete d->vorbisInfo; d->vorbisInfo = 0; } // ogg_page and ogg_packet structs always point to storage in // libvorbis. They're never freed or manipulated directly if (d->oggPage) { delete d->oggPage; d->oggPage = 0; } if (d->oggPacket) { delete d->oggPacket; d->oggPacket = 0; } if (d->fid) { fclose(d->fid); d->fid = 0; } d->headersWritten = false; } bool VorbisAudioWriter::close_private() { bool success = true; if (d->vorbisDspState) { vorbis_analysis_wrote(d->vorbisDspState, 0); if (flushVorbis() == -1) { success = false; } } cleanup(); return success; } traverso-0.49.4/src/audiofileio/encode/LameAudioWriter.h000644 001750 001750 00000003002 11163362147 023501 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Ben Levitt This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef LAMEAUDIOWRITER_H #define LAMEAUDIOWRITER_H #include "AbstractAudioWriter.h" #include "defines.h" class QString; class LameAudioWriter : public AbstractAudioWriter { public: LameAudioWriter(); ~LameAudioWriter(); bool set_format_attribute(const QString& key, const QString& value); const char* get_extension(); protected: bool open_private(); nframes_t write_private(void* buffer, nframes_t frameCount); bool close_private(); struct LameInfo; LameInfo* m_lameInfo; char *m_buffer; long m_bufferSize; FILE* m_fid; int m_method; // 0=CBR, 1=ABR, 2=VBR-old, 3=VBR-new int m_minBitrate; // unused for CBR, ABR int m_maxBitrate; // used as the bitrate for CBR, ABR int m_quality; // performance / quality tradeoff 0=slow and good, 9=fast and rough }; #endif traverso-0.49.4/src/audiofileio/encode/SFAudioWriter.h000644 001750 001750 00000002476 11163362147 023151 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Ben Levitt This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef SFAUDIOWRITER_H #define SFAUDIOWRITER_H #include "AbstractAudioWriter.h" #include "defines.h" #include "sndfile.h" #include class QString; class SFAudioWriter : public AbstractAudioWriter { public: SFAudioWriter(); ~SFAudioWriter(); bool set_format_attribute(const QString& key, const QString& value); const char* get_extension(); protected: bool open_private(); nframes_t write_private(void* buffer, nframes_t frameCount); bool close_private(); int get_sf_format(); int m_fileType; SNDFILE* m_sf; SF_INFO m_sfinfo; private: QFile m_file; }; #endif traverso-0.49.4/src/audiofileio/encode/LameAudioWriter.cpp000644 001750 001750 00000012405 11163362147 024043 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Ben Levitt This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "LameAudioWriter.h" #include #include #include RELAYTOOL_MP3LAME; // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" // This just exists to keep lame types private and out of LameAudioWriter.h struct LameAudioWriter::LameInfo { lame_global_flags *flags; }; LameAudioWriter::LameAudioWriter() : AbstractAudioWriter() { m_fid = 0; m_lameInfo = new LameInfo(); m_lameInfo->flags = 0; m_bufferSize = 0; m_buffer = 0; // Quality settings m_method = 0; m_minBitrate = 0; m_maxBitrate = 0; m_quality = 0; } LameAudioWriter::~LameAudioWriter() { if (m_fid) { close_private(); } if (m_buffer) { delete [] m_buffer; } delete m_lameInfo; } const char* LameAudioWriter::get_extension() { return ".mp3"; } bool LameAudioWriter::set_format_attribute(const QString& key, const QString& value) { if (key == "method") { if (value == "cbr") { m_method = 0; return true; } else if (value == "abr") { m_method = 1; return true; } else if (value == "vbr-old") { m_method = 2; return true; } else if (value == "vbr-new") { m_method = 3; return true; } } else if (key == "minBitrate") { m_minBitrate = value.toInt(); return true; } else if (key == "maxBitrate") { m_maxBitrate = value.toInt(); return true; } else if (key == "quality") { m_quality = value.toInt(); return true; } return false; } bool LameAudioWriter::open_private() { m_fid = fopen(m_fileName.toUtf8().data(), "w+"); if (!m_fid) { return false; } m_lameInfo->flags = lame_init(); if (m_lameInfo->flags == 0) { PERROR("lame_init failed."); return false; } if (m_channels == 1) { lame_set_mode(m_lameInfo->flags, MONO); } lame_set_num_channels(m_lameInfo->flags, m_channels); lame_set_in_samplerate(m_lameInfo->flags, m_rate); lame_set_out_samplerate(m_lameInfo->flags, m_rate); if(m_method == 0) { // Constant Bitrate lame_set_VBR(m_lameInfo->flags, vbr_off); lame_set_brate(m_lameInfo->flags, m_maxBitrate); } else if (m_method == 1) { // Average Bitrate lame_set_VBR(m_lameInfo->flags, vbr_abr); lame_set_VBR_mean_bitrate_kbps(m_lameInfo->flags, m_maxBitrate); } else if (m_method == 2) { // Variable Bitrate (old) lame_set_VBR(m_lameInfo->flags, vbr_default); lame_set_VBR_min_bitrate_kbps(m_lameInfo->flags, m_minBitrate); lame_set_VBR_max_bitrate_kbps(m_lameInfo->flags, m_maxBitrate); } else if (m_method == 3) { // Variable Bitrate (new) lame_set_VBR(m_lameInfo->flags, vbr_default); lame_set_VBR_min_bitrate_kbps(m_lameInfo->flags, m_minBitrate); lame_set_VBR_max_bitrate_kbps(m_lameInfo->flags, m_maxBitrate); } lame_set_quality(m_lameInfo->flags, m_quality); // // file options // lame_set_copyright(m_lameInfo->flags, false); lame_set_original(m_lameInfo->flags, true); lame_set_strict_ISO(m_lameInfo->flags, false); lame_set_error_protection(m_lameInfo->flags, false); return (lame_init_params(m_lameInfo->flags ) != -1); } nframes_t LameAudioWriter::write_private(void* buffer, nframes_t frameCount) { if (m_bufferSize < frameCount * 1.25 + 7200) { if (m_buffer) { delete [] m_buffer; } m_bufferSize = (long)(frameCount * 1.25 + 7200); m_buffer = new char[m_bufferSize]; } int size; if (m_channels == 1) { size = lame_encode_buffer(m_lameInfo->flags, (short*)buffer, (short*)buffer, frameCount, (unsigned char*)m_buffer, m_bufferSize); } else { size = lame_encode_buffer_interleaved(m_lameInfo->flags, (short*)buffer, frameCount, (unsigned char*)m_buffer, m_bufferSize); } if (size < 0) { PERROR("lame_encode_buffer_interleaved failed."); return 0; } if (size > 0 && fwrite(m_buffer, 1, size, m_fid) != (nframes_t)size) { PERROR("writing mp3 data failed."); return 0; } return frameCount; } bool LameAudioWriter::close_private() { if (m_bufferSize < 7200) { if (m_buffer) { delete [] m_buffer; } m_bufferSize = 7200; m_buffer = new char[m_bufferSize]; } bool success = true; int size = lame_encode_flush(m_lameInfo->flags, (unsigned char*)m_buffer, m_bufferSize); if (size < 0) { PERROR("lame_encode_buffer_flush failed."); success = false; } if (size > 0 && fwrite(m_buffer, 1, size, m_fid) != (nframes_t)size) { PERROR("writing mp3 data failed."); success = false; } else { lame_mp3_tags_fid(m_lameInfo->flags, m_fid); } lame_close(m_lameInfo->flags); m_lameInfo->flags = 0; fclose(m_fid); m_fid = 0; return success; } traverso-0.49.4/src/audiofileio/encode/WPAudioWriter.h000644 001750 001750 00000003113 11163362147 023154 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Ben Levitt This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef WPAUDIOWRITER_H #define WPAUDIOWRITER_H #include "AbstractAudioWriter.h" #include "defines.h" #include "wavpack/wavpack.h" class QString; class WPAudioWriter : public AbstractAudioWriter { public: WPAudioWriter(); ~WPAudioWriter(); bool set_format_attribute(const QString& key, const QString& value); const char* get_extension(); protected: bool open_private(); nframes_t write_private(void* buffer, nframes_t frameCount); bool close_private(); int write_to_file(void *lpBuffer, uint32_t nNumberOfBytesToWrite, uint32_t *lpNumberOfBytesWritten); bool rewrite_first_block(); static int write_block(void *id, void *data, int32_t length); WavpackConfig m_config; WavpackContext* m_wp; FILE* m_file; char* m_firstBlock; int32_t m_firstBlockSize; int m_configFlags; int32_t* m_tmp_buffer; nframes_t m_tmpBufferSize; }; #endif traverso-0.49.4/src/audiofileio/encode/FlacAudioWriter.h000644 001750 001750 00000002347 11163362147 023503 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Ben Levitt This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef FLACAUDIOWRITER_H #define FLACAUDIOWRITER_H #include "AbstractAudioWriter.h" #include "defines.h" class QString; class FlacAudioWriter : public AbstractAudioWriter { public: FlacAudioWriter(); ~FlacAudioWriter(); bool set_format_attribute(const QString& key, const QString& value); const char* get_extension(); protected: bool open_private(); nframes_t write_private(void* buffer, nframes_t frameCount); void cleanup(); bool close_private(); class Private; Private* d; }; #endif traverso-0.49.4/src/audiofileio/encode/VorbisAudioWriter.h000644 001750 001750 00000002437 11163362147 024102 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Ben Levitt This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef VORBISAUDIOWRITER_H #define VORBISAUDIOWRITER_H #include "AbstractAudioWriter.h" #include "defines.h" class QString; class VorbisAudioWriter : public AbstractAudioWriter { public: VorbisAudioWriter(); ~VorbisAudioWriter(); bool set_format_attribute(const QString& key, const QString& value); const char* get_extension(); protected: bool open_private(); bool writeOggHeaders(); nframes_t write_private(void* buffer, nframes_t frameCount); long flushVorbis(); void cleanup(); bool close_private(); class Private; Private* d; }; #endif traverso-0.49.4/src/audiofileio/encode/SFAudioWriter.cpp000644 001750 001750 00000007363 11163362147 023504 0ustar00remonremon000000 000000 /* Copyright (C) 2007 Ben Levitt This file is part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "SFAudioWriter.h" #include "Utils.h" #include // Always put me below _all_ includes, this is needed // in case we run with memory leak detection enabled! #include "Debugger.h" SFAudioWriter::SFAudioWriter() : AbstractAudioWriter() { m_sf = 0; } SFAudioWriter::~SFAudioWriter() { if (m_sf) { close_private(); } } const char* SFAudioWriter::get_extension() { if (m_fileType == SF_FORMAT_WAV) { return ".wav"; } else if (m_fileType == SF_FORMAT_W64) { return ".w64"; } else if (m_fileType == SF_FORMAT_AIFF) { return ".aiff"; } else if (m_fileType == SF_FORMAT_FLAC) { return ".flac"; } return ".raw"; } bool SFAudioWriter::set_format_attribute(const QString& key, const QString& value) { if (key == "filetype") { if (value == "wav") { m_fileType = SF_FORMAT_WAV; return true; } else if (value == "w64") { m_fileType = SF_FORMAT_W64; return true; } else if (value == "aiff") { m_fileType = SF_FORMAT_AIFF; return true; } else if (value == "flac") { m_fileType = SF_FORMAT_FLAC; return true; } } return false; } bool SFAudioWriter::open_private() { char errbuf[256]; memset (&m_sfinfo, 0, sizeof(m_sfinfo)); m_sfinfo.format = get_sf_format(); m_sfinfo.frames = 48000*100; m_sfinfo.samplerate = m_rate; m_sfinfo.channels = m_channels; //m_sfinfo.frames = m_spec->endLocation - m_spec->startLocation + 1; m_file.setFileName(m_fileName); if (!m_file.open(QIODevice::WriteOnly)) { qWarning("SFAudioReader::open_private: Could not create file (%s)", QS_C(m_fileName)); return false; } m_sf = sf_open_fd(m_file.handle(), SFM_WRITE, &m_sfinfo, false); if (m_sf == 0) { sf_error_str (0, errbuf, sizeof (errbuf) - 1); PWARN("Export: cannot open output file \"%s\" (%s)", QS_C(m_fileName), errbuf); return false; } return true; } nframes_t SFAudioWriter::write_private(void* buffer, nframes_t frameCount) { int written = 0; char errbuf[256]; switch (m_sampleWidth) { case 8: written = sf_write_raw (m_sf, (void*) buffer, frameCount * m_channels); break; case 16: written = sf_writef_short (m_sf, (short*) buffer, frameCount); break; case 24: case 32: written = sf_writef_int (m_sf, (int*) buffer, frameCount); break; default: written = sf_writef_float (m_sf, (float*) buffer, frameCount); break; } if ((nframes_t) written != frameCount) { sf_error_str (m_sf, errbuf, sizeof (errbuf) - 1); PERROR("Export: could not write data to output file (%s)\n", errbuf); return -1; } return written; } bool SFAudioWriter::close_private() { bool success = (sf_close(m_sf) == 0); m_sf = 0; return success; } int SFAudioWriter::get_sf_format() { int sfBitDepth; switch (m_sampleWidth) { case 8: sfBitDepth = SF_FORMAT_PCM_S8; break; case 16: sfBitDepth = SF_FORMAT_PCM_16; break; case 24: sfBitDepth = SF_FORMAT_PCM_24; break; case 32: sfBitDepth = SF_FORMAT_PCM_32; break; default: sfBitDepth = SF_FORMAT_FLOAT; break; } return (sfBitDepth | m_fileType); } traverso-0.49.4/resources/000755 001750 001750 00000000000 11427753314 016000 5ustar00remonremon000000 000000 traverso-0.49.4/resources/themes/000755 001750 001750 00000000000 11163362200 017250 5ustar00remonremon000000 000000 traverso-0.49.4/resources/themes/ubuntu/000755 001750 001750 00000000000 11163362200 020572 5ustar00remonremon000000 000000 traverso-0.49.4/resources/themes/ubuntu/traversotheme.xml000644 001750 001750 00000027066 11163362147 024231 0ustar00remonremon000000 000000 traverso-0.49.4/resources/themes/medium-contrast/000755 001750 001750 00000000000 11163362200 022363 5ustar00remonremon000000 000000 traverso-0.49.4/resources/themes/medium-contrast/traversotheme.xml000644 001750 001750 00000027010 11163362147 026007 0ustar00remonremon000000 000000 traverso-0.49.4/resources/themes/default/000755 001750 001750 00000000000 11163362200 020674 5ustar00remonremon000000 000000 traverso-0.49.4/resources/themes/default/traversotheme.xml000644 001750 001750 00000027253 11163362147 024331 0ustar00remonremon000000 000000 traverso-0.49.4/resources/themes/system-palette/000755 001750 001750 00000000000 11163362200 022230 5ustar00remonremon000000 000000 traverso-0.49.4/resources/themes/system-palette/traversotheme.xml000644 001750 001750 00000004546 11163362147 025665 0ustar00remonremon000000 000000 traverso-0.49.4/resources/keymap.xml000644 001750 001750 00000071741 11163362147 020017 0ustar00remonremon000000 000000 traverso-0.49.4/resources/traverso.desktop000644 001750 001750 00000000562 11163362147 021240 0ustar00remonremon000000 000000 [Desktop Entry] Encoding=UTF-8 MimeType=text/plain GenericName=Multitrack Recorder GenericName[de]=Multitrack Recorder GenericName[ru]=Многодорожечная запись и сведение Exec=traverso Icon=traverso Path= Type=Application Terminal=false Name=Traverso X-KDE-StartupNotify=true X-DCOP-ServiceType=Multi Categories=Qt;AudioVideo;Audio;Recorder; traverso-0.49.4/resources/projectconversion/000755 001750 001750 00000000000 11163362200 021537 5ustar00remonremon000000 000000 traverso-0.49.4/resources/projectconversion/2_to_3.html000644 001750 001750 00000001741 11163362147 023527 0ustar00remonremon000000 000000 Project file conversion from version 2 -> 3

Project file conversion from version 2 -> 3

Traverso 0.40.0 - 0.41.x is able to open project files with version 2.
From Traverso >= 0.42.0 it needs to be at version 3.


The conversion of the Project will consist of the following actions:

  • Convert the project.tpf file to use universal sample rate for position and length, as opposed to using a fixed samplerate
  • For performance reasons it was decided to start using interleaved audio files. For each recorded stereo file the 2 mono files will be merged into 1 stereo file.
    NOTE: This can take a long time for large files!
traverso-0.49.4/resources/x-traverso.xml000644 001750 001750 00000001033 11163362147 020626 0ustar00remonremon000000 000000 > Traverso Project gnome-mime-application-x-traverso.png traverso-0.49.4/resources/Info.plist000644 001750 001750 00000001073 11163362147 017746 0ustar00remonremon000000 000000 CFBundleIconFile Traverso.icns CFBundlePackageType APPL CFBundleGetInfoString Created by Qt/QMake CFBundleSignature ???? CFBundleExecutable traverso NOTE Please, do NOT change this file -- It was generated by Qt/QMake. traverso-0.49.4/resources/images/000755 001750 001750 00000000000 11163362200 017230 5ustar00remonremon000000 000000 traverso-0.49.4/resources/images/windowicon.xpm000644 001750 001750 00000004106 11163362147 022151 0ustar00remonremon000000 000000 PNG  IHDR'1Y,sBIT|dtEXtSoftwareSodipodiIDATX{l?$u2vI);:A&$&jR#ctHiG!"NM}ulN1DGەF*8vُ,$?=ҕϽ>{ι@A hxM%D~ո+5"o= 0' |)pYs4}C+I`d "?_K'Y`h3 9%0q)y#LssҢ1*ӜtD`d{fI:g ?CW<fP`R(pV&M)--#ɠ7 X 6n৾22N(hqp֟W b\.pg ,IЏ4!voCNljBGǺqD0 dRZſa`SB&0 xcYn.8u >.^[ϔ@=K8s欂P\$j-KӦAa!xp:ܸ~z{]vhkKcBJvHE|7G:JnS]Ș1"ii"N%'#b6Œ߆ęĉ`| 8-j#"D*]l>5Ϣ-J?1ncZOafbx(j.I>u_//n^UUva#nWWWO+--d/*[-`N;+"wlό2~5mXUUu@)p8%XDv1EH6Ο֯W8Z-+ VlZk0/i5rv ^{lWIWDN |mm5~9snٲ-ZWo"/HXѲm@X,"3f47'pw \n{6 ({lLWl_ԴӑHd-EƎMf>GRnE)/))xW NL[d%3 yܹsDD xzdJ.nGA tu-ܹΝS}B6df;+GItnxS6x<󭭭l6ޜJ)h^Ӂl 8Hl tw]xI>pZ1M}ԩSY,!??d W\ƁaI@$7FH$6`+l(}d úިDR47*dffnp:o6ljrgjpp ¡PXYYY{8f-\SK:}.˽>p1UkPJ=v?t5ӹ!++ M/do$~xɴL29@j~S tb00l}H$yWUWW`0^}@`U-`6G*r`pݘ[*j50HQʕ+h|yn[K^(݀4" QPPl0X&u~p$^J}i$r@F Xǟ~pt:Q79΍hG}lϺ\l߾.Щnhth2v@ I~wԖtŋj$pq9_ŞHOOߐl24V/[,*.//\zx8Aų[q vZPJ=x.߿t:UJ &qLa7#m}H`4v^~R\Z0mv8|>ߦ͚\2jGlp&Yk֬q+V'vu!4GDh,;n]v4xz 31$;jy1 IENDB`traverso-0.49.4/resources/images/icons/000755 001750 001750 00000000000 11163362231 020347 5ustar00remonremon000000 000000 traverso-0.49.4/resources/images/icons/media-seek-backward.svgz000644 001750 001750 00000003707 11163362147 025057 0ustar00remonremon000000 000000 ~uFmedia-seek-backward.svgzYm6_A/51cz^uRV;V,8 -M_߱0$loRv3ysnY"ay\$i޿p۪d'QVbfn?LKIXT.oUr)z8G"*ʅ3&Y=.>, `j3(ޔKbGdb%rY96ߊTؔA}%dƒHT\FI^h R<#9Lj Omtp5:B:wD&-5 i8h%uʩz6M2r]t&3t`F.լZmI2{E{QϷ 3!gYDiX !eTŮkC덼;)48x$CB<0{Yn Wp?zE-\[FIeߪ2t[TBm*QSQ!P T}|5W,Kc ~))CyFG9=0 g"oh;p3.aZ%z6ҊZ%8p&qF u*SrS畐(\E 1NHQY^݇wGAC 1 72TY$K_Eڣ'yr? n {٥otϣ35݈cenݸ>P \7Fkz1e:,o>1j.UW=2$js SW; 0>WW@0( @૫ p`n}r6@9 ) >,/:gAi=zൺz\<(M{ѭ/kӭOEZ>ZL_7/Hn3Y7FJu)$w1^Yz'VtG9 \e?9U!ys }bD& \vE jF#gWR7x>6?͎ 2QUwe)`¬[].s~8ºq4ztҶz~#AD4<{ưUpǾ >c"LwF(zRx?Vq:Oɥ:NMS5GQc:ZTu;22ebuXǣsf&L>j&MDW3_!j=YecQ/ZFI{Q@)Y9)Y! fl9ޝ ߔg3[jhsތ3V-->h6 = ڦ9eRccŸMa'X*,uHF&jKB'OwomO.2U DLcrI'#fb\@;pόTZHVKAI3c˟؅$$fr/0E_úHsE2+ԁ[rxJB_q̈́5FnY k3˪f3&A 裏{:~=ܹRd^'U9Aܢ Yu"J:J#/$r= N- S;t<`GuQr3RZځ]zD8Xh.ç5b^o_ ١y hqIi"traverso-0.49.4/resources/images/icons/edit-undo.png000644 001750 001750 00000013074 11163362147 022760 0ustar00remonremon000000 000000 PNG  IHDR@@iqsBIT|d pHYsbb8ztEXtSoftwarewww.inkscape.org<IDATx՛y\u{===+H)nʡ[-YI,ٌ 9cH'E,KGȶt,YbD%XH [nxݳ9sϹS޼ݯnݪW-f9*@sbɼ]\yHe"uV7gS>oyزƐe=վ5#@z.: ݴVoZhQGQ?.#qQ?Q [l<ŧE='dpj!?\>}3#OZ Lڶj\nxWJE}t]@\=SD0o<#OFɛ#L?Kcr:a# _ @znxU_M;0V}ҿ:ʵ~\W f`@~"D@[e>; a~Ο[팝 GEJ4|C˯yc|Z[(V}+]w{^ q|q IH֡qwmD:0>v=\+QTeժ_{p ;3++i?ơ> ]xϥo;p`M>ǬwwҚ3SAU?/cSa劷S[q6̜Gw9{9>8|Kq4.0>_ n~xǃWW,,ߦo< ѼNHԳᆭ7-OC_^ ]7)f.G"Lw;/\ܧ>KzepŅXw!uD-c^sIf}>_ďq Ddq 2580r^` ^v !ڲk;8ƎB!p_oojrP1 O{|]V D{lrX_S !,@x)mOR_f1V~u̪_O50m~$@ڬSƷGV:+sj^$>Y([gNǮǹ&L@2sgbUG |s "4B"ÕjhWc=(rh(o}bޗ|vc1 2e̵ͽ5}mnHyyң?ir՗Q^ҢhԂx;=Xwk~SN~.P ,dqzݡIGq&Nzb?Xo!>tR9)=Dzj\+ \r8tOoAdW71*k{F%tyOia.5䋻h{̐4x4 T{M?؂̌|>GH3-wOjN?ru TErq'0qi&v$aH`, ].PqUq \nJ=X>1Dٱs-+r礱gL1`9 NY`r6#/@dI{.1 +S)s# XRlYs񲜕='/>z=y"7j\}icmҪˋCAf72aYĐވ}G4 d1U$56>kڳnny.{!=6O]O7̗IO[)(L"lsA]3C'',Z(۞Ȳ-Ttϒ~wo >jOEfqb,tt8p`RDܰ!7/͈tn}Utt^\i1˗.}=]n_aD+ AD ȳGv d'"N(Yf8^y;_8hRcM_]) MLyjokﱸOuokvokYz)}Ó'B"%A"xxWFDabwׅ˻ϟ[0[i}^7{kIgaj'&y醵u[l,ckB"'!~F-~b q qaDFEjjw?~n]݇huFnټ>e`9ܝ#+{+3jdy4bVnX[94!L" $2 T[uIwPOW:ƭO홬6V[ӐLɱdCn>2G+/^$ @,$K< Efh9 ܿaˆ)zk2qd烽::*c܍mm4_|a!JļO̼{ۼn XۦO?Y(YGa#(0n>L4Oe>OtN245 Y_V3oYQ>08W ^Fܽ)wa "vcFӷ)=;X?Ɖܧo=,{ 7㐴bqv 8@{F\5#R?C[cy 0aG*+sIFYnHT?3#1:P'LZu ~]g]7Fo%jޚ{aG|ZEg HHHȤ/.w/G#j u8!6T Fнuz\ʒW{f/|fp92tÑ/׮; :tG>,z^x_,N}>P,i TF Jp:Y9%v .]Fy5u0Y65hyYM{tSy3L$x׿q__$/i1U<\b{GY+ l*o$`qPBY_xYEP X4[ʖٙ9UqUr6,D~|d2epf憆 r%号nTܓ^BkM.Y5dD屄@O(޿.hfɉWqxI "NQ1'*4^9uq$ mcscH87޴H\9O8Os!ϱt9o@ɢ28*!*kpƹG]N3 DDǚTJΎ,O_߾[Rn3A!J4HI˳yā'ł#ui ̰`8Dt%N1=$onK*)qd &AKA/Zd(y5N(JKdiɅ* * Ѵ]^6'Pk?ZNhU"`p~P1LX"?eIyKtVjb" A1zF[QS4jp<$ukbrLmb[eJ2twfʳ|77(^jRH#T;$&jKT[;ɡ|՚ `ሊZ쒚rsq9wJ0łIJ()5'.vjx"-ekϨlېL→~& )D ~耠@AT\.>/#O%Ld}_NNן:;taD⸮ ,4͜ t"NRU\Tr|zJIRD//חgI.qggfU3"l=)f_$YQHGkj_SQuncZ{:ujؿSc &"ox:::f677ϨF[yި8mGO>'xb#GQwq w޵W$g~  c T4~*;eJoppMwws>. C%K׎+&՝UںUdh/WP8*(l*$2i̞뻺я~˧~z^[炓NeKsaN18q;]@H H`T5"3g;[lsҥ1Ɣޱ]OްhѢOuuY],""ZZ+E'EvH(J$X Q|&TRAQb'@_]7ng>'1|S.ҟLzȳ Z[r*"Ԣ Sq T,_ˀ\c$&~Z|"XSnXZ#ƀyDZ{xroBg#W=ǟ#`%p>7m[o}'?ɢ'|/LʿNu5Be+nj\w}cޘ<3 F/o~% ?NqٲgWXqڎ ^΋N;Nzz*=ߏ)0G(#;zk(+6_&`b2 (YDoTSdý t:|>Oq 4RC77mъ*'i8\lo%;t 7AةywhzL` ,dBNꫯ7c\4 A*V\[mԝE 8SGB3LFfx4洵dr8D@W#M$*.xC#H],AK wϟM* hLJgly3KD$R'V5x^kJ)0}-Q <(w5Rw(u$ !_~c9L:eTrmC;ST]CC̹INݴqJ!3@a4*р}&U)Ad1 (P͘[NÃ4L682N6¾x( }tF@% C^m+؈{.sLssxS_k׿Ӯ:ŋ__?_< jnA:boKha$/C4DJxŸ}H.]: `CDڋ`%=<)c\ߨEf:LͿF6ڽwUW]o~o Mt<|ݪT|W|\(l4F{hbv/YO/?@CCC[i` R;RSOpx4qcpF1pe"hHj"/wժUW-͚5#<̊¤) Fc10ڂј\\zD8eQ$VGqjFkp4:F%+Gȅ,mC{m?x{pHݤIv)iPHMR28Aaȸ.&) tijjj; X,Zx.v%#Ӆ^:u b}KhCZH2Yȋ'RL&s3" [IE*A_gpPNwpZd\ppD!J8c1%/A|r45&A5T6p]BƄ#H_p<$2tDLPUv\'x/Y~ezx&x~ėYF”J%(r\ůjCqwp20q ビNjAwbH:>}ll6o޼YH:wJx& :XèɃWxc@ОB 551<<Ç)uwN(>P `FsPrHg;&k/~74:]h7vN .:y?XJALp!>@o Fa_'vO/mrPQAB#\]SxF_Ї,AfmHEϯ؍e+j(h "7]++@?6:l/y ˗/ӱ%L'NovUlSr0%_:hϥХɥf܎5"v]܁om&~ x*( w}Xt ([yB7мx1:;|G<"d<#~Ocz[X-;8Z3J@hG0b (' BBhND Gw/H,"B S4q !}[r:v0v`/ reϞuƔ} ظqʆ>GlB1FSBN߮mՂ*t' T,k"I.Dq8JbA\A^ahGf .(".ڨE%X 3GѽBSw2YEk׮=jXO<yΟ_,Ba5g:`E#X(7;Й$Vx㦺Ͼ,Tfڛ Rf 2C*SLR 幾u~5k<7\x[/RPB)1 ) 5H_J/l.ױm]NxV[SNj@T_ˁ@eT~YXт`ZQbP0$k_`s/_i /7p?i(˪,mePW3AY~P*v %A AxA45`+ƶwXGydo^.W,g?{ʼn#ϭ _8#(JAW.Pc siWrߍ_j?HiQj2Pf֘B ˜}6o~M@uBk_\wcr, z߹˿pb_&~@ ``_[l|> fBt N0e:ͱ)?{jfh…o_swtq%J{>eh3f*@_|ޯ.z`F4t{ nSC=~/Eۇ_|e]oK/?@3&ϛ7︖-Zk=000044t`{zza + DC1mW=Q͓r5}fjMռc1zBjm㏅q?( ~,؟wq_Ed<`XmnZjώ׏4;:|?uq5e6U|7A ]'5oWۏVXbgIENDB`traverso-0.49.4/resources/images/icons/22x22/000755 001750 001750 00000000000 11163362200 021122 5ustar00remonremon000000 000000 traverso-0.49.4/resources/images/icons/22x22/history.png000755 001750 001750 00000003140 11163362147 023344 0ustar00remonremon000000 000000 PNG  IHDRĴl; pHYs  gAMA|Q cHRMz%u0`:o_FIDATxb?-@11#ÿ eeAyS s߿w22n@CCx//d'G 8|0Ȁ`addd`bu[6mѣ?|l@XII)I+ b7~..^f_?3A7G3Cc#g/olnm=qx/,lkk;q<flfM?W2˲FY' Ĵ!" ( MS06! ?ï?RaZRṡ>7t8޼~*001|Qgxtg/_epcb{woOkWgSg3D1̼a: % L<-@st} Ň < VgPUSf1cf6@1y澮-M\WЀO0:0.sc e.^dhWUdfXv WΘ93 K{y{U8Đ ",𓙕P~f@Ág\_?Ȱ`JcC?~MKK|ngiaaaʊ9VVOf`fafff`e 3$,/~2|a f03at󦦦gϟ@ŦKOO?f߿ ɓ888>u'[Xi܇@8iUuu@99yWI m޼}̅yxy>zw_~}?.@DTLLL|@3 PqkH: hVZKIENDB`traverso-0.49.4/resources/images/icons/22x22/warning.png000755 001750 001750 00000007213 11163362147 023315 0ustar00remonremon000000 000000 PNG  IHDRĴl; pHYs   MiCCPPhotoshop ICC profilexڝSwX>eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/%ҟ3gAMA|Q cHRMz%u0`:o_FIDATxoLUus]`0*Ԉ(PIڤe3jM[=I-l9ʱ6!2XJ bC6{AپϾ׃+q)$rscQ^Hx.9""JSvWvzdYasq[##iGϺ;_콿cZ_{$?]2ܬJy{[rvL!TQcR+ ?_|vc}ycW0wiýU,sMpyeoxkЏiB,_~ɭeԶ#O΅0*)CòMXScN~y %ݏȯ^~wgE%:rHvI +b]=3vޓ%~Emiy!}ęnQդla,Nw3&6$ ǚ;_ش ,?ω!7/_rv7d93qL"$0' Gf,CC-58ESY;[h6o3Nr!]m |+1c _ <`#-m;\xb[<(ȤҀ4A ZxT,EAdA@]=|v(e 2(x3ӄ{9ׅ"Gp9(N1,1E<>F2:|)ukjw\^@E(-4;9L<)7BIn ]&_"0!>Gu1 $k/o& ,)[<F?,iC̄y@s _8A4;@69C  > ܀@ 4T@hIp$yBP R&I5m"?t!uIENDB`traverso-0.49.4/resources/images/icons/22x22/info.png000755 001750 001750 00000003164 11163362147 022604 0ustar00remonremon000000 000000 PNG  IHDRĴl; pHYs  gAMA|Q cHRMz%u0`:o_FIDATxb?-@1$?@hbn*?o_? /0{7 *gb`ጕPͱ33dВfae |Պr12(J ~*e ?`&/wU1f?11 R, >aXx-/;P?Ͽ@?ç9dn_,!*Fr(\XBdb&&&F+A^;(0 p0R?c߿~12^zۍQZ#()PХ, t-3#` /#ä 782f2 @ (]Y Xع02&#.V`] bPP1!  @:(Aӗ_ ?.@,@=IQFQ~&^n&NVf6Ff_@3tF_L,`00|/^w e  b /=Xk&a D\Vv.\t@U Px\=ŵ/"l 4 04fTNv!BZtV)HN۴k<8WrخtD+'=}Gn~Ngca`gg[ ,.Abfd`eafabaOow0v_~vEVf6.nVf`ز `f Ͽ007ȵ@@`c@@F`g716H!3'0>74|[?10r2Hs!BPR&5vVF.`qfM/'~== @woU4.3 UfPPaWcb߀.,pS&bK3D>_/Bl |@AA" L* L(n`x=|25h+D~Ȗo>s,럟@oF&0t7`/˷2ѥ_l2`#jC։O3(UXV\QERRBI \n|7>G^{@G6 \L*̜RZ2 l|L7?><}@w b$n4020ڀ  ~{nIENDB`traverso-0.49.4/resources/images/icons/22x22/critical.png000755 001750 001750 00000002700 11163362147 023436 0ustar00remonremon000000 000000 PNG  IHDRĴl; pHYs  gAMA|Q cHRMz%u0`:o_F6IDATxb Ė \U XT/00d 00``I8@1L@Cw30/)?#XJb ef`]p迲/ arsd/^e,, t6600v@ G?}˗<@ljd[ϐ! SdL0E,4ԥ*$Ȩ,@€O dp9ƀR`N$K~[/[;<һI@s;-D^``PTqS`c`84Tx#úQQGZ~~7o^f`hnfwW722 4 QhmW 7h\ 10_j;0Jy %$@>q}NCXX!${ 2zC+y  Fxa*zUF@ky!O۷._f8 B6 c&a;x>}`@lPt>pEw2!/B`0-C7 %'`D뗨;0z/H<{ mW?Lz>63 0Z=$$4!.f* (́XL^%Q W f,VPXoogOPpqAR Kdd\=~G ƈnZn6d0(h11`,A*-g!75tdeAA-.ԩ켼L RR  'K`0y. @7WW_kj v @aaH.-[Z,_}ʕ^ ?~@Ld?@@@1G+A޿:k;5k?~={,#>00|4j~(@1ߔܯb `1mS^"c?~~xGp*'@ ʉ@젡|ѣVO r1(I0<[ך5şr(/栌t/@172(( g۶}>=RGǾ9>W''K߿\z)@?l hVֲ|S}"<2a/;;ƎL PR͔e`e 000A @`IENDB`traverso-0.49.4/resources/images/icons/22x22/README000644 001750 001750 00000001466 11163362147 022023 0ustar00remonremon000000 000000 /* These icons are part of the Crystal Icons package made for KDE and Copyright (C) 2005 by Everaldo Coelho. These icons are used in Traverso. Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */traverso-0.49.4/resources/images/icons/22x22/songview.png000755 001750 001750 00000006416 11163362147 023515 0ustar00remonremon000000 000000 PNG  IHDRw= pHYs   MiCCPPhotoshop ICC profilexڝSwX>eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/%ҟ3gAMA|Q cHRMz%u0`:o_F+IDATxڴVkSAGhT(DG/CX) zE.KA BBɡ'{i)x1}ژeK^_LH}{3;.Yk1NQX_ _D&-ןhLuK' Gum6SO)vkkϰ!p {yYF `eJ<1-εg 7qJD[>G7o]@V!4POH k-|eq4&061>K=Ω\..00  UR " "CD9Pe{{ә?//}=A0lvan*fH+@`(AįG$$^,y'4yV"P'(B"Kji\AZw}(h@#_OA`nm~kxi4Fjwd%B]g4WcgwݐIENDB`traverso-0.49.4/resources/images/icons/22x22/stop.png000755 001750 001750 00000002724 11163362147 022637 0ustar00remonremon000000 000000 PNG  IHDRĴl; pHYs  gAMA|Q cHRMz%u0`:o_FJIDATxb?6hTEQ`doѿ+ ~b&(ȨTJjnVvvP0330|P5i(#cߣ@.fdYV[AAo>b`cc`vzA30C CC繻/䭪d`` }\\ ?2kis`v-0ibbdddFUxKK9f`{l b TSÿ!(hSC`bc`[ŵ<,ח̌BB `?x`b #  /ut$%=.\ba`mLL,cpvf`x7H(@bٝ;20HJCϟ ob`eafg>s]ba`f`ee`]@ww>>nP,f&"QQ߽cc(0  bz@a4O2X?0hXED ~6vP &D(r -c 4av>A @u 3f@%+##'@+Š R G@1 $ ( =@:h@Pcc~àp T-"4$Y녅~`z?َsk7 hP'$ %6O30ZZK FH#d A"$׾@LXX!/*a({ .10:3<@~3ӳ_>? A`roD#( @2 : Ӻu @A wqqG_09@1ǏX bܺ!bP`[8]{|9C?@1f`LM}saKCfo߆x eA 1} (`zgb {4޽ou Yg#,a`X`i 1T^]6X#@W27`d2̋Ob 2 PMvFF>%LL., l4И Ïŋ|z X,b Ðc H ( b`ds@ P\M WrqZZ?FK?(1L? f|AC`ITU??Xg@KG*dwWڲIENDB`traverso-0.49.4/resources/images/icons/22x22/traverso.png000644 001750 001750 00000001755 11163362147 023517 0ustar00remonremon000000 000000 PNG  IHDRĴl;bKGD pHYs  tIME$..zIDAT8˭oEn]g&ı;.&$jhJ8 !* n\JH*8@Ui66Ʊ޵!NHi6Oi4ޛ7y |.  PQ ) п?$0J ,/  pQ਀4EU 4b"ӷgJM *pZC?3׮K>+B:ܸl!gԷr3'#SSB(4a7Γ;|D 30pԁfs*jFZՕꝍA ~S[3dm/(ڑ )f2LZ zVJUren j8:)=-0Xebqq~G) wv_yӢ;d;'D >')ض =2:z>Hmll`sZ Ͽ#\ѾR Jeq !aÍF6Mig^<0 ,nT,"YqY7͓fdY d"M۶m5E Z |JE"54JRy-vgxW2<\*9} \ 4MRCaR{qVz}j˚4JF|qarw{gkf^wJRnZ}ll 4Muuuu=z̶bh~:{R$D,K:㻮1`Y᧖'yCxPVejt~3l/cmFV3PIENDB`traverso-0.49.4/resources/images/icons/22x22/projects.png000755 001750 001750 00000002610 11163362147 023475 0ustar00remonremon000000 000000 PNG  IHDRĴl; pHYs  gAMA|Q cHRMz%u0`:o_FIDATxbdNa˜:L,gǯ/^۶mێׯ_T7˳gy.P'#o Oo30|< 6 rte_?uקO7o~>}̙37e&Vۥ0YL i_|߻U7-M@L0s9$5T~3u0 6 `sJJi(ʊ4_ L| 6@@X%dP~O 21˩1‚alʊ(+Hr#+:Å X8@^^łã ڲ ̬Ce . e9D0..&y )!`00a`ᝰå{P\;o? q;D >0 DV`Dgb?÷_ Of'0F [BA]R{/2d`|@a?7?/P(_|/<1-$"!&t޿ o>}g`eed`Z'0#e` 47.`N@ի7  *fgPh8ZFk AaPf L% e$@L j", 9+80@aAgn߀q !3޼ &kI s s J \ hN&3G3BRׯ߀ {/m' >f`.G Ofu0-9 7Ùg>E7Ï|,9~r>H=@x~桛 g`11p32p2bxAVYAT a8?ÿ_8>c+5 L, svzRWWW]IoFfb6ZRl\\72KҗP/ÞGΠ"@r(0ALM*Ô}vݳ6DžU@2EH ۗ+; iP  y;-ϑo*Ð@̔ L~W%KcwW矴v^ blŷĜf`0v4_ IENDB`traverso-0.49.4/resources/images/icons/media-skip-forward.png000644 001750 001750 00000010736 11163362147 024557 0ustar00remonremon000000 000000 PNG  IHDR@@iqsBIT|d pHYsu85tEXtSoftwarewww.inkscape.org<[IDATx[{lTպ<鴶l@AÒ́xE0AcH pDpO]_Wh5 yHaNY۵׬sJV{}o3"!3# ;5k/\MD0#Ş?J ./?alٲ %0 V||Z c.k?|{{ڵ?bݷ ͛- @-m{Hx<\q:XK/tK6l+|r9׵;pN<^u0eÆ {lܸq4m0CHeY, \9)KHuiQ4({jn;ׯo$.rj&,B6i0MaшD"BD"D"~$Iq\t eAu0it]w@/c챍7~sXnbɄgYL&@ 1c`ܸq5jUQ5jsE??R|>D@s6mn:/`PttH5j1q"|p4MT]p| 8~?~K2{1zӦM[`ڵ^"_ t;i"" J0 L6 Ǐa|ue7ţ(\,; "0 ce˖ h!d+x;L)S0yd~aB!GDEUb0 ~SNE}}=81m; x^ڕ+)k֬Y `[G4R,BSSƍχH$2*_.χʅvƲ,idYi:u {쁦iZpȏZ[[4k֬i|2da`ܹA(B4E i..8EIFe2\|vB6E0,10U^z40s`?(Ν2:b }EܯE)%A4X }_P(&2Ʀ+qض y?/rTTT H)%21AF{1رd@c#JUhHix1l0TVVe}-R ԢXT*T*K.# :q9[n+>#^XrV qQ3gjjj\bX tp*@rИ# `ԨQxGrʁr+Vpqm/B>iP[[P(jٞ\z ;vlQ}Y*@~ضz\rP  X|AD>χ|>TWW d2|ꫯfRin)K, 󡱱>LlVN6-_(LD*W' =Ƈ~P!# TџsȋAFQ__@ D%޽uuu={6M.+Wd`O(ʕ+ Àihhh~~WD_" %`ٲeˑW&C=0FuK:xq[ڵk?/… #DqYd\m0=Omϳm#s?c̘1|(++SVg(M!;wD/d(8\A*a O<"7 q"\<7M֭[qȑ&^d<zx]w9krb1ҥKCD4[:p"<a۶mؾ};MI .$K. iD4rGu=cQěʱ:7c ɓ'҂ɓ'1%ZUPHiڶgض]'rƎt:D"!U"K( e!;3m8}5* myh*t+b8СCزe  &d|r&K*feYT%JhJYee]qmۆ64go.򵗗ۛH Kb{Auu5 ] "yZ+s1Ç ,ĉ] 2Lƥr +**\ iT*d2@ 5J)wo.>_̵k*MFQYY餬a8GDDzmDZ`$ $IW-0 Rk㣼\W `&##JbbF:^2D*¯}>:KU)f RRѨa!a\q\~SNŢE\Rgޥ 0qYm22}}}>@ yJ~^^^~w_>\BBG] FD?0קV'nmy*ӱdɒ#^uWO(uڶx<^4\*PI ܺ x^DQ}Zi3cg4"X~~;w&LeYhlQ$bSSV\A[\g*5Zg"N# ɞ#MD{#6MpI'7,ȷ8/KcMM Z[[y!%,ޏ?WqZGjtk]CӮT:9?ڬYbŊ"\^LX'N]oU]@DE6̙30aLt%;\ExzSQQ^xaH^lp rɉ' dis<{לxrjpQ-0|Ξ=۷o%8џC @0tx6ݻ .<Ϳ Q;=(+WСChllD&iCEaǃp8%K7;^}Uk \`k'"`Z1uäInQM6e<䓈D" d(r)."JO?uq_Xù<,sM"_~캊U(y<BR np}"i }}}vѺvXnh@+\a`߾}1b&MB{DjD ET᭨2ߖ;z( /[ A'h"=@acOբ% ?bƐH$ nYɋV!Y[c7x}}}. S*B-\iߝ Xx1ƌj]Sb?.yb/뾼uNqEbq |hiiY|/O3ưpBL8ѩ Plyqѣرc#"?ѱ MҢ8Μ93f@(r*@(}g>޽{]㪦鎎 3V#y*.z<|8x 0m4rTL TGYzOR;1vX=(}C PZZZ\"wDi0MÇܹs1~x⊼<'&/r]c;::n]^͋cs(GgbDp=`ĉNͼ0a&q㏈bڀ^DeC_iiiiw"y#FMM "***FDC,C,C<G<Ǖ+Wp)AV/:::n+3l#`F񢯗 (~?va<1W"jRuZR&tvvk_Gss3#EMDT?Wr_iH4d#u'lD: RrA=<c cowvv{:D'<?)c, 3"byƘyاt>y[_?,JIENDB`traverso-0.49.4/resources/images/icons/document-import.png000644 001750 001750 00000005715 11163362147 024221 0ustar00remonremon000000 000000 PNG  IHDR@@iqsBIT|d pHYsu85tEXtSoftwarewww.inkscape.org< JIDATx՛_pT?M6lK$Ƅ0NQԑvةNӱNߴm7(>ɇV,$!$!0blؽOv{7wss)%Xh-_" \ظuEeߊ9¶>ʠZTU= "ҷӤS@ϟ=ssQ[}c? p@ /À.WH߸pM:d9Z/|u!a|{{E7o2z2Dõ^5, qV_(Bi ڵZ/\\PWVTsNO_Hc=ƾR244|5eC:o'(yY vm>x Z[[ٺe v±mXL+XZD@" `}g"䩧5N~lbxxL:]" @?RJ~iڊ>:::0MatM DX/2̈,UUH$}ؼy3ap/0 Ee_>U˺fgϊ_ܹdۋHYdj?P˹Jه%Hpe|@M1cgODT*ŵ@/sx]{~EU9}4ܺ:$VSCOOx"`gbWJUYkk׮cǎd&躎mY`7(}*~U2F{GeqĉlP28۷oGn0X2!/?BXBSQSJ)-ˊ$UUEQTU-Jm[gnsG4mxԃ)`QIQba}e4W&&&]BPSSCmmm{+_ȁWSs)^˥ٔ- s˝!%RєUU}:/rVCU&Ȁr>":XJT C !P.xꃞ䚿Ľ/ty x ˋƕj;nat=+ŀ3W^y%O}7)JS顽$J [~CVUu[[ iQ'J]Te4M{0!&''Yv-Ȯ!g2hll$GzTWȭ:`t658XG}4dD1::UU+Yxǩ[a ( uuuw7êtԩSض޽{ijj eȲ,4d2Iccc̗AbUS'Orm:;; 8Ν#NL&ٶm[%\nܸASS 9 TvQ2F'P.E8.^$q^ORJΟ?ϭ[X8-.콡/rСC_CCCܸqzzQPD"q |\xi}5Ɵ V*kJ48NQm4u0%NdlݺGGG}Lmbb .PSSݻ]^^tP{{;BQ8|<ضM|2<)[mض8Xiz@Qb5A+*~"e}6!8s ǏGUUb{)U`]fi`Z{:7_sUJ,K[m#322(tuuuPw5M#д ık0>1ɡCQ)Qݷi lܸM6E:-7{3 Rd2 SDz ֳaF hgg)"ui?eHg2hN2r#y<܅cJ57뺁h i/'9֛ǎ))]49cJinhDn=?֛&Vؼ+#2nwuZ@~ ,Lm6oڔW'׎;~e`cݟZ[[s}0x(njl\eY/ŷs~χVD+{_3*o̯I`l xA"pWNtܸѼ+W'R?{7<;AK])θD'rgy}S-D,sbXBTQ)/WH G(Ug~|]?%C>P|q&Oe.*E@\AOd@>-`en9 B!0oq؛O^*!e[JYtL,d.(oBK?+x sPrۭ|[ @J!ҍj /8 %UXu u;Ƶec@oqìOAyAZn__z%`1]IENDB`traverso-0.49.4/resources/images/icons/document-open.svgz000644 001750 001750 00000007342 11163362147 024053 0ustar00remonremon000000 000000 [[s#~ϯ_D77SkrRI%vȡĘ"Yh%קfgVE%CC}0|z%V!9dv\c7f1[o7f;w?`fyܯO.|{绋^JPlדwG\a0b18,wwu[':6a&>Oٕg~^L?9%ܫ 9ƇM>{oԆۆr}Úbbo]:~= Q䑙dϟ:R,EmI;6찛ͳäf,0]7LMZ|"]-i")ƮJN8ymrn܅0owFߟ1^8fjєwwCm y2Cg~d>/W5ionر3n~Lq,-fۥq+d`݋1P/wfW;vSS->: qG`wik[w &WOAp0yZ\(Lz0Q'/{Fֻ_mqVa;G1ÎWw1ۿs(ejum ֵgI)?y>j_d'Qp1߮oL]aqU2~)\BJf{bp9[7Ш|WWۇ?o A1ʮ`$--)&ϺnoN =C#ռﶫM^7&S<$/*yf?g˨BEaV#]BU(J!IiаD>u_/Uvn~9dϸ~>jW߂R)'HFc'PY'%ܻRviMA0q=X%P8P].Ydw #8-J-rC%B{IU璪 K^Ruaa斺TR0T{Z.[nIfvl3}ƈNA-J0@ƟL2!-hML‰ZU7lw g4O}JJQ?sO2C|`𙎿_xXc[S&V Ql6F6[*/v:j(PlZ+khB9 ј)9 T!#+M%w$;6u}~yfdz,¬]+U:;fi&̮ _G .$G SÅ_~VL5X}  w"m_߲v* D+[.?DZV6FG+)ϟ+769McOd{}ktz}UHV }rWo3޿Jכl9 |!?oCH Q^VzE8 pPySu>6'RyZ?!Pl`my-ؙjßιON.{~pՕRZ!Õ4cUy;S3`4jkzP` iQ,Mr$>!÷UQHC=t~Xf`jg;'[@үxPgJ9}`Qя#$#B4# $glB_QpƸYͫ~i= H`ZGLYa{Ϻ1+ŵMxR@N$'aF(*pS8&46#$* \_[ӨFO֛*#_7ZU)RX9$[lI_(ɱM4yLȳbEa]Hɭ ”}wp0c4N Jt:ccSqljوM)#gpy&:^G-knSF$U6WQeSxҸ=љי:z q:o j K)0bK`L?jHe% { BaCbVRXLEbz*Iʹ]d1M 0y $NkV0&qI,VB:Up0YY`#M `M \}yF*%c]oSA#ޗs04@%EEwYbP?e~'U8\}^,iR8%X̌Col6v#',)ɸP5FiD Z$'b .(a!p ,NJ(26`z N @i\dsTHa9K (2yi#)-(TѲq8$ɴN6Hl~{P]̻^Q$.VoOaaU\r"SDN=[MYxwjE<ȃ05mд F8eFvf@&TԴARj݆r :c1U@Tۙx|ZVecU,֛:@xiMq@8s}w䫚z$b(a=&hћRKpZ ;)yZ ^WFL1dkRy<;(sX Wp=jdH9{rT^3P p;byH@'b&3fCfJ9E e<$$KCH|H+fha]!|}eJ̔֫³Ut(L*sKKKFOW'"0;!XL U.5U>,q % 6e)ˆ%#f0hAƤ3$DTD2YUÿs>-Ϗ/NN_=_ oO.Η/:8jyt<{wzz~}|t뛛˧޽W ?Aӓgoq'LJ˳!mqU~͛QW'/͘w2R!!0^tq(#pQOߟ L|Ԙ\F` ۫Ar ˛ÿ/'7'iwzY^_/xzrzH7ɳ???LsYХ]?o'G??Y>>;zq<<:f30Qr|z?]|{oA;$ //n^-}xu} 篶rH[~Xp:jOА_ˣ::9Ϊ 2M2Ur{lpgWOO#t1͇&srHJvڶ*&42?Q\![gv% =~_lӿ]-F}w.wȓy2zIghXK&K׆KP,ҋ_Qswd׮,5mp,,m繝],6"ז'p,tƹ}q.K'/_|5mp,.]>P+8]~ۖ_̒|YkK0ٻHK /ZY4>XmKYR\t5|8Pw9%knM>Sm`MZ޿kyw gl5n.<}}6C9ݽl=~?X΀aJ &A_6tثg`V4}ZYӛa6zu}9l``::vL<stsuQhÿ頀8o<huo ^SRFۧ"%Y'!eD13,qІvCC`+}] 4l_ RJ$`RX(% :~ƝLEK944VSD:91lؖAe`\ o%GgYwi8Z6roGoO:ݧ'l]/˟NnV{JDˎɤo)cD^ 81'W){f@,回~TRjio)8u+3JeԀB!!;ʽnkv muo:%{^3%FE[(Qx~ p#'.O-]mz\Cu>s `2q[^J;d М!PЗo0,eAO>Y"LthoJ%\BEoVRӤ_~8Z$:&I ]M2"1qz0`~'I&,q/k*WPبs M;Z.ĸZ+,eB83- ;[jY" :#(2%SImck20Bqf҇Py8E)Lwh\ ޳I.`A,bGKZ .)&:d %Oo݆y[u;Ivk܀C-s H-{ZȈE?[(q'%B})~c^kXl]گƳí3`y}suZj1u}aO.ޞ8=7gßGWWGV:TTl7 g\4c.ޏN.X20؂,*HPHl 0LdBJ/5lC9Y8) Z˂:8,|VA|Pv)ѕkP16V|H- V A &Di sCdqV%Z  ]!|)xmQ_b!91HY H:q( Ĵ(\-vw@ 芆mx$KD%> M \@"L1 k7h+C 4C6ݞ?WZb誁dUFRO%ZpdR(,R-F6|Wp'U0$-B`0p !R+&@Z5[ڂ 6I0/8 W,I):,Kf?`]Xct. H27HB=wX&,f)>MTU/$0= X2Wt'5d[vJ2z4 x!p6 E,R D1g5{@H+B)kQm7I Jesl Qq0FlV1eکi1괴h6}.r)wg&,fq-@bNjREX-:̠0HZ me!B4;!KR.}TB8/ lL 9T۠vv:)v76|oq԰Fg ` UEMܢ߰'.Rp `9V+$µvjZ:-- lqo]l>u˖BKB }ItߝU|/Pgl}nۓNg_m̼pxcge5qsɲ;:p⿇Hm9ҢYmhCz|(t'?_\6j0S5U5A!&ےosNYp۫:r q3XI=y5Fo.`v9܁y9)m01[ $ܰ>4[7)Ͱsc7F~edq-EJ eeI@A/.EbXL^`XTj!=$ Dcchɂ I쑁sēU-"jCa;nA*roķG᝖*ܳR°,APgF m`}qߊ%KS?Ӛ?,kcZߖL,$Lwe͝kVO"^Xg zY<[AF݁_- ٦uhabӪcVjձ3n&)YuVl:$1MWÞ7cyfyu5;,cxv`ujt^f.Ef(9fexsPW yz +k=%PQrPȂ3V Y>N/[}r&ӡ? 'mrᦛrorLdbQ57lV̛ z^Ʊ7kVAPT7} jaLe:=Zwwڃ^u;]K=$w $( 6$H0Fu o ұnJtRҌiДް1f :1mk6VXs)h 4;vϽ˜!kM<;G LQCXEuD1؉ BՑ ,61Šh) qD]Yf h.R1W-$#Fք!ǾCL{IV Ә+*@n8Ω̂EQˀ:g)GN;,D]  p*_KS jH, (&V:S0*%;A^`BM] iB NM0Үm`w&]ܜBn K k6NWkſa-U:ecݺC;jtUt'^ß`ctraverso-0.49.4/resources/images/icons/view-media-equalizer.svgz000644 001750 001750 00000013624 11163362147 025324 0ustar00remonremon000000 000000 ~uFmedia-equalizer.svgz}[o9{\Ktc-Kޔܶ/3e˒nUHυ_߽:]c89?i -VgG'g/~_m?gLJg/~^/WNj'/~׫_^^~zpr~myX,۳G?m~>mVWˋ,x׫oWzuqf}4?:ڮ>~^V 3hؿxvyn⇭usM jYq;4`ZvW@\_}(Ǘ[bobf oߞ_@n_N^'?x5:].("+6?>?zvxQ{Yy}~p|{{buvpj@eyqKJWju|r߫պldȏǫC8ƲZZWgu_㓪 ۞sx}̵iS&<yӷ/O.Wjy]OO{-t9P[|N_0}x0SP<tw pI򴋁|wwsLݱ}ȩ!83~?݉JQ O ٛu5ɸ;3{q{qq񇳶wj9oo7-n=Ed(p4Bă H#i#QCHp4e>m ;Smcxtmc<LE#SȔ!; \=;3/6N.IƛӀԕDѡ.A1Okt%9/^5vU7^!95zqI | w(K"}E $ pKu+J^q$.6zdB>(4}Ҙ"UX<>'!] .iL4ils"".2i9'`<|8b΁(us 7%"@>`ƈ xjr? +|oH vod;Q,pmh6ȏ˸{e\w2~ԈZЄ][a& "(kD(HK/Sڅvb  4@"F9 Se7 Q,"7ҵ;1k,fɶVNE ?V/ԆO3pL%0!MJLw`!e!+%}._l"Vc\,,BM Af';JáE^/i4^'%bL[48T"FdAaܫqv!FR ZrcLbVv%5@ '0_ I_\i@vnpDbV5{{L埑闤׿4$qu}]M `x]]O?LѾ>|joKT^Mj}UdgRyb| e^|u,NPn)q [oUL 7.^}TF߬nJ=;7_||~ ͨݬNr 07j\GFwCo )99^]̏mj;VLJ]O#+˿]st/w im6{xW/?Kz׫b,d GW'C<9=헅6@7Wmw/:]U <=|:ipuWǫM+^^Pߜ^TGW?c4"f+ +Ԣ_HTٷџ+P;ZXF!dvXԉBGT =0$*fE{[/}Ҩd I"8w Agu1_#{^uOM]m]9];ZvS(WW==+e{_c -P9D \ZqdVʺ3`h 3.HVDq C*Zc,j`TEnH%09j7,,JX1-")T!!k :4KbvbVӱ>*QH)Φ4f .nsIZ``N$)4L=:GEb5EfqUL\""L1Y /”ъۀC-̮&LxZœgׇ[7^\qq6=lļ*zqdfƧoєT* vwa}o܃d46b{LKaŠs{Vmli493j% =Ԑn}l6,Nb{VTc! eUa RxG'oHp݆ ^facla\cUBmT ^:ևKFsG{/[<}7~/-ct{{#=@5↭dIR7ѱdjU%h,eo9-:K " Z 6ڱno;dGß97KȂ]xiEUp ",(Y1v  [Z Rk"D T k.K {Ԯ#Uc30p.(]ӳˀ9e& bvlJ⤦ECsHUyaR%jPֺXLIlLEy$*4a<mM1c5MNZt_MKƼp.]z:(6(Vy&-a8ņEKi$oDRoF%]v8+d#-ڔ[EZHY-NOgn/&GU\@\ᰭ+X`3-s?0wvagǗiƉgG=c9<Ʉ ۜ ~t>Ҫ)|Sՠ$2ł6 2G]D|L(&걓 (9-zfP]'L"#vlN ck,"!Cś@"3l#f7" C1Ea*9f&M1fб^1/ѠKJQZ)H )!$[MF5kDZôܭ5b)@dI6eU00fN021l5IԄ%" PǮi  QiPdL} 2(ZR޸r΁ ohA2ӁHБrhD*$y][K馦F#pVK]Jw HefES1Tioȴ`(WQ75IZoF\wĞ|+Vl>oCZ5(seO qxO)%Ug'5 pI1LlGψʻV_n4?^_ gY@-@ߘ$PB`f0pFhsm;*E5r4h"!J6, —hƕ]t:Aa&%O-6'4anl}M"d dQRF LiW SWX;3[/wwsݙg;mռTTq77ܲX"s HNDP 'DcI&RA4$"H%z"0H&"D@BĞ42m!Rl'"%'2| MtBhTIGzjѭ̤Ax#3 a=3idtw)̤B3+;pKQL7jBdyäw|㟉o糙 9&M JKʼn⺍yKdZ*p1T( dnǘ~ /&.>U 7h$nQNіU9JȆd1g*|L095ڭ,}?O:uU m_v~];V)pTt % )nLJ˔bVt0tLO~Ba Wa aoM+ !FП%+2X؂ƥ_2 7M&xC{6ìaq憡nZC/>d( v.͈k#1'~3Qt|PRżc5 vmD";o!}`P,& ڨx1^x7Лݨs J{G3i13+CxXml+=ilX`mFtӞ𴙢W`?D,\d+FhX#5([S/]AIiXds&ExS0*ۈ,! "FolV@7+1zc"`7 }bƎ(-aHEh {P-g/Dû?.>( >N@nA6EXp( 7AC`oQRA7{c53LAJUMCn@ PT$:cm<4Š<ꁷZa~>f:>l=}fEnœ9x0э96:KIznҭ@8TL,K9R^=d(M`ZVl |pY<`U\]1ɆǪSnez ɯM~WKֿ?n^1ztraverso-0.49.4/resources/images/icons/media-skip-forward.svgz000644 001750 001750 00000004021 11163362147 024752 0ustar00remonremon000000 000000 ~uFmedia-skip-forward.svgzY_8Ouٹl*[Im pl_K lv6s{' ZnIhܭ2*g.AuTI/fO&u:ʓ(+r5sLJ*qitWqVe]nQQQ.3fe8W$zSfF.=#xV=RUŦqWL j-FaaQ:Ih7ɫWU0pHb=Yۤ 1EׯwTh 09h*{pdN0JMy{:yR:UtMz @i.UXֶ&3)L`z!|jXm] ~7Ie`:|TyL)@[+%ї4~-ԫ Z]߆bS7*?@Gl@> F_}Ep(IgX6Aqe*F6Wn+`b,~>k!lJ^4yZCn*U~ԳsΤ>Q^Ahf*t#*|1Cj"8!@0 8 i(B )cB "\ 1[~ T,;Fe烲ea2]rBc qޔ1a 67P""﹄KO7 [iMZrU3uL r rgH:Sr)JAbpU 04b'Bl]/o TB&m 3+BA39VZ0u5jfT p]|6^Il 27?onTv&?GsN|ʃbꥲz|T?dYXW~[ eg 8@pS`g p%a)C ree I쥅-/zG7d [ 0ݔ!z @xSzgߝoM[\Kyժ?~qTo٨MUQ6۔]{%jsg'VoVPZ&MT2ì pjh eۙKO_bd$d4 llqB0@Tl,%TWTIW0p}YFOޯzݶA+[ZXY^t^chq@i-NEO*tT8g~^f*MOqqZƙyװ-A@pO2s`baOaz{ޗR}dք"&bd7Ew JlߺCKakWժ<82;ޢ!i^~qsߒ!&'kp/XVFTjV c H5_CCTl:> M hrI#LolD8-m\YMw 7դn)Hv0)Xcz 8;vl]dE"f '4zC7ܿ;͵6ckn ѠH^X3Pr7v>87 nqʐcĈ`ȱVչuĀ HRBC B`;HB0' 1b!1c%u$GA5&E҆G}  Dqس\\O}i~:h&a5 traverso-0.49.4/resources/images/icons/document-new.svgz000644 001750 001750 00000007555 11163362147 023711 0ustar00remonremon000000 000000 \]s8} ]˸Fcg+T2wnfv[([YTIW~v@R<*U[+%6F@rY>[ v(OngUq:yww<[E<WYlv*C"__gwN+<脱λlQ =t}bu{S`JR.巃}v/] pnh1mZ,$_^ƣA6nyP> d(Fzx><$W܀}_=͋?_Xk*jc, 5Xt5:_Zgu7 *AR:Y2ϊo>KŸQVB~J207X̭d"û:NU#d?w匿լ._nͳN1iuJE8l^p6KEV"~g٬v ^,~۪wbtPRQ袎J]nglPv Y.?, Ckʵ BNCO3D}:c^{QF9-Npd>@2; 6N#űt]:Ȓ&uO~7 ;":ONTki.WgrBimWAoϻ%giY#T4&)}R׹'ʁx sZ%Np+5Ӧ#:۴XNb=z}ꁤqwR/Rjcs(f"[I^n"\nE6mGE_ E 7n3,1ZжI!HZ+"JiOP[ @uے*aN++j"/ s'2eoԟkntkZܔmsK@.LY+tw[[>S})8ײ|"rvAO-Sk* lvǢ%ctw1ͦ"ωށ+,E;dAFE(VmaKq ?ÐK&'Ne5K|} 8v=i Y1|dj F܇5(^Q",a:~@C^h¤Q*l(8F;zQ|*bf0XcLxgBɦ@œ KR:( 3ܴxy%Nj@3)G^ԟ(c5y}R&QPEVk\5~ᇵe2_Mz2Fz#9%t_>}¿Dys&+` ̗Nxpf8l5Iɢ5&Hg1"ij\[(tp'Qi7;Z%K5T-mVMmHrLm`6ژijQ$8.|.P]tCYׅ+W}7*DۃU_A-'H cŜ$BaRa p6x<2*_h}Vx*6d6-oTn%7,$"J;[EOK`'ؖ,ܴK:ёsyu?g# +c~c[Ԕfu@iV6Ɨl,mVH+.N'*)S.dS+#2k:h-?^6RpO;:U_˫S6)^O灃u7NE9+ 5ZxUĄה.0t}`C?pYf5VMk.R440mSyc"x<%81KGŏXn$ DND"H,V^9KIӫɠIݲ B)6%] >x^pe=Lm6VWZEBtԈVڱJ+Ry?d͘Q 1$ZXDq$T&E÷YiCP4x 21wb8hIƑ"]k"̹%TM$GBŐ.˦G2GT2~6h.=lac %R)9= haOB{6>m! -O&;+")I(2NmT V4AL԰ςUw7;i:`4?!Z.J4A䚡:3 T_'/#ALx#G˴}(-‰w6AhѢ)^o_n6_mF[;- " {H*Mԑ}vdAĐjgP ~AI0qN&Rq {._D3qQ 6bk̹8[MUZr0K|_ ̂[>3ae*;LK>GYeJRg `[PMPCbR\n|;֩+9LF&iLl-ˋl=≇*_6뗤L(R.q !0)A K60g~dl]a޳H@!7CK8%D|%&IћIrRzRoEU,Mݘ<65|a`ʖ'DpR:ʂ() ^ 0/J3P{8F'ց̀t .SNLYa2\s\G,Y&wuFi&7Ô" `558mO纒]3")K^.rZVd@NB!O@R{ %e|JS)  5CpU]BH2r-E[K#Wgpf%j㵔/2>}j]_}Tm--{~. uR^KEޥ~RƧ/#-K*X=fZa[Xz~UvUA:`po֮Q귕4\SVВW9Z* :$՘V'{ {{z1bm쑛Fﰇ/Yb81d($}P(cRҏ|[,%ҁ6mqzϯ=@%naqk K$ؾa{bkzE uCV.T Yc%{݇-5SژF,ʧnz;YU+)jR zfJ@9tp=@8L1B&a t @o*q y&Lnh@y_M38Nm:Fi;G6>/;@OƎ>G\kXjwlUΧT@M~k#ĥqiARh Ĥq0Q˻Yvg=㭴魂Ctqㄺts)B/ o )X_=,eYZAV(%گ'd!+HLV ȋb2iRܼ)o_wx3dfˊ5Χ|r>|*g٬Wd-:ta/OٜI^W)l5,*MFm s_E U帨IӬk(PM?st8,F%T/*N0ݗMR.Ph 1zr3Ť.^FMxՉh4/j=бD*7[3٫wT|fض&D_<ֵiQ.a$a?FwO QqVm߇L݂vg8}L;ksYFv~MԄv>9xB&DUxW*%ݘ汷i1@m&au= %XMRJ I5;iuǼhH^9͗;y]Mn./oX9Ƽ B<}!"g%3J220u+2pX-ӑǻs 1s~X$B$Y|F.w;qY]@Wʸe4}c7@?|[&QˇoBt -8'CP%Z1  Qr]ɦ""n%q^1d@+laZj+ !C ;#T='2e2^T{lnlWv8"o"ӊxY:-R!Z$_~LkdwMq9G1~=d^Ob.fs![dz ۆqM;\G-F[X&3mFY9/3@HۿӼ.~]?*3=K9+!f&G{] xl7_mn6}p*ܮŀ3G \c kt-IgoU99il GrL L]ŘptGcQ׈arΫqQ/٤!_tuM~*B7(¬ǘaR RIO]T˧uqH YKI{TIKPnځlb&G?oB#n#p08{Y҉?b|n'/ީ: h|,o]NAcpߓ޸J,ʴrH/owڳ^,>p{l[9Ҿmn6 zS 㠡M8#ojrЙ6MXurojlj@jۦ<9yajdex盚6MNNũnjr횔ԭ?9fHޮ Ѫ)|"0xh`ꑡ6=1i (ݞ؝4)Xk865I#Oߦ&TЪIK&-[59ɛ-nJl*m}-mv´GԌ!.Z6B/Eٳ}=0 8`ΚkEzF8Xٳbs87d>iqnE&ݮ։&{&H6M'Ĝ{ ݺ zU 'w65#45#ҷ qcy2<K1"" _wXꌓU^_,rL$~tUvd+,b/Tpz8 @1Ir@9kX!m1êŢdd8s ( C{mߠNCyWhZf1'|g0+JLqB3uy $I1a= BĢ& "Yb! "">gnp.hAEP 1,r3Ki&2EEưHQ(`&24QJed$0guuXBPA (P*!ƌkdbSUj^W埁,x$Gי&rBg|%ou}7jLiVld2[} 3UU*j%Q^7 ˜PJd+qґd<fe;5Whg.ZE.uK0JZͤŜJ?ѪE+g?NDDPmh"/ 4yIsAK, Iƭe<5JrJ6/xb Kp]rslW(g1gaL"Rq$>h3ׂElQ΂] *iFhJiGgXBҨ=g Obi JSȸ.aIk1FJZt+âwBuĵ HGr3;jvk~Lasq3ܶW.1.^ѣ L30Uǽ?} g;uQl4>zoN/;+zCo_ݻ f<8ou:͟ZVM/GS퍯 s=?cP<>ΊozA^'w}Q b4^׫ŕz޻^_.@e!1^X@h}쌦_UMU)oU20)sݥ UjfT.efǚެL5q5l{]L/tЛ}HBPF?U|{Ƈe\gUmg35ꍯ8mH]O%sgRw~cgw_ (x5yvYoXoxOf`Xlݍnv}ݥ9C4ng*۔W}AƸHYIEwä5P7x=Y4Ue;D(Fl|V:gO4,MǓ˯2i1=]7g:~Z$`ikZY.4؉FD{wQv428 Ұ^Jc|+Ҩhj4jjdWT#=}k!4Z1/%e0KTn#ѹHt| $ّȱ $ZH'Z[lU$gXE-+k ƽ0 _Dj["-hX>`Al  :̾=7k9^htϲص@ih4:phXwkIs08^B\??sQX>? XrLhIw4'fz9Ί;[ f^{9wJÞt9fE~X `X!6KFCl̦G`05rlt0,<\/d?,9 y! Vl,hȁfF yYra5rl$8,'`$2"Ґ`5dB16v`$R 7~j,z yfOͭY,H6cs`1 |Ȁ y1c5,Xo~Hq C@] Y'q% yyraby`<4`C,a?YC,,X Á֐Y[/,Ӑِ=lY*[ Q}|'1?+;v8JX;[> xC#֨wS(cѻ]EK&e#F1z1A<c`;)&(G a4^2&!#qkDG)"}'=]mm2`hڝѳڝ@2BA\{"C:֜&򾾔l5!:;B &C"Xx㣍'钐yF!Rol+n;KKDGJW@ͪ7U!!@P5BM;εjC GUݯJiL8+1X:`dD<;&puB*,D8ZO,UTeX<&}l^0Cm1Q(&Plڱ!}b]XgݑdQ6H0ֹ`cv')58L΂_٣|rnG8#!4Hňb}}ճ q?I͚G"]4!FOXc(`=C>a,!q?C %#CP]JwZ~D2#X-՗!Ww3c|cz_?7xp@U bFJ퍯g:s=nջLT$7Bzk̮M?G}FTn7ӟ6ӋۻEVDWg'; ^?wt*an;DXY+ח7K t?eEmRڿ?],3gOwEJ5[2ܮ_KnZ`8Ţ84Rl4^gW`śv+B{*n֍ EZ٭ٖ `weM֮j:d'@ne.z e#[_/{Gv'ޖNU,>qOm2/s^BUch9.s^& 풫^7ɤt9*֩T2VW]d6`/zmm()j,H-ăM"Zj4FR/gxbm{4zd- kKW8ȼ51FSEm ?C"d2 M%SAU]gڨukA6E c)R<#Lj E 6Z6 mm8<$%6lyoD+j$>գ T*ALemf~km|b]{ʜK`xx-cX]U4j5aY^KjW"hd޵yAim̻f1.s)0 kOm cwY樴@ '1qȸyaE!i<|JpGzYxln}(2$|pWĮbX_0J.`L~׏ZqM'< a}{4Kh6Mڬ'4nY]> xܥu[2uQ= Qk터 cc(1^?6xڹv+#LZ]үa (mLvՕ#w ʌ U|1 MTS\Cnc4WM gzRg/5:^\]oEt1?G_*t/ bdvٓ&DES~1 4G*єmn6%.grv_}UAp|wݮZ ?D0nZ^t>F|sXLd"0ZL 95Β2q= @=[9g]o۲,y\B0s 5&y,+z,6S'1&N^F d`4iMmi%aT#`n] #bG&F& F.}66 Jal ;Qӱzz(с/qS@?D1&yLNQW}H("'ȏܶxkE.Zvk8J)"ZB | jz~i8 4Ӣz%ezʞ0@[s„V &Txz>7Gts>9F 1$:FoJQR#˶)ݼŒPrh͹s/JҀ.k2Ű^_p'pp3FJ;]-6:NU~]Sa.1M@@JZ `a`kv(*a\VbCXzmz\u`&uGXkY1&\"aENR-raTH/ ûO}I5ڎa%SF23!'L՝rתE3Grז*bʝR8kRM/aE=јD/R"ldDz0D ΨecbĘzi:Fkh1tLYjPaE#nM#tVv+czQI-X L~b$b'36VZrO&Vɮ)&xQJ.τǘDzI k9'֋NrM'M0)җzI{)E=%zЩC1A^gAvV.tD ^uH =øfy)@80nX?b5&?~6UX*O_0DYWDzIhMK,#R)vX~S?p 9&?~bu9&?~g ?MJ@d1X/FICo>Ko~Gщ/pd2Lx~1 7d03"s,\4PL ROt\dt=#T (,\fTMN)S7\"@U lGZIrF8 (Q@<5K+kttYFgykyKIp8ŜdJJefUל:h,7FV͹J wJ| +w_8*hc U{SEGca&& )ֆ2 ⻙֢ 焷u=h^pСF@_CxlWRXm, . J%V mum'Lo)vDx[!P.Yg~〖zPg>AY4DPʂ-rXJvaUb$G~c⬁Rⲁ׸ <<B3#D EaiӀAM*i[)Ӄ88iFF$c? ph~ IH!9/c?~>-_մ;p,+8De #=9g0߃gF{0`a|ރ?(Tt{W>tvuv$;6/tNH!"=ҮJQSylo_Ck0< %@Kul~[:7Joo/p(սm ޾F[yM_&]̜<~ު/хSz9@D fJ6aƉGUpcCl?C%qǪ5-W4aeixY,ͱŗɹ3L3 紇eq\7t཮;:`ԫyOqV*9oLn$/vpr~9f#0DŽ ܋~@&0]2"2}7q UI}^_UM* Sp'HpQTqe&"$N^fgW[8-xy1 i2(^M5v W⸇Rq ,ɽ+Yh ւc&mc:n`>\Y!vU'v+izxD[;(9[d5wL1_=K (+r7[Ŷ%;- ĦDQsˆ "%]fOOhUYŸ[rcUҠ- et4NU|_~gc AmHG@;8?5!4'LMZ&ݚlO0s[rv&L-'lOv'Dݓv}<2&hW7v@Fe0,L%ҳo*ςȊ{ڽ0h^wahHU^2襯վ Los&h'Pgr[2~fANXn .€[=`>"gCV %?[EG3?GYY#!VKʆT3>|=| *OTrLߦXDR*u0PTm5BX` gM U *Q:l++b++j++ipre8t)Gs~@w2J\2jg2a NF '<7`$Y=RĨ`^F{_ϸG|W-Zctraverso-0.49.4/resources/images/icons/media-record.svgz000644 001750 001750 00000004000 11163362147 023615 0ustar00remonremon000000 000000 ~uFmedia-record.svgzXQ8~_LX ! ጳٹljSwuImJ ί v6su'ƃꖄ~ޭ2IUZ3#uTI/f'uZ̊\ܼp~_&RZ%6·k˵r^/z=v҆r8 ?9y5Mȯ7efSZe2Qk60B8"'!TI^tǺ=Y뤦 1EׯwasPj9QR'5-trUt&"\tm;Mf./vkC> aj,4p}5Ie`:{U>TuF8zHybD>XN (6zS?]6x$KC |!\L9 7c3q9:vXBM_/g- q Epg P~5~ Wv]~F2 V $In^Zp"W-_V*L%g ӋkL Dߛ2p3eL74U _><|7|67TMٵ'WOX5|)Sv\;e`̭ EB223ŕ޶,V+ DR+{\9MK++o‡s_r0E9mFC ;#70< SrМ#ʨ$"7@| 4 A%TR䣪 t-Ʊw-0 HRW 8ʵ\(ց?4ǢLTٲ)=Vd/[Ҥ.20|(-k&k0# #FR&tV0o q)GD`A)3)⍾Glѳ oR k^mًc?{fiղ؂;{!J;"_ <>4hIF&3K{6WtOU_펫cLF.:%e6]ѿ%g=zV@moznoNާ:Ͳ{C34ځY|T]G3,6U&nZ~Ҵ2m]8b3N _ 7 vHߏ3|=b?TmMjo޲tAUv3Zg7o-۵6op~oA`Ĵ>w/XVYCg`X#ՠ~sNε>tε S[-Pd `@3"  $ s܁ ?Sjjcݞd5WR;b;@<ä 2Azd*V|rc.BT=H,jju}*ڦ\XKIG}*RxMiKK$le)] kGl3`ca:5Xx`9hs~qLW @bg%og E"vX@ 0e,b ĚkCPwQ"&:_V ԧ@ |qCa4|&(AG`n"a{j@ 8~@t񣞅|q|NF l[G6yx^]traverso-0.49.4/resources/images/icons/media-playback-stop.svgz000644 001750 001750 00000003707 11163362147 025125 0ustar00remonremon000000 000000 MuFmedia-playback-stop.svgzXoso6S[HB‰{vwwMplߧ#ަӊI@==yRe%"ITNUGyeEn^?/өSZ%.W*6yvJ"*ʥwLY=-p,n#ٖKbOej"kc+STU-8KDm$;0 =L=J 1yy R<+ylA^ p!Z:u w)FI̴fƧ#֪DnwiR TJUmi2wa|>f0af,5k!2{EU>TuAD1@[k%SxRuUb? ֛mʏ! 6%G6x5[ _[]Ep(Ig0Z?2Cjl*0J~3kq:!~TYO?:RFyZuT-F } Cj*'S#{ IHC_\ HM#] `@-0w*aQ˹04Y/7˅"`x6MCX@y|#r|>tkwXЪ#g +lڭ!0>mOX,*8ĐƋނ ބiWx#vҼ*ʖҿ~!|F x%(d4Y "!̉2ʌä֟YT\4RLT0D%pG>LsOg %Hby' ӆoǜ l ډcup^lYV^wΚO3@F5ϘgƁTw~W;/8~\(iX\X.H@ՆjU0^p^?#||L/7mAxicw{lKEHZ}EGEBm*ٶǓܫ4i=bS3 .ƘN+CGdƐT}gqFf&j Kkw\UՂ^s_Ut\\n^?coo SC|s?4SF_s&&kP;칟]WMnF\RGr\(1 aQJjju`6ޙ@h9l!ۗFF[d^Q2traverso-0.49.4/resources/images/icons/project-open.png000644 001750 001750 00000007525 11163362147 023501 0ustar00remonremon000000 000000 PNG  IHDR@<։dsRGBbKGD pHYs33T+ktIME <'IDATh޵[YuέY8!CDIȐ"%p9=v %@~ A!؂H gH쮺][LdMu/M_yb4}};. ADQ TB@QUa/Ao?305Gvq97`:m l쳥]ݝ߸[_߯_v-DB&s`wML `nu[)w0Ll.lڛA=.săYBD=A.`A P%@'Lp=;>>g}arȴxW?yt+]`Pb<~X̎a7:k!/rt[Gp8}.;'ChkWo&XM1>9.fj,0 Q8Q[yEGK[*vϤ|WT{=ܿ+qxx?7o`|* @t DbZD},N齗ѬwMSܺuӦ Ьzyqp`w&WsΡ1 @p̑PPJɑxt|/އ:B1ʰ{'3Gzwb#<'gjx| T}+s]Թ3.-x(' (E{R8<?V=D>s1w{F@E7Uq!n߹W abEKdsr\| nŏ0UaueS~QZK^J" m'`cBC=oQ E6G!onB4;mWHf\N^R lBfx}r$;`m/BPjMe5a3*(Z^=7 >58pϯaCh氯 HU/֖AY^@dYzW6KU!;r< /v%>V ᮏFav`3'E<򳥠{Tje~\V @?8Fr]I` sǼ!und.m3 ]H=Jn댬mR8)9H$|v_~5wTO|8.`QOw, =6;#/z&2Zn95|үw' ?P|ɫkIB!Į3S]ZkaAoh){ >x X(͉ikŸ+mg!d.qL(O/0_"Z6VnF$ F*SN괘W?_4v"tX 0=|o+;;;0Ł@+8 O)!&%p5h} .hܟȑâDuf4'!y[G8j/~=+` Jid'w67m>xKݮ0]} x˯e`VSOx9hHEWjk|Ŀ(UKx0%Le)9!%Gzb r7VBޙFd!z96Cf #w+u&L.X{mga2^ݏ*cH.W Ԡ4*秣;WkH~ `Z ? *F ZŐ@*ƽO"BÀ-.jv\ Lh,9m-hҐJcN Ux<AWPaܗkѐPa8ϐڎյ)&_̞c'wݞ[>( ۹9SLᷥb(ŐN;Hrsn ! 0?@FD#&F hB{pqH ޸jBn3pePZAF+/Om9дV 4H s|gv{+R̯rnŠƽVi;3|t&^h!.pnP2ZU997`A>' t իB#fԁg7@y šx5d4J@ޛ5!‰-fC1E0߰@;3!9 #l'hU0O''Qe* tDԵAxa r*JœӹA-4OJasrg4#L 4 EA7IENDB`traverso-0.49.4/resources/images/icons/16x16/000755 001750 001750 00000000000 11163362200 021130 5ustar00remonremon000000 000000 traverso-0.49.4/resources/images/icons/16x16/reload.png000755 001750 001750 00000001454 11163362147 023125 0ustar00remonremon000000 000000 PNG  IHDRagAMA7IDATx}KSǿu-ܴmN_LʔY4 5%$% ~_ CP!ER`fj/6S6W޻ݽ=:p^h3AiD\OF$^$iō-g wylxZbcuEnKsIkVRA5$_lB h0 E8fҪ y(1Q0hfw^"00E8.wi C3͚t>1 Yh*),M(hУ}m2?k"ϩ%VmL% z[YwVZɷh(#s[N4s,]U 3+z0%6@\\OvUgJ0l1 9zRœR ޼1:aȅ{À`IG S! 0$YW*f2hɹNҁ%Md"C}v$6w"owjجK}.p1 txǕw9E*u5o4AlLIENDB`traverso-0.49.4/resources/images/icons/16x16/new.png000755 001750 001750 00000000652 11163362147 022447 0ustar00remonremon000000 000000 PNG  IHDR7 pHYs  gAMA|Q cHRMz%u0`:o_F IDATxbHh0 !%H(?L @1!id`c`B*f"dX @JZ!+C`1B1 hk@G L`h;_@!)_8  ? >IN nbA ( w&09n1@ML@63 @pC0Ɋ``H@1AL&H"@ݰ30 g+ Y?!HIENDB`traverso-0.49.4/resources/images/icons/16x16/redled.png000755 001750 001750 00000000756 11163362147 023122 0ustar00remonremon000000 000000 PNG  IHDRH- pHYs  ~gAMA|Q cHRMz%u0`:o_FdIDATxb?9 X@###3AHq @| @ܘ$ P#PPlqz ߿3|~g g\| g12l:W@>~B'o4 Ω ]`X[i 9ECf`P?@@5 @h/,6B0/X <|}*ơ S?|~  B5 ip3ۈdͷ  `A334p9ضF 00x~02;dHϿ@p&9b$7?ݫ7IENDB`traverso-0.49.4/resources/images/icons/16x16/undo.png000755 001750 001750 00000001264 11163362147 022623 0ustar00remonremon000000 000000 PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<FIDATxb?% (Ȑ $Uxy7䯏 _b߀D1 s1@!\🁃74G _my0 ĸ `RQwev4Č`$0t2g5;ߛo/ @A10ef f#'E1\/9^2<|w6Ob@ ?>b ?dw/ @M߀20 XOgtu~ 3  ~`h_1?2O fCG@cMwfePepy ;_a 'FF m 4h5'2@;3y1@ CP22b E#0430|džа >с&C@| L*.= +PAp@S4>@/aZ$@ ))2(k-Щ@O 70ZtL=Z`r FJs#@Q |ʽGBIENDB`traverso-0.49.4/resources/images/icons/16x16/redo.png000755 001750 001750 00000001327 11163362147 022607 0ustar00remonremon000000 000000 PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<iIDATxb?% (P $y SeHRfbΟޯ_3o ꘁe` QA@ :+(p+PP<x.Y&i&2|m;c /3!C"j<#$pΔ?m~iC"Pck@b@U f40!t/CЃ.z ļ@ Գ h S`/(ZX$pׁlc`tX߀pr@,Ty d3QcD@k  DV@[Y :rAJ ?O?0<7s6weY @s;* /3սb` FJs#@Q D<${IENDB`traverso-0.49.4/resources/images/icons/16x16/contents.png000755 001750 001750 00000002127 11163362147 023512 0ustar00remonremon000000 000000 PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbe;_ L  VV|İ_o~002 cP95WG]\ϟ 2" &~.& )~m 䳀ˑ嬨c+&Xci +l*&ҕl @1kK112|pW32Y@L?疠/ -$x e@ ""),#k %bdצ㷿 _4dy%DExAWd`raz ׭xAS]D _ b *B "Pf  K=z;߿޼ ?2|AH \ z ~;3|@Le`ӗV}gs=Ý4А <@WAEVAAEǛ_&b~ƛ>ū@@?w?89X$E9dxT% @/VGO>3 r2<}_@W}AA}).+  3#'Ý$>o8, @,j $ OGNM^>v``22|ș /dx× Wog FC tTtěfax o1po[~ܺv?- F&M/`?C~E'3 ~39痟6wL`%JgXؙT4EsEݓm d}L; KK|UjIENDB`traverso-0.49.4/resources/images/icons/16x16/exit.png000755 001750 001750 00000001562 11163362147 022630 0ustar00remonremon000000 000000 PNG  IHDRagAMA abKGD pHYs )ItIME 4<;IDATxM_he?}znnTnمtwEzDWa]EEĘ n)DK]4is6[nn{yxpϗ/|P[:|T#DBscƆݓP[:5\P`N`zμ!܍!?zsDrs98r6T'Q30C|G?}Oڊ -Oڳ=VEČ|atC+.2 x 8 @mtihZGǃ;)mg^N4Yk9O\?<+L}|vBGE!FTQjg+ƿqr]4w#qq]aݖ)QQ*,f b1y%"կ q /5#V9aæ?8sFrAiԷJbi_8Rah\Oiԧ\Y /r}ϳT0uvQagn c#.84^yͻww-Haƾ:rW@͍]q ?uY_>yTz'8 O9|cb_~JhK?iXB>M ݘ;#`N9&i* ˃+KKVb- !!_#)ISq豿f| /!tIENDB`traverso-0.49.4/resources/images/icons/16x16/redledinactive.png000644 001750 001750 00000000466 11163362147 024640 0ustar00remonremon000000 000000 PNG  IHDRAZbKGD̿ pHYs  tIME*\ϋIDATӅ1Al$F4O7` % Њ؆HD$̛._{&#J&9I('HV,] 7:2b"^x3sG$8 I2vra ЂapGxB})Xh=%;-EkRpNW(%P֭LyN.]6'mP]9((t"2 IENDB`traverso-0.49.4/resources/images/icons/16x16/traverso.png000644 001750 001750 00000001254 11163362147 023517 0ustar00remonremon000000 000000 PNG  IHDRabKGD pHYs  tIME%-9IDAT8˅MHTa䝟LWIlP.6mMˢnWA) [BP0Ybss=-rw=s=N '`%ڞ nKG`H@ @ xR1>pC}-v,cY5,F=f0 d&%bb@&R@Tw` y/ D[pi%YZY=Od)YYyOf-*cccI˲6DO$ccS'`i%/P*^Nן= p]7uZ6zH|؁40cFUJ^9y^&bYt>":-~E -ٝq.ɼ+JH?V[ߺ67;[:l6onn(#s_QH^$ewg{5gzq@?O|(Ơu:@STfᄆW0S'9Qx ÈnЏTA'<䋕JO=IaRd h> 7mCDcZ](;;ٔƘб:D16H4xczpжd`ځ+Lf8!4w푠@)WJJh!hBql~TDFb,O'2)%`$!`jFID"&~38luIl:-2u4] emv&!=4M;Tu XIkls_fӅ!.^=v? F(0KWmhZ^v_ӕSj׭;{p2G=+yX,ah\KCɘWMeKSŜ巜{nkku`Hn(+dO=WKϿN vZo?}KjxF}IENDB`traverso-0.49.4/resources/images/icons/traverso-import-audio.png000644 001750 001750 00000010037 11163362147 025340 0ustar00remonremon000000 000000 PNG  IHDR@@iqsBIT|d pHYsu85tEXtSoftwarewww.inkscape.org<IDATx՛{p\}?gw%lɲd˶~byBJ 0.ifʴxLm:Ih;!C&d¤3 P 8GrؒlKa,%j_}Oޕ){ιs=ι箄!!D9X~CQ 0p-G@N#K`9`kt)7vIr)ʷ*//',/2 T!\ J5^pȽ?X OQ0^2Ob^)|l_@y7d<Rr!V/Pt>r/&tSzbb˗dbav`4ђ5.]DHTUe&չZ}휾<}nh.9p^6ąV~FJI[[333a ԋ~d@04)%qFl-6RAEsQ ⧒Ei>)%>(6n۹c{2MQ2A/f /,֖9rM6߽{7۷o0 T@k`??g @8(޽{ٰaEG/ W|.j<@nJݷ>UU \O5hJgg'i*W.@qj R") mصki?FUUl۞UUh:cTUn,.EY~_@]wx,Ɖ'0 +7י}NS)z{z]]_J` {?R>*++F'ǓQSJ$Ch765*`}=00:; ! _q-{}!hoTk:@UUN***HR$eG ?/OkB044{(@45YjipIEa3MM.`Da4M2,_5wBk`||t\,9{2˫輆e>}˚Ui3]v!prg9>Hid2Ee/rر᱄Bǥi7|k͛˹20gkni=`$-tttL{@ !]<``;sf?>}?gʅQ~Adn,eY>|}}}XV5Sq,k%X!(++<{R(f>=z˲P՝\Л}(Jx?~x1nU5 %pd2t j1_fd$ҥK~~:}4##344ꙘvBw=v|OgttyqI0,''ch pzIlv@8H$4W399~t*BT14MM9蕢s-1˲-j`Y!R)Mⷿmp8infxx.0/_0zu]/czh4J[[Gθt,ˣ eUNV``hFkkB&'\%6;\=ŽA:\uJ24LL\f=LӖ(.0t.+tq9*1zii筷?/Gqpb\kp lbp0qI~wU"$i~+DbWa!#6mx|]]]*FGVU/AQU'b;P'Q]-.N.^ Npرc4H)ijoFDR **i;wڵ|k0*FLKK+Mw ցa+]/Eם{S`|A!vѣ Bߺ ,LVVe&x19|Z Ld2[ii@E1 ^nj˽FhoefFw_+NQM UTq𧪪:MM|{կr=u>]fp{Hkb pE0 rU2 @Ӷs8H(􍶌D@UoX,xY]ː7W8p˺Gcs t]%$1Mڐa˲rFzA c]hR֓|F'LO$I^GakcmJFGa|yh&e?ѿkXECKK'Pdܝ/+iv@<0-2Z߲mx"J$bi9-w.(&EB!h6A,0b{ِw>¶Tvesw 93 3_Lm\ my)`ٲ6(ccҌra [@VHĉ.^|1vx~ o!q*Ut@,3/Wbmٺ BݻcK| pOUEEUTUC4 l*Wo/?-@R_Tx^ ֯_8.ssEQI$H&(nh@nZ֭k@u.(>jvR`[<)UWYW+L #ãA*jQSSêZl[_8W'3 pXd2 $f}2QUX,FK}cdd _iRf7 EQd2RI*ep@30& Z*dUӨvszWϵ.#M9ΥQx>蚎(ʚ^#RZI&a먚Dz˿|R44,X)]MCױ- g^}ߵ|+Z?3y:XƍloҍV|× 'xfiקwpE/EGK"s¯87P8ڵ꽬^ip}` %Ə&0gxynu=ɿxvxAK\ p~,rW000DD"Dan Bs|!WR0>{UӴ381_njadcp{+JXE򋀾|> Z\L3 Y棢!B8gkH;5@pW_lubi[R1?>e%/Rq)^L!kzPE"RJ[no,pZO~+}c#|Y6b|`x0opc>ȍ|0,j+PE jH~`p4Kbl b*5q8z(8Ld{]{z@S/8Cmp >?[G޲'F^V.>P7io͉0LΕb{C)l xF SNLJ\Z1[(GuDkKAQkXoQ̏R!ņ*hb-5R.~Z8iFԣ|7E87[[ hoE CT*6vP`VՔ'P{~LWuHjHn$޻EtPRBi*_yEǗJ Jy8'R8JVp絔 e' 0d0_w:j]2ʎi@6_GhJ1N_~v^|jjaմjP4ZpxR noc>-8}Ώ£uR?`kcDFՠ*J$+]Pr7%GJia#QV+.aI ]h . ܠ>Jk{bj .ڪ!ņ.j8faf#0PiS 'Qާj{mK GSFg<Ҳ(i؀Z@aյP璄QTl$f]fiFvgU6B5MSVcEB5l66/{U$N Cl۽6^/f?y%l j^<f/jy]fnCn>ی[wÊ>GSxׯ:yg{ʏnZ|o<5o6MѢ"냿b\/c*:,K$TU:h{32BNcn9<IҞ N݈Qb =Tv>輇*C%P ZJcZ=Gz9J[z;YUe 0Vq]⹣戝ۧѠ xqڻtF 2; _,'~7=vpO; OW8ATS0ĂNu%FK)B6ƠCWQi6RphM%-Vr\| %&ƹQ&rµP3x\sH J$c^RRVoe> Ua`-U<!;t ְ8KqLySKhe"$%`Aͩ*0Fl vp3vrmVC%=>|gIfد/5C~4wbƨ p{!v|W~VAP\N2P͋`GP3QtM!њ qDC!n20<ҼQQ-55 #-7T1c\1mb5)S*ecK͈SbPZ/-цkKZAJJ RGPTV ̥D ܣ5ciPql֟A\ˈjWŬC%Dk"]|CڂѨ2")< M=k'Gk@R*;Z\́(= nXj.FmH%fo'6d3z5a&6L0E *}I, ϬųX CgT hQRcGyo1ڭ^4VYB<RGRۂ0!BjCA COZtP6*[Z m`rC RvUJoa0ۯ*j WfFtvW ũzVv{Fke\Y[/h1o _bqvX\"3f[oMH=TFIEvy> Hv2a~!|fFčqJvg.aVn&'CfQ"_[1N6^eb% ~=yүoKI}39traverso-0.49.4/resources/images/icons/list-remove.png000644 001750 001750 00000003227 11163362147 023335 0ustar00remonremon000000 000000 PNG  IHDR@*sBIT|d pHYsbb8ztEXtSoftwarewww.inkscape.org<IDATX_\E{;ݙd3ld  Yd(, >탰O .A I4 $ OO*JP؉$JAtctf鞙{uaTũ:uwS:j=ξփ_ݜ+cwͽ9}ۮs>PZ?|x^_2n6.-idehWS=9{>&՞cc&2?tiNxwk8=sV*qX1\޵A]k@2Yc㜒EZEUTT*qhyС@ :{]!Tk5٠ova-x"HUPeқ7ѭ+O>2@ū}GO;v˔um#ӚxΡ[!`+a0ƕEm~Q^sA<j5Tn6Ղ%dqNNMR8)TW*x@ihyε$I&6}G:7ߠaaoao##t:&ev?(;ogΌvѶo'ڻ7cd/"&l`yy:Z>1O6'PZos̋PtLb{OMquv N^Y!xIcPׯno6 jE,M{vi?b`,\U6dõNRٷ\|5RR{JyFϜ!`#WdήUזY6<;b+5.f+*R&'鬬c~fbOIɃ*KSa4fQleV! idd΍,~ NwD{LN$ ?q7Xt_zm@d@\emyJ!ΝvA$!m6i9ѣkkye @V+/3E18&>x7&TTcC

e"h};_?/M`UwfeKm6vEdZ6XQmˋVVE|U"?:ԅc ^gZWwUuaeegw^9߮+]wx]10wKݢwX_EÆw<J@`dϋaMcmUo\s-%򧜡J8/*5L ~i*b}.jP!nC_p·S\2CekVIENDB`traverso-0.49.4/resources/images/icons/document-save.png000644 001750 001750 00000006110 11163362147 023633 0ustar00remonremon000000 000000 PNG  IHDR=@sBIT|d pHYsƩmtEXtSoftwarewww.inkscape.org< IDATh[KGNUw{˱%%H % ؅X @Ě^IDB@@!a%@x:Eu~ JXd˃|p4FoqtxvvF wqppؽx/_OJFg ԡ-!Q0ϣ(M'S<: ;,*d4jܒҳԀ{@px#|'.I@|ulceuݫ4H9R TcwIMA*@N DD>7*A'cyܹs[[U@"PDxtOWQ5"V˒4ÇNgfՆ+@k9OjT Lk*4hqk06k "z/9wx][VzK?} 4DAS@ܑUzRk~}S\ >5I"p7ॽX=6(IE6EY/rFG+O\Jr_' P^A eQ{d'"` ;K[[,C ,!,%*U?Y= Toe}V۵5rjEUR:Պpak5ߦ=G- Nf9SuLZ,KEg\tfYp~c.8m%Mכ+1}XY[vdտvط$]h"݇p:,#vW,'i-Xdzah2u;8~*}$בY.Enպn֘PnO-ip"zZ;Z7J MfPUž@p~c%k.[qO7U=sw NFp2'eրE& NSk'<݊m[mѱ(RnYƒqCYNRMgO5hjRO] v'ÌV>˔ekUrsicgDŊJ-yM -\uUAϿT4kz{IGG.^:5M܄S6vw ^6D~Z?X_]i}@' $9+zoIٓ|_[P"DgphǶ^^z}BuICoR9Xឈu+e2c{{$I)$Ib"ZHkk85EʉGMkefVJ̆fh2͛7ܾ}x2tΓOP҇ q؅޼tիWWu$:H)(Zk"JGCdKgRpl, lq~qO mE8x%IENDB`traverso-0.49.4/resources/images/icons/document-export.svgz000644 001750 001750 00000010444 11163362147 024430 0ustar00remonremon000000 000000 ~uFfile-export.svgz\ms79K\GhCeSVU%Nv"7G7YuCrPFtePvw5>bZ_uNGx:xӞdj8g<ՙ~v^S>aUGٛqqggEXfS(E k7ۍG7E<*W GI6?ge(nQFxDoo٭ BskM]M缏uIIͦ?Z c6\h` <'*{T F53>^(_k>_OOU>/"};WX-\ /eOmq3!3+ <:,vχXG\;YqꈬE1y)68Z͙jJfq1BPd:0rFoK|@eqOqײȫj_p=/:dQFe|XTSL麾V ]T5 P ;$FoTp^Ne`ô?(]L&B; IT:Y?*ެR|5ӝzG7mmMPoB瀴\$u-@ZnԦK=d7>ۀ vos2u j+۝?݀igpNhڀ*Zi#!%!<ɏٗ“|^ YM7 mPpv;_a>,s[<߁H VS҄% biIe"oHV \^uU9> u\` "4zk$ s@f{ɖ$(%du$\'0UG[#ǻs 1?LI6L휐Reve_) kwpMO~8'SPo jbd`Sڃ㦬?kI!=WL*p. [gڬ iCp~Ck.ȆH? LxD>!5U1ιHƛHgb?z{ֲN e,𣻐k `+[/ ='2=`}b}yq_ne>~wWsz^ΧLc!KhIXy0"iӣVi c~݈<7"*|lX?zo|ƞ+!f&G{] xV'2Aom+p U n]g@X@O! }[Zz Tjy} +ur%3ْ)qd8r[4άV޺nOJ/=ޫy]ˌ. 0qbL쌶O?x{Bm!M ӟ3ƵGNDY 7s*9D_-8pb<Sˌ 9۩tz>Vv]Yf~]4cF _el$7,S\-V>څT私ym7U}N'R@xk7LHҤŚYe{_dQ*]py}#Chtt>.n{=UgW}k_/eТqtW,G$*xw՜8/W=@Y~BS'gd<4sQ`$sYryCiprS2j^Z\eMlA/u}ɽoreVTݻ.j;㫼հ%m2K8QlJ&/mW -ߟ CJ R?~ ţrz1' jyXMǼj5,/f&|f%S hʯP 4ָAf= bt"Ozp]lQe?$GxW#i VM;Mc㍕Zh۳H9.Ǔ>Y{07RMb+~ JA}v}]jJ +<yOz*K+(,:߷g ]7 99Ҟ4i۩qЦ 75vML&q MkFir@65VM mV'6vMVj:Q;Ԏ޷iz78ɵkRR.@NY y&+D?7GZkFLv1t{.7nЧ{q=ijQFǟ>MM⯡UpMZjrJ[8iݢ Z[Tb][逨q(B4\l*QKxEW;r`cqW:'bX9[J`g_0`I$Is+Z5 ;盚t&c['7o lhlm43PMM,u?C&AOijjG\KŏijjG\[5Ч q8`y2$5\Pl&,Aqq-hDH9ok)UGJH 26))#%bXkjRёaT 7D:I/l-.b<0a,S@QDq!N@\"^:PKD IXb,b`F8v8&ĴDC6AAw-cYjqvÈ&sF<-.ˀL&oCd`2޹%:udn$wa6x_Ϟ8u H:^K1oN7,ofѼ*?/p$gG7WS:9בy!(}$fNFi өjoSUުV} DRV:UgwN͟Ӄn"̥U?'WtVz EgVƠڛL74W;zI2ϙ5r-hҒ;O,M sͫ%Ӻvcs׵aO;A\Vյḣ`3!Lb&uؖi/\ 6@ؾPbcmVS1Vwίu'kaw<pP̣ܮA&3v [OQY3v)nTog;Mr&Fˣ"Ԙsf^10sZ#e,a\ek`9_ih)Zk-]L9S3 vXrYRE ॒sy_۩Ό$ &1]-)ԚO9Hv6;]ܶjL€?t4lLV4@ W&@Md4hp_s.xR'Ntraverso-0.49.4/resources/images/icons/application-exit.png000644 001750 001750 00000011431 11163362147 024335 0ustar00remonremon000000 000000 PNG  IHDR@@iqsBIT|d pHYsz<@tEXtSoftwarewww.inkscape.org<IDATx}g}?332{wwq8ľr>_R$Iy+EF(P"JDBUUZ @ _ܐcB^T`ow23Oٗ[UHg~{{~'m-vw/]"Yo] 4uUN{ؒ%"f[P)NE"Q(!6q}EǓ)[P cBF*E|` T2?֭>9T:ݿp߾FG\{~>D$1ߤ]K2PI&1hooz:L:Y7FGIQ 93g((ǹLh:lLbXX. c]>'Z.Å ߷oK(f2t\I6'w4)Mۤ}(Wq@ݱ,99oG"1=wt83Cd6H& b&Cpl|>K" J%4};idEt۲PpeY^qldt~3g A;X7%?fyY-]HWW t:Ԁ=˔e.N8:Ł+_^{hw7[wرcx@gStımDL##|!طoO?4z ޻dN v=l޼={o<ɮ橎>q` anƺΣO> m$()LϦMBny~꫌'nk5-=QmZi,a߾}MoCJ?!;LN#?amzM7ģƱ'٬i6$Nq-4RO˗-cΝm|׻ޅiL>4[dҲ۽׷ww^~q8?|R!86*1 JZЪ`J)FFFRrQ c4ct|:5,$A6> рs,${^{-RJ~3\`R*[l kka+ŹI6Q-jQ@vn#CCCٺ-INv|+V}Gx00#Gfg[/&4?~: b VoKq:x^[pW8Ӗ]1ه˵}u@&6 V[ij|A6 (]\.ׅVd,_!uOZo^P4޼FGYti0lH8Tf>mL ˹x0VtRVnի@(R\\6qW֭zxac<@yjj^q&zXVG2ϡUh>x>005mdjzXn0v=Woe-q:R"QMR6;F*xJJ4zکmSS}SYi ҽr% )O8bJOWꠘ H鎢:zI}o(+ζՆVDIH&8 |έ3G]y#w38H7壏Gı,*3ܯq'V cuڂ2^ T_;fJe BK3.&'tp$ַXbW\0 rzĪ%iDR](˦8_OH%SX4F2kVnbaҬߓ/|:ф0dk:O"&@!`1VHI."~sJ3ضKPiN;cOkɄ2S䧦+"5 =HR8Z410bZHҼb.OR7<a\ѷ3_2vS+JK]܅ ̞?O7mmz<81-4qQ]Feض].Sf""(F@5fÌ1c("Eui:#u -C47L:pL;.J|kD+_BfUިy *) &BV`MX2`5u]! ]I3Q)NLzGofsB/q^ Uy#RSa]I(˓վV|*2< mgϞ=-\0K,aw&쿡UR6ʕ'/|#Gy@m޿ޤk8Omy?ww޶;I,Y®cGb./-"T%BPMka.4 mݻD›v8ȏuDx!9ETTV:4WG4m;-w <\Lnכe+D= Q M\04yvAVmŎ;j$([{-JN[ҔyvAHhꞼޱtU$MLАX&/콇LLL4nUNR z|@? AfU]#5&[0鍚ir݇}T*EOLݫ8ϰOBf#!L8ȉ$W=>I#A.Cǚia]ϻ)]]]tG5.~p\}.K0 ̈OBK)F!\ 'oͺjTa'4;AѮ{&jb7[nmXfB$Q̡*x e}x(===>XM~&"nփm"d,& {Ki5W~Uk 8 >d Ճ0}(>^R6%a\]qIuZ&(U5 GH֝bx ϓ$]:d fTZ@Q@'! >=-ZĎ;ݟF:M 8f&Lp{ƍۮv' "shr6 o6,cPf-bw;t%.Z=hf. Rb& p!L^4`F' Y>N:AΧ .dDOaӀ6!奄;>;Xn]xjq᭻ I >/d!I*j ^֒},XN}L19&m-222oHbĕw f64Cm&˹WѥuS E2r-!RM!sX X8} NjVt*"!LlF;r{,j(iH73 ?8!&8<\\_}v8Ãt|qu9yvxyu?}4:xy=O'ϧ~O?~o7OF7|o˛o/o$\?~>xzu}pOeۮc.?~zr?__xr1y?c's7zrsVܷ>=kL|F11Ѩr9]G]>Jpܼ7zQ3{?4}ˆg''r2=~Wwo NOK~ .'7'/7N5^}7>?}vشld=KӾf/|^7V?4?4o[ԾB׼td|yl\]\LNUǿ|(gNg^}}ۍfWO?;N~7pt'n&ۙfs]p|xp/ݾ&o\B2ڒd5 $ وcU1 +*# $v$ **)|JyJJ7ZJ?"!:g ӢJ2tuj*Bb݄)Y"`Z1D$r?`,& e>J\dϛGt`*"`\b !VQ OK`knL8< 1M'7W͑N?<=>Iӫ7try짋o1B4/>NwAkDBA ޞy!c|}>?׍UMۍmO/ ;iuu'M Gιn ?MO/oѓ1!<)W] ľҦ ][gfF^yG 52 _=vk\`]le wS׹w{얜vD.x !'KLIjq`nWc8{?0mUzY@f6) tk4VU\" 4,țWWLМkn^XhIsV~3bX)eGnYi;d gHq b^̭L'UiT/^ܚ/BҝuXa \]7m-dqiATb˕ʴ[ J:)0:K .ģ)@xv+|~kgp&'JGC}9+̊B$$ȷoWt'|kHLo";$f2";@";p\εR4hv-݋Yz p=SB+3luX f:ѡxy+%8usײsM]2u6/vTPV΋,2hNhpBLy!i I#"5le-ʫ|P2\XF:@V/5Q$4+W UlбQMNR|оEr̈>0YDK#4s:m:mہʉH R6(/d ՙw/F=Z&P KHbZVF#H.9eN jDidhYfJ޽& VIJR*iř$ %DdDmS7TPdb:;ܶ)eTyR`IHD\Ya7"mt!pY!VCwrGL|Kѥ쨑HB \*p.eH^4GWP}<0]Z: .$WRwfIa[sfñ(-Pl8A@\f kk1BXyTͨ@$":W* e)=<]͞s Q:JٚAHm}}QT +ĴCb A< V`WW86엕g08:osʭz9vzuā[ü$7 `+|!YX:*r$JىB$d N80SE/a=+SdύdD9# 8u_;^pܥAȫ43j@y|_R1{jan͇$}ve;~Lَ&׏xn l@7U.SLe< pUwoաNջǫxy~HQfy&Hy_/Pϟ߫ Zaf3>^o'>iZN+~`ip߻\LLF|sqyk'cċwvջŰ~gTh}q|JՇC?t7T'f{[I ϖ&c##3 e3>4)f<ܿ*3-O>>U5Xtq݂_f/pC |/~ J/^vUVqy5i7*36{yYnpɁatٛ?7Đ~ñY(Rc9{n ٲNLkOn/.nϳ#gw?LJ~QuSD޽ )T?\^L^'v?>i;\j޾,a'B?6g[ԿTJ%v0i/şl*^?L跙, SR@_2Hh9?c/\Rgtw_]Jlm[JFxqL //Ԣ{΄mj4gj3??$qY[5&=7y1a+ۄ9(1UM-(3۔fRŋԅPH[,=q6hX FdEO1dUWGa?ELt~zsO7M*3e/b>ӋB`mU L‚TEĔI {yVesa4oMh 5Ѭ>]>"LڴM}IiMY[U.na6Q)Yk0-NHO"kO{ByrtH6HB$}M;BHWRlE\Z~Ey 'ě ̢nς K)f\Z rgԶHӥ1y}q~z~{Id =Ә1R!uz<2p ,^ҷCUL4`^lR IY%IU((.i'(SkcY}kYBؐkk3t(aֱ)m22-hj ZDՉoA(BxWY|~ehV_LZf1>z>78=U$qXۇ3I&.S% cD|ޖ[mPHr q8kq|{:3t/QF2@w?PPGWz~~UAZ}3LK*77b#&;F$-EߠЯ_Koyw%}=7r/]ߒE_I 'pAvGLz !/FEbyY26'4(BB ѐc5,BjB_LZ.tb2G Y\y }^ n)!"QlםFmL^"CĎJzgAu DPiS&䊮f 1ߊ/@S['LEF\ܙ٢uaqBk 2.V kmae@ͤq0~UA}=Ue3juz+¢G9rz4lEfbHeF)Fe,iGm"P14ɚ3Fɔ1 LmL+c1nLdX5jV ,g8ePH"*#DnR0D4(ɍ9fcfX5Z 3պ:5jYxFsȕ:Idw hdD1T AM TXG?ԭH\1tmL#MF0yX %yLQ*S`Ebvc Fr"!SA;B LbTB 2pYIYY-Q,3{M`iLXջq {?be6r]GPFq)T62b TH`" K: v(^ -D!TңS%JJZD)3Sj@V)A)uyj$1Ơ8ʣnFGA6uB1O"m(,D rV_`y%!i1X&ctf^mD26*$9)dtR:`\B̐cXe*g)ePh,pwXR} zD0w(n610C, {ݺ;:`5s҄CT k.IB4s^A*B&JBZ&k~ A1! dž̸K5LDTdSC J1HtS f;iGWS+i٠96(8YIuCP3[viӼ!hp%:EPU+"I \0 dPuYT p7Mw0ܰ0Ih%=׬(ܠF\3ˈJB3&. H'(cv[ZEcvWi0H{45r Q00FAu^zt> 6.#. !xGN4(1eܳABd;"pu&0F &2UsӮ@ˎ 3st([ F24Tp4'@Clhvd93sG*C>H"@:"SY1r@Dх:љL8YEq*EEIdZ7Ռ5ز"w⎌2LO(X'ӄ&VBnUĞL0 ܡqF!VJ RÐ*Go͐;4HBgZ@OD!g@o19nlIn ="L!9Y<Ҡ6$hB2Fz2hD5*jZwފ6$aVCGhmNوPP{!bAT!b'nl *djCY]ݏ04ai* ȱ"Nn@eAk JEh*'=l4 q2v$,Y23| JjE,$<όP'0+Tk*&wdM^Dhsl~ͱlm`-|R?f(.EҔ%,BԈ>Ijőd _%E+/OxMt˷inhPITͱIIs叡#bn}JWb>L-AQQXao?m?A;{~hauUâYT;S+UQ>yG!ZvTw"96V@$AMOgo!F\;bu-_p H#2b9>Ihu4p :x\jN:KI@i+YXy+QTuEkOl"==1yr<+cB|%Sw} ;cf R4,?l8pD!ߚ~/ShxVfJč*zNGm9FCj{ݡm  6pTXG`mP@QiXV>Hx'2P)*oaXabQqs 36EK?'lBOG}TXⷰ%΋It1^U'zXQ+@xi3DȈK_pUd`U+@ITV +!Z45j0)(9D˽ƤP:U81ۣQ"VE@Nڦ!;lcT 'J-ٹ#XJGIN^EqIu7}A2֗&@=XØAs-kWQVNȯ \E&'4((y oA?9_K腐ߋ~ߋ>^>WvmϦM&x ctraverso-0.49.4/resources/images/icons/document-open.png000644 001750 001750 00000005205 11163362147 023642 0ustar00remonremon000000 000000 PNG  IHDR@9D-sBIT|d pHYs tEXtSoftwarewww.inkscape.org< IDAThݛMGUuljrDJN! P (B) "q"@$%p@B(""Rر6ޯٙzzgcg֎ꙮ3cpx_~~mmmcIt݃gyw5osŋ]UG#ן xu+|A_+~)bx_>L<6C" cF=9RX[pۘy|&7@|Ȧbf{YC*o<$>9Ὅ᾿o[4`Jߝ |חh/1+0#Tʞ=#"61=`0[2a~6]0Qކ$D[{)#Xp}dcHWsM eܖ~pݫ o32x1]by.a0Mb5.;=Ph'~Q 乵-oѰL]a1s P@PnBk4Xi013y)w"f!Ry@5I?TѰ<rHY&zVy*U9 Zue 6LWLU*EBgӟ|,p:~HJE; 5zKLBxr`OU&dBԫzg}Q*X[PDQ~L\nFXbk|./~H2Q*T̓_RKzFƻGE`&f 4,b1rj31 9 o]{*":a*'rV:w !O{1ΞqS՚)`㷜o=q nPlX"rto_ݣ U8wh"lx[8E,Ӥ Z&F'U8:m A 5"k:Wz֬ 8sцM1GO481ԆQ/UE-&ax&,Y6#猀7v(\:OVJ-p O(2^hY"BR y?\6pNuJ{"*`T^ow;NŴS G#U(yU|iez_mVi38UA?fAQĩn^W 5"QA(yGK;F#XKh#1A:p>~R/ꔢpT2@%"`B=4z0x4C9̈J1>`3?A">N/ w% B@ME0, C pF7ĐܹK 0:M*Hd]KNkx 1 $XG\F6JPP"Ɛyj ,&(\WA/Z1ΒWA( M3oF T<5-HYTt\Tof=DXrzJ2͔;طُ֧8V(KFHQڋmn{‡^`-d hA(Ԟ`(&?cdG54b^GbBěG9 )+ x 7q!!{=JSdvU܈G2e /Rﶁfϳ>H?RS[z=p+tdؕ)Qh$_\x݃vN0J rxhdXZR )E!tfmK)D H;ljbVM tǩRZ Y{l TNw ^Ժh?s.'sDyq^l6vonu{hyQ=֦05COM2r\t& t`F.լFmK2{EGQ> )g]lDi,VBԩ ]C߈b';(R'lqɉ Hևe*` 0]E/\[FIe?$3tY/y*!v(?03R \s|7,[c~M))CyVG=0 "ohp;.aZ%iEqQ L8ȊrrI:9)JHrn7И.#Hv]Sal]/ӏG@AK; 1 72 T,⭯"QΦ35^xrNP9;0@! 6 VGt1B3C@ϩ}"r@GQ!7= @8إ5aBp= LSϣ#^%5<traverso-0.49.4/resources/images/icons/64x64/000755 001750 001750 00000000000 11163362200 021136 5ustar00remonremon000000 000000 traverso-0.49.4/resources/images/icons/64x64/traverso.png000644 001750 001750 00000007020 11163362147 023522 0ustar00remonremon000000 000000 PNG  IHDR@@iqbKGD pHYs  tIME$ =I IDATx{tEu:\$MN'ݝ$Eᨫ,(ΪgY]YfgǨ$ QQqq .E.JB鄐KU6!Ω|]T>V5 `#aV uKR­' IxWBHTUO$v3$|$we|ɵb'=ׂ;,kt `k") ^&POH IփJE: '%U*ABg$RB% I8уx7ƛ%wHX.ڋc%f|3$$,PS! oJHE}݌o2"I­g/KޭnECUJHUpJE]J C vc w dDUaCS,6 OfJJxWRN*(%KePӍU%t@@'jc`Ћga h<$ÞہEwx1BZdf. y |Wm(x1HJ!vpE~ZuLR l[uV Lp|f?fؾN !Q`7pU]f`SKt8`ֈ.l + K-2&M%}8~:;y\ ,Kv&82ame@ LsB\PH_ 55p9@kF`ۻ,&r'WL$8pjj6%B' 1, 11`d}FCS44@]uΟ80r?_x)af?JWLmHhBBdn4) ك6kBmܥ򗶞g m@  uv[ yF~~mp}k1ε" 52?\.P? m?3񐜜0i =xH)?VE\XdJ|>ߗP%rИ:U'D PwBgg3￯G'aZ\;bccD&$$ddd|T__9Ή-:Ȁ<ؿX{RX$+~ut^]<@ u~HjfycYYgff6lՊ+5MzԻa2%1y2 ʽq9.\0; ٱJf&\=̞ Ƿg-ןEѢWJ6) ^BA\- DDD#`p'1bNs%KC"pNN|7Å @Izn{w{HJt5 a:4\g!T IA|XKa)// [|yr\ScccKKKK뀿t$%%Wߟy ]{-}޸(`tB͢Ƨn21QwEEDTW[im֦{ , ""bٹ@qwVVjcccܼGl@a}ym)t0ѡanP qBQʄ)N)ۥRpV--\ճp?b _XXxf3TNpPgs,!z(ߔ@N'uuYT;цp7%(m1Lo'#22kvL>d{{G&?g@70ZIRTjo ( k2|6VWW72';;{ٳg)iiik-[z[Ӻu/T*/BG0\QQQr<$liiibvVV->>~ߨ0[xR d<χ_pvvvb XKnV~8 l\7BկJ;2+99ySUUU-0!;;jٲek&\g2*<`/w*::ͮ君0 6ll6hjjT,qZ}p)111= Rx=r!/**U4&?? 5;nBS{}02dZ| C*xjF{uĈ%iiilߨ.>7xM@=C- !&x㍝ ,233z!v7k+Aۘߠh4N.((Hkll\=Ϗ-K/x3///l6,++ n>]MV---;U@  +pG4n}Stttyyyy02226c~P(T/J}XRO*oX,%~ɓ+-0u̘1555*++C|M&Sk]1fpLw:V\y0y?v}Olls߳>x *L&ӭ@ n}w^^͚J`F~~r*d_#[\\\IFFΗ^zi`4A|ፀ4r,> OۀCC!D~vv訨hXrrԊM65 rVw|7]-Ԣ|cǎmUѣG';vlZxރBVuY`L999K,yV=Gm駷u F3?'$/IENDB`traverso-0.49.4/resources/images/icons/media-seek-backward.png000644 001750 001750 00000010565 11163362147 024652 0ustar00remonremon000000 000000 PNG  IHDR@@iqsBIT|d pHYsu85tEXtSoftwarewww.inkscape.org<IDATx[mlݙ `1&Bb%n)p%&+ '1 BKBRj B" ^*[d:ۙ9=90"0D4X*5y]Wcw7|s=3d?%k믞_MD7P]ar8 `7clۚ5kżo7xT0 'V]1g3`Y~dY׵|8g~u}lذa}i)L&L&l6+P5Af0 q6  ?G֭rXn "YڜQ۶dNa6lۆa0aJKKQTTp8H$H$C__100^\rLi4M40VaÆ/k׮m2NөT P'NĤI0~x!UYA9fse\t ?3,`p@d ,۸q)k׮[V%L&L&QZZ3f`Bbe8qĶmVO/ۋ`0`0 [qmf?cmHHRH$>}:L@ ˲PTTP(4] pK^>ঔNwĉHB, @i psiӦ C!8[yY:TJHƒ>`0P(H$p8,TTfZw @`?J8q'OqO! jի|Bc2D"@&Y0i$XR#<.s҅Pd2$Ii$I={aB,IhqccիWMD0zha# 0 W@.6/Keee9rd^RHUeg( f1̝;;w@1gԀW_}u۶Zu]1bF^,/l6۸rJ 8 hyy>}:***1j(P c GEOOO(k Qee%y$ R)W@ +DQNq, ӦMeY5jbZ,?Jrǵ@eY1c,B*B:V`WXQN}QAdUIKm۞u.6 k̀*hI9KCQYYP(2-^a3©}p^m{ X!ӦMCyyfW^ye+J'@ @yyP}]SHՅCr.PLO=Tp<85TG"L8e eBGGqphmmu%P!kD ɓD kjxܕ&Ma(..)PNKn*o>ٳG6|!~p{0l6+,_x2S>c477 ɤ|<2TVV=|AD3(VxLĄ `P;92=݋]v e4M1\Oԅa***`gc3 q&#8Bsp,d>OJ;v Grd2 ^Gؽ{+3ƐQېhx|\"##\6TJحꫯpѼ>ٳUpY]*O]9r_)ˏ5h;J,'O/.aUuIo>'j t󡤤$oo"'q.d-Þ.N8SNiWpr嘃'K7D٬B*qC%}q 8]EDpW畴lۆ8 <=V#- U eeeyQ5@-EqԗlkkC[[G?ܛ~Q-.**ÇEzHD"< VRRݫD\趬;t:- Up8x<7n ͢Wx\ZG0؍ LD&q T(trZp!,Y>:Ѐe˖7/xI1… b1D$uvODyb!nXRh",]Ŵ]ҥK`0oU#Ӯ]jI :wo.Z<!ϟ3Ig{^|嗅eS^@( bpb1]裏g`&:;;EuĢEdNüyATGAy  ˖-wjM.䳎 1|~D.];"6L1fڵ˻Av,%"ر7o]fjgFޥn$ x8,ҵukbur}<T:CCGf~˖-.uuz͟?_q'JDЀ'ZW]Z)]*jھZfO&|2n*{ş<{qk@QR0c?>N ˲D«mPe3 jӧsN/nnnЋ!{ M3gēO>p8,R]Y:Hܳt!ttt:uM[ef0jtR|8|0k̚5 ӧOmۮWG*hooG<wcV PuuuvyY:6ض1cƠ SLqM#gΜq5WȊ\|ssFccT39C,--ߏS>?mG,s5C%iT|8\'3uuu3|LDc}~+ q}a(--EYYQZZ bbqΞ=d2 Y ɺ`nssdFaiW2x9IOṇzϟɝ;1GS2Eٌ4u!S!_kRSDgs2EQFD cHdƔT#4ch-cIh'",_,8!8D1YEQDgi?'[ZZOѳyIENDB`traverso-0.49.4/resources/images/icons/tab-new-background.png000644 001750 001750 00000006205 11163362147 024540 0ustar00remonremon000000 000000 PNG  IHDR@<։dsBIT|d pHYsCCxZtEXtSoftwarewww.inkscape.org< IDAThkGU}}3x#vB )$"v#uvm H/   B a"$<:Klx&q{vw;d2xfHK5}gnuUs=Jr!x3#x%4]Cc;/zL''y; p 0pϛ][α D1HEDVllasa3%UXZ8Z?щm,xk & kyxWsN%р|w'#h]"2509J"@o#>xx0\KC1hg1\9ǡǶ<~n63^!_ CY^1boǵAn'`pRJ"Y':V$?Cj120Q(7qɏX(:8s4vrr'~J3S'_0Cl@k@?@h9PJZ&{BH>%ʊwo|77C]ב[gHohu'Cd 7rs8D@| !~c*YDvPBL!w\M ѫ)gt pdbݥOI 1+|WC[ֽo@4 7+\IS@@+xgy+ Ɗcb+|րIw0aaB%k 0h{"Uǡ 4^MeP IZ^h !B3}=3ḍQBBy58}tig>[#Ҡm]qq%+ yukU38_Ss@]5Ƙdއd \2ɨ&$h7iUQ7@R4 vQ^y#vjͣv!ݷo_EMáDmHa0J"$HJU- :DNib#5tcDGǂ4t ܥ?r[o7H)/oݻ]{Μ9SBKr=,.VzSg]bH)(K $4>:AsSE:jaȄi2å׀ ({vmhv,R 6m#ٺu{im:3/; #U\%p\>lȨ촹6 o̬+믅 hDPB-F adNh1~!߂E4E ''L#AD#xlSy9NI5t)/Z<"g2rleN`7iҀae+D:!MDGKFT،\`o>)C<(,. !vgmڎЊB;!Յ)Ϝ^2|/ZQ@Ct8$kꕶ] 581KCC ~5z= XB's[vq3ph0>>.:4It3u3H +p5tZ@GC;$6"uq~%#4 ϣ Ky.2Qeh%1fƷG_JTd+I%  Bb@$3{۴DQD6f}0 c Ra|bHP<DQխa3RL&CP`xx z§M?K)pM`.,,"1l61R!p־,%!7rGȴb/F9bc9HK%7Ԯ fdUᕊz 7EmJ /G80[][j5`b87Ew+̈́ /i M;/ęTb5 p\ì'jV\V0=(?P(hIˊ5)pRkyɻcL\Fգ.= NW(IENDB`traverso-0.49.4/resources/images/icons/document-save.svgz000644 001750 001750 00000161235 11163362147 024052 0ustar00remonremon000000 000000 ]mO$ɑ_/R/cKN,CXub1 @WtVeSY__Wgo `}۷du~y~{xqy_qttzu>9\77߼W߾h_ڋ?mQF7VrR?o|,U՛_g?7oòWo>ۧM '76g~n=ܴz٧-aӦoV'g닛Nv}sq->YBz_|:_tx[Dn>lD6nf V/, #vÄQO7^0>0"GI7J STtQ0>0ɫ$`]0M`jgJ]$8}^ 6p>%%j.ՌхihF>/OWwbDRB͸\0s'FXzaq;Dvc$It(pw_ #z=,FHHn4_#nn'y=WRR>Z+>1Y;=݃wO^HOw Otʀm^*X]5Cs. R(N )t7Ưy|(wH>n+&Rhe{Ϲ?zQ)6f* qȏxፙ \mvq徽7f3'~>wb0%! ,G nӳ\,z߶ 2 NQnro@)lѸ-29]f?ϿZ7Q]vѓZlus;PY صXe}㈡R-4/)GJi2R!x gui]Ve,9}zB"%\ j 3Wx< DN+TۭN`Q:pTAmߦo@y'|sLfLssm݆H-3vt03ҹ0~1X.8 }3mھ=춵oM():S}8ouFZ,NQUҗ]C,[^v(OwT{uZxPqj c,iT8 R,O;|D $YJ !O(s`gKp?;} .TˡL .RrwUfzYeU~+K$5NLY`3`- _ _+JN^9\p VN5%5Zk;;&TơAD*1bpeȀQ'鞑h!'}[(þԔ#U=[O $ ʘ5"fV2p-)`)T5cc͸Zgu۔4{ϊ#Lϓ7q eًd}ٯtk[A\d7^]^PLrBGBaB3T= 2+~frCHH*|Lq>k5R'bOOP ӗ^`L|_@ŋQӏl \Ћ@:bt@MQ nX='W,22x̝gƫ^Đnn# ++(x1a-bV@'^;Nx)sp @1PYvwY'R׽^ýDih?!-cwwށ4‹2(F 31 SYwwYxY'J`%,*NA:ASVDqRǀ"PT\,(iMpA(gHDiM&!YFq&JZ=10&RoL" 0aQ^Q{!$@Mh&ډ)iG J7qTW8 @ꦍj4NDYݴQ6"0M)n⨭^V`M:(DQI+qTpa "ѬU^f;u脗(hpE$fh^iQX7u^l_e,ӵ89*HH$-&*O"PJMٳj #n .@7mhYXF1yUjH+ T e;[I7q kWAZX W o&ъ u5Gf%#ċcR'9Їh I4SlTPYcb{50aa,N3!DŽ#4ĸ8f"/+aaݴZq LnX*=IcY$Y '@&Q@1;xuƪN2< ={eUeUEsjX6DlE#ؽ6& |$jʪ&b+7d hlؘ>Sl&r/mL^A9,ͤ6A" .LLnHJPrhje7qhSp@4fHՊJbcr7qV3hl#,T#K+uhR"F3q^^"&HvꦍkVF1D0tFVy 7Q%LUdJj>"]R5QZqx8Htl7pk{V c@n(^B5`ʼnM: )> A-86{ oc/n#GVH`iC 0<!KՇ #5SNJfCbPHTMrh :TAL ^wC`6؞L|GP3qvorMa*đ0Ze&Dj e/q$fȁQ#Ĕ#Q+g4PaMI/48"e5GNl>ҁԲ:RUlhAfhH7ujWsR@!cok !M+e8Q7ul$m[ '@fMpŨn,e#,6JuBe U6t[G[iXBaD7mV\o .:̠ì6JCuŀN.*nTaanQ[(jȂDQ&*F)cZ5_x@Q8j4[,G:a;qjK K0 \, V7ƆnSۢ6r=8gLfuh]22\s*nn&4( [ `?n⛭uQ g٢]<{z0qJ / û.sg*y27 @4:tХb^Q}E6lf4܅iM64?h.ԷyҿN?sɏ3ͧM/9tL8=;??mڱh[ˋNn>#gtW_̍j2Ό0v]=IXZ9Km{ƪ!{F4Gd֟|`b4Z%Άg waêb@mжb699Ọ3ߞ(Voo:p mxsa'l3ov4oߺe{7Rvޤe(fcΞvQe 0(fczIx(3N=R t]ylKN@к74(-S,R=ڔ1JIマ /5C+.ǰ1j=OhYj:hbj:rg[7l1KE;p>Ҽr"tLZcb8uюGX.Pr n.,nA/uљb8V9l"k Z!5Y7e>, l @?И<5 PE\>eVzM\zZϳmyv+Fcy8f̛)FcHј۴݂Zi5і{>@̎܋i1+BJ3y 1qhqrj8j_[j82&,1C ;9SkkxKCh˽ysd;7XFɘjɄ>5SnZ\]Z8cZDFb!c|hKOh+T4k1 Rܸ7ku75jy y0;4v>l2foEP!yaq~{j4`|'Uyhl>V*oi\5kBڷ;p,ͬwk31Rmf)덼TñCj:۪[7R *5#nN I{y[P!VZ;5[-*g7"b8VENeY 8Z~;ߞQqF$ #f=z%- SQ+"|pcV y9p5b6ҊԪ٨Cge=@?5b+7^HnٸV˷is5j OLO5V~Ⱥ2fuS GhmCOSFڀ],/f#(fc-IQϪb뭆TDލnxx#q7m1Ol|‚dQMǣpUCZ{Ŗu̗Sj:jwgahƛ#J GB Ƕ¡ޝb{ <#DKkli1K i3--X5>b3&:-,|stXD;m,!8tƽmFj8bqv)R[{c_1J8f ߎcS ǀwm=%cP,TroP= 53 H {tL̪݋ 1Ѕ"π_Ro U^x3hә,5S6|aB+ ]DZZ1RaL<j8Vrt۳ 5pЁi>Tñ u\nnVm| lXZ-9eh}6q1Qlv혃*[Mڐe rak2JL^`i.9[-1oIO5!Ց&&^;pDe!L>5mwnj8bbؕoÒ;;b8Ҙxn9Ufhu_yܛj8ZOΉzt 5G>͹35W~65h#s{*j8.뢲ޕEψ+}ߤTCժaEϿRE꜇X_WbKqVͮV`HxZ/0/L>b8ZI"<5mvmC GmasHgcYoT}IwΦieG5&Rqfh ՋeKpZˢ-{b4CmxŽ[ i88˝&RLq˵;b6Ngcu?^މ%6X컕1 e3ov9j8o2j8֕}n=j8fuxmZB ,|6~;j8jML-H5SkXgd=n;yWNXZKaƚPJظw^tލ]8b4jvxUnU(U΂7vƪRaylh=[yN7i 'z[c<{ޮtlJ ZFmӸ7c'Gh^EMZtĦ^V89r̻m􎡚*֘waI1Gk9lzކjn&ޤuW8XlՐDCYUq(Vұ䮚Nwcfb#mWvPqӪxuQqh֬} &l\퍋%sj4^$)x%4{gm1R?X޾;CxZv;`j6TGYiڗ效]5łh*9#/6vRLGU3gZIKۋ7̮ 1ץ}-UԔ%uZ1E\GκTǚo+󝔋Zqk7aӵZ:k=&]zQL j6yV魆ch5:{s;7Nߥ!U-QۻU1=˩fcjŗMMLwј%9ΗglfcBƴ$޶1K\x6SS1)'4o۶E5K*: :R G1ڲ{svQӱ ηi5kҗxCTñ(uZǶI4lP|X`%e#{zWF)Zvb.gA5[.536dl^x#-pшS=C{p$j6. Q g# 6ȱpĻܸn1b{F`pڂۇsOq} :KF Z?qlTq㔵MZ{Fey{6@8TKB0h\]hxVȌUq==GXb8.>,ĩ(B[6oUj8Zwa婆 mt=PFvKps9O|3'U]jQ,}i{ЅS!{0餘,|pKTÑj8ⷫ{6p*4X8޹EmHJ[dۈ8硄cEc\U1K17ohIp<k_j׉xb~ Xb^c#RӚ=ojj6FIH,P1 _b=uC5b+s&#ƈxedX)aq1o 1.wn1j6ж/ 1f-!ޞmf~KlFkys5j4q17ԖV nFqZ/i[|ͨٸZ%nH8_Gz#oz93j8ZEMYyC SۗЙQgC Gڄys녻ݎUrvѼS} |,Wb8+-Iab1awxM ֪˴7kNAڴ}5B GО"L5I^绰=-!McߕrhV-7VwТb9d9dH Zuu2Kܰ@`ɨ5?6ƚ5b3Wx j9cxn1(MKTYS1Cl&a9W0ߦJ6ă';KLDŽTWY2v<5S_:oh=ãI1w/6 @?vt=hI_; NXZWkRQ+ώvTӱr cMV3BL[XlxE@vv ѳ|t<}8p汭٬wnS55Om!޵!tdH,D}9Yoܘ[j:bLl^H~䴚4^]9tkaܷqKl;!.k_z<Z:;kuqi}h;R:;V['Z:ю1$t #0gFPLGYZZph7Uwj:Z`Uev1chYKe8]ݏnnCλ8ϖ1*1Wɇ5bf8ݣcZ/Źt wi{b: ўmP1(U&8c5ل>y cj]2{L9ia؋zvѩcXIӳ޶UpL}:nJ 5K-*fb޵11j8Vo b:ʄĽUmyXR>ˆ}rV Ǣq'_ZSC&VñKzzGr]džZ S]XB ^^晤bykn)sPvq 1>ȫ7]NB Gu_xKtǩq+޺y6C GP^iځb Ө{qԖ&lr`tHrgrt ZFE0m8j xvl!jVr_ j_# ^5WnAƗK1h"lSQ+x7|(UBLܢ&,'f㩭cR_E#5o |e:|p<Ի4,r֜dz,h8p\(GP֭ZgR GjCscmRMGJ{]1,b:Zcfa,K阮~o6X1łf[hjR}1h6ʼnGZ{Z<7ZV!chц-,髦Vm2\&t *-:1bh70VT1Cgbc=wcrbpLGZX{=[4opꋽaJ{{GkozX!v췹/-j6V)8:;Qñ}ruXZ-9cMtsۚRñ(uvY6IB *gs~CĈ5HcGcXUa~]ũ+w9i 1[ҞDzKf#Bl#oL5P̛0`ؠ#7kw{j:b*F r1pb:N}h'/! 㧦u3xPq vzeIR:† whE^M5W*!qKlPeE?{j:.vWt1㮔my,I{uԛ]ܻՐ7c3J^{>d벞H5{ϓMؔѭ͇6RLGϫ,xUojtD->ZBMGH]^uc;b:j ^o`#(9[E5GJ[czW' mo6wp %'v8wj8*5'|f)1G!監3Mb ~6UqK#a,ҫV Džؾp>Ҫ-5wfx;V;Rln1ޖEb:^ 5=vox%ְZoyj:u_eh>]W7tU[ՎxhKtʤ1#ߔ4+td0M;_={-85#.{3=.#n ![T9V GMBñ=V;r!cJqtq tlqJLuǴYj:S-soΪnp>ԪR=|6Q1kr=1Fi(2ߘ1(cȈې1Cl:ߜt`*#,;1P1!)pCٍ'RMǔ[3܈٘Z%4~]"|l,-hj6VWo|vl,;@XZ9k76,ofcihφ1"tԚ0f_ZTCZylg(1[D0ϙ{PQ,6sgY5bUz%cf[j8B# /܍(5!u7߫ror85GkfNALZmŻ|W1Rڲ18fZXzW zoKSVñr<~Rñnx,[ Z*4QQ,mnaHlyָ7aZvI^V н|Vӧckuu~9=b86qHpe6`3\@ G ]b8bS0fpVGN[]y< 2pug>Q񎶞W!TѱQi!hmD[ˊ۷a;zV;lFLY/mϭ}iSq(PYޏe8=7~}qKe"bmň *;7Z ]>Ub8.pݡ5 IO9/V"N +ѽBu{]5Hg;֭2X"m;Wj:^ =6Qke&ƣKMGXvo` H*-mXwcK1Jǵmy-t$BݜY5ClU۞Hj85a/s5:r/mZ V:/X`Xoʎ?-ǵ^dK,۴bՒuoI1C+Ȅ62,tJ,2hAdyGRMԪ-(.cXYhb꺩cB,Xb850mǵǪ(IvǶvb[_pQkie獚Iو6J R[Vd۲EDE)ǰ>6<ᨕHn$cЮҽp۸w>m1\1[#m"%ckgQf QӱLbx8uKEwi5Qb&|}6 H9zl1sZ5ڵ>!j8BkIbDzY5Gm'ZoڸuX1Զ&Y׮ 5Gokȷm5GHl۵&GLǡجGoiM6SM OYX1qo)1hӍ1;iI?/5wf97k^j8mcx}v{b6^xTqCsl+:UraX,5UǢv-##J(YoQMGHU-7a*DZ(1: bжPqBIGҦzd8Z~o҂@^xsѥHUEU wѭPlIeϺ/SM 0q>kXM@M-)ڷB鸐ґV鱯2Qb:jMІ۴c^:j:V?âQBlʲ b:^{mEcXGonj:Jx][s)i]ܯ|Vӑ!uE硭#K0yr/zܻ#ڟUݢt-0x 5Iw49fԞOkaQ~Vj8kU\۴]4siȉ-Okz(Fsbf#tBdo>[1xhQ1 )[䛵ۡbίH1':5 t ?y aj:f9f 籭1ˮ}]6ZMG4`Қj:&Znԛb8VHHC}BPñJ usoprakU&]mCh7itvU:VpPFH_)a|}^iH ǒۯiQp c}|Wު%wdzqVLǀmӳxtKݛϪ=5b&~]M阡.h]}j8v:vPUe.Ɯb8V?_/z3=ij8VEgpmyUb\w9:Q~ò qX+[;RƢN̈́pZ޴e.pR&@G?M͎Ug]"XqJ3ht[7i^ RMYva:1G뉶ͿKZqy拎0 O*mD p\XT>*Jٸ5E˱xYmV]wbe(>;%S؋wLA PjweDR G0Zycn5Rn7yy#ce{.=OMǠXv_ncX—Oƻ5fRF!oh[j4Vo쭷c]@\ʼissb4&9ڒs8Qz/orcl,f߅TŊ(6E{N4ӱVMh6rk3t,~o caN#JMG0h[ǰI5bj6,lkN/cYVݬMH zqRj鄞1vflD %`^5 fܽ) #i 1ȇbRQk`>{np1 7b̽ ;pI5gp\Zǽ^[zpuhwc17%ƹxt+nF{nގkq!Ҫ* q"L.0{Wj5|Lp;9F[N~e,R ǓsV۰䜚bQI<Ŏu>W:^EfȐұmg/<*NY.BLGBsEeVCSӑRվx̱zGGjU{bv`{GZ 9|(F.USe`2K p aE^1h 79n37b8S}.,':r"}e3- %ڛa>>m1ew}.d e9oh{Swj2j%"v+ߝ;j421} ڨ1qŠ>X6Q1V_5clIba;1+֎'P0/X%{1oҼ/t,r_釴 TӱL`>7.{.RMǢm[˜VӱBL0֬Qk6iSx[RӱvmY珹; aPcp oȉ꿄"YRL>79."zgGXz\0#:oh P Mp\5Aل*>9kvpĉ]D.^+F؟b2ߌMTת8%up\&-#7NƁb}XWt(7E Meδ|9F擝PZ 946x3b:R#l=^ՖH=#)s kQ Gj0qK۱Aql\4rǛ5VvlkqrzMX@ٸZ~^x{pܓ0qCk' Xs]MeOL{9bsx6S!Q]^ϲ.5O~lFl]٘J6,qUޭecV`fUzV٘Gs ׫֣[!ec W?uaI13/C9Ck;!o<72lmUXuMS j<״ N5Z{lx1C ǴaY#cj:fed̻BMDŽgAx(1bsBSY)U+,7^uXZ/i9-r%fcXe&_wFci^U1SҊ) ۳hz(6A +俛UC2v>3ll37ive_oӖɒ:/wcHhl3&:š%F#nQPFhDy!^3v}&lV/Θ_]=4lVZOz1S K%.}#@ߴ%qj8j}H˾Qq(c^=<]\Hja{sơOH%4.:Ãb:J:^qXj:R~ңrnnUj&c;/1Wk}X3_fRyg仰ގPq!i[ ǥѱ͋mÄzVG7tyjs/N +5W}vV cX1"i]=j:ņ7wt]Zߒj:U7nh1KmcbX %c9źU)c)阴e,5K*rXFciudZ%Fciccie>>j:֩_~6s5E\8`KPñqp>xTñ=s- b66qxo9wͪZ84z>ahTo8a7Qb4Rhs&l@V{o%;F#Dc!,fOFhm/IdǠqb/ϼY|L{nJ+bhmTX1f1{*v߮b62ZxP 5ՋF20CFBnj'N Gj-6`/ZҦ0IḡcU jώMf/WMU[LWUg^j:.t@w-tbFƆ؃v=2S֪e}&,ݧfc؝*'ޔT^Ą6c=8Gޙ-DZh][Ǣ+5M'$z!شn˴n^Xͬ+_.H*Zj+d8W68C+fCQfQeMFܵB+H6r\VY]mJ6:&mC ͦ6utZ6O؂ nu89˜|̚J+_uQ*#;|^jޔ(_².A62֮)&hMKXlQ%-ܖuY,Q6ՈmhU wBTy646O/>cظk&{[)%Ru%W;yuG7e.5F=<ѽ't(UѺMl0ԢiǼ,qj^^ڔΣF3BІ5uS]VbʹZXƔUɰi.څ\AY )Z"A<>Ș;k'epĶQc.#=a rշq(mcbYHUuɦv-c*5ۆ& :rImp4]"54hgKs l#9 m^Uj湍VB5h zf2iCѷy]DUqy"sW Pd el\}S4Sh[Fel4Uphg68*s PL,cT圭C& gYr֡1l]"ehmyK<Ũ'9f7(# e`̶ t+}pt h3X˫T),6V[rX:;t-*NRa--E 2ef,1}YKSUnծ\IJW]+qWY(wx%X\ex:xZQX,:}hteu^؆e UA鲍YӠTUX,TF^8[2bedl_UU<ކƶLVa,\kUͰ(I Yػf ueJ ll pZ8emTemFFO68ήY<X p`K9]֭6` EHG[UzKv]XmgKu5qm,c&D}bh ZبX5G։h6߆FubJgI)el]8S6Fѽ 2ϪF(h=æ nhX٢-"qWYW'A9`Gj42:.Q6:lɍѡRFGǺȤ0rmtZ6QsLy6:,U3slcݠ")Ml֎mC5i/,HqTV6884!XZ1 Qf5MƔ.c욶WV°68BoTrJg辉UlKQ(;Ա2WM#Ժ#jٞ=dQ˴oc#v-qj h-Cc*4= pކ]gybT26@Re`ܵ{֛Nj]g!8UUL64. 5hJp&гVnC5"Ҹ,bc/ek-˂MzQ+նcI-\x%O+a8b5V/O|_v/jl^|;ͻW/j{pΝD.|yqs}}yq_?~v|3\=]||BM-[ *}{P:%5x}]{RX1^n_N>>}8z͟._yw٧ۺ-NЗo~{?\;<;]~^x{ǃR޼yLV|9<煽ϫױl5PyHhUG[:؃kt[5OvT[UNfKճw'@BgM7=90V}8T<24OΗ(@is8g`T =|r{ő'd3GTҺ|bD(LXG 5)#s; wX^RPf,RB=:txZ RCޅ7 |qy937_ͧ/1W>wx00NaxxFc!O_幷hz9RsjdcvL#/[>E#˧ D Gۚ[6ښQp+&yꃥ1kbΜ?{W#d+15 s fŮ̒*KeVÀ$RG2LAjND"ڕ?VByͅ۴jObu-@?_ zcD'~6`KmM!Z EOS|U0ɍ$?}~UwNko@Kfԉ&m uՈ 8, |P=? "1O*;*Kmjo8ER%^1/XI窪mޒsͨ;jsZw#fX|iqoHA,%[\z =ZAь(= Hœ7 NC>xarɔOt(!)ED$ݚ>Zgލ~>n4v|E&f(x.V侳"( laf/;V<ջXL\bQD 侀t2B@51M94D?QNZ~"*07st:43}ACc_FAv &cG?nNJ:!'vh{[%՜6 buxW̪"},9DLwW(XP$TT K5PƳbovZ]"K '/sfʓ 6l2xrEȼ%>8UC-B ;wz֏Hb;%g Id:Z"h:+!XVKsCiKb,'hIO'O>xVΟ.>~ %?\ʛjio`c0FN}+%˛ Xh2@%^䷓+퓗N^?vNŭ5.r*n-pChOVvWwo?ߑ y3+JoߡE0% rWf]joS7GH함 ݗ6= osrUFHil{4ZӲ"b樖ATjtZ ! rY&]1g/2bU?}cdsJ~ԫys]ӛ,NO`'bDN\~Lg"_~>1aPF@d/֫Z0ZL/Te O?=b={!0O#M#JaLj/{ͮfSM, y*p6Uy7*' JpŊ!@L@? f+qY8|*Q\7.? $]ϵ%R)k^tDLF>%y-M,wKs $eW2Ï' )4EcF.J|\$Vlhkeq @-5vl"lSnp+Z)k3 SX4qWZhw@iٵov'$_-NQ db(H}jjYRL7L]1+gnY3~o6,Xwg,.m:)R-P'f$o#ѝZ/j1Hz8bǀK̘p zپ|z%u茌AsYEwb\0%S%gnn}:y>Z8Q8X~XGCxT ;mF'8Jv3BLy!y._{ 5pqt;r&g`bhI3BΐnEb>+w\Ŵu7S/d7Rlv3TMʎRQ12fpt&9&SgVbQ?AY#d>A>ܙ$X5eVNŞrF  o*F " $:7"#1 ]:OSMp7mv_ލS*ƲuC:#֙S >"0DB:\=Xzh-of߬jD>1ƻN"b^<;v ߔ;ܘB~vl!{~ IbQVhaggØ LbS3b{\0bCBev4[M`҈XrfN`;{c.]߾mqv ̚,>D1t` PC400t1<KkȘzSEt~AKXc2C0]Bʸ ]rp)֊t6+a+FPIRy$.c5ײ<D!\|P#c6:RATfh B(tHXt / Q-4?CgR6 NI0 0)-a1c#t<2I< nCXacut[J]<<Lqf:U8h;' \WIZUź@@L_&D#"5%"($GokF"qCLӯ?>\P+usa Xq+Ջॸl6۷9 h|'9 z2{L M="A,HyzyB2SЁ}X6au!ȳ!~S#)|O }wnS6"k6$ 9xv%E˼UB |+I[qy&GD疄JrJari!KT|d1 O bCF03.&a,@lS5$Gic> Q.P:  :9YeCp: UJk3236Z TqQXTO׺ٱ.puyDHXNnzKqbCorb[hfNs<s]6痓ƉnNJsNu{\QUT PHL_YBJ^Axpīp`eK )K저0k~E%䀰݊9pSQ&#5 KAlS<vLE#Фغ$䘌:$x7>H!i tFAQ <-zA1^٨B.]jqLFȀ=W ID;8c.p F$}!IUZw2"pQ$`{H8i@P5F봮dJa@pX^Y☌r ȀfEMtj .ȈivEeZ5Xt91"# ju*(r`{QK0r!hd+sQvP&2200P{Hc:Fr T=d[Cq z u uQ%k(Pr`;88!@yiP]d:;(PvG?j Ij#Ai #ҵ́HгL~L8eQI.CQ Ԯ*9ݤ=e< 4Et_)] d<Q  \=p] +ԻJC`&lrkIPi"m`DI]^z)#ZrsP;88BV-Q;|2֡]o'WgtI=$u),. CzQV1 Ig+!_8qutXT}P;88. $KFA;88WVP~fR=^9GKgA0$Pfzs$P.עuIPI͸AǁpGXv Cr ;88ӁiѬrr`{¡`o%;*H K쇄q2ͥ 5LP{H84[Pꬖ-nve?4E @vppH=b47jl}lL`j^`WCPn&X8x@=$ƗjC-ݹ+X{#4XE@p> ;ܲv%p"WV*ޥvPp(= 2=Yr@u"lZ1Fp8!^od`aJ2r)^wI` 2:3+K!ЯQBb:û$70[m3p8b$pt48V+ª*7~в Cf]lXIzlZ7$$ZtIЯ7K'ulA]j !j,]`;@VZhv9ᕏpg6%KS>~q+e{Nv)G!`o"98P{H8S%֐(Ai 19a DK‹rC[Q1˔<98~ig4չluj?]98~iˁ;F@@mcyɈWiiWA{88sXZv9=֏RӉ$pj:p)ǡ_oW꼸GB7EUij!KrEqq] `r {88덓Rܒ`%]l $`dGPĪ. ;vw p)*:5rP;88ʹH [Ds.E;88+WŃRǑ13&<,|Хy!Ҭ?e.Үʜ#X@# *#T lG}-^l6#-Ah0 瑁,3Q%s`<8=A( n5GP'0ό5B 3د i_IE, 엯(TG`p{bҶzlUYN(5&@7&Bm ~UW^Ib ؏vi"K\de9=>9Tk _?`!E1QE,Ā́&[A'DA~e6M$U`Ewq bOBy~Me6r*mi\#X0kڣ+X{MSB ǹ9t 61} ׏"W)!9G"hN$>BXɾ OC*̠ eE3D7"wui (36?SudI z'M@A z|B2 Bl \ Q7S Ua7\U`W[qUF{(C!-/*Ȃa_0 R3GL9ڈJ톀Jj3@8v}D(NBm ~ *n*UXB"ZH@G,T ؂GfA:3M&ߚBd.hi#@8=BPN!Tb''^%ma:|+PVP 0b62׏Bk4БA,!FFT>2ؤ-!U44Q&d$۱A6Na'A -0" PZWHj_+( j Ps e==Vn !lB&Y"(,(àE*h1ps+D'xT׏:#*#oӗ1FP"(Q&o| L VQ>B S)J^$#Z$  X}΁N x7ND`pzV,E (12؄~1_Ć#M$ߞ˾2,GBm ~tfjq3FEYr~ <-!U#E(Ǘ2*G>F`p<˴zIq 6G D_wZ@h3M*rׂ,-F<҂AGBP* D>F(#[08}UX+C㘏A,~\Hs kDP88{BeYh~JM&QaXۈ>B ׏TկΚ5BXr~'y ׏ &F j#мв"_? \ąQ dg@m{X6N`O\H%`xzLj=R8Z08} RUMeM ~g@G}mXGTCriTA85Gp5ȒAP9T@8oG$Q]UIS؏V=Z@@~gg'Zi#[08=1(MGkk)0ٵF@3دSB|ji4=3FV[FzXd1BXIJ)9D2㑁-~4+;YXgA,~DE92؄~{Y3lJ! S؏Gh`#>sI 0cHe=hJAĄF`pQUp@#Ԃ :+ @HG驤ne!lRNa'E[%Gi;%-av QhT>23د_#JF]@pzBPYڶRĈ`~QlTӲ|`'3-OBl Q@*@8GLQྩH]F]H %MARkdxTׯQ-2FPeBqb!W= 6`?ӬJ ,bLE$HI.L#E,ǂ &Bx lCVGNCBlR9_?J!GviB^e>TS+(2>Np  s5p2>z֤hdxX<3)nΪ9SY(, [|0yj b ciWXdbA-Կ'M/6yp1ChF" 6L'7,N6t`g7% $,BN`O <;+UqFP 'QmCVhkCm*r%blBO_?شQlIBB 6 _?QQz*2͉He>}X6+iAES%F;9w=1Hk#M$GSsT؉6B #HNFp-Pxp1R,"M,RY^O 4FYX1.[F`zѩB QFap6 `F,hbo/o<\n;YA(@X ]ξsBTאi-J ^?~*I Vkh &kʈwbaS9b3zY A$kvT^/RA~Dr_amkp6kAʸ%!I"ӨKVL'^¥!@Xw}J0Z}xJ ?GW([^;4U!r~x41+T 2rP_ VĐANEF|BjSЀza5vuD-"- (a5bqEeSh#)gy$IH l>v?)KG8 HA O $_~\!A( ǒо.a-Ndߛd[42׏oQQUNzy:d0Ie^K/M+&a: ka,Ѹ x"fa˲H.yb  l+݋L!0X {Zd @X j~j$ucz][OR3Lg|#i+O|z` 7ۮ8 >y`WdRqB3!I*ǬM/Q3_ܮ^e!"I!'a?Z\ވlFA,*;Zp]¸Cx` 6b~E*" ʾ2ȣ^d$55Ie_ 1w"B U؏yFMT 'a?h{ߓRBhD*l@밲|u,U A,*{H^)!0X !30h>V֖$c6G.al!:ר+R͉Rو'Vb?Ԋ;!A,:G]H9\ 2UPaԐaB25ؐvYLR9Wa?F.|2E5c@X ]!T.QiAj%6< r(aƞ kƢB:r`5<}y0X}ؚfH2kSYM,c aɽ!ޚ" lh+XD=F A*.S'{yD)dZECs<`2_RV`Nc*qiq '_?m;5_LZB Pqusq1rMO !$A  V^?>EZR_ x5b v()eBL׏(f0:A!AN~LsuO B Աо"(u7ajqr+ A* ǿry}$d+ drhI w z`5d@[? Evœ@X }E/[;G@T5$qf(\YB U0tT'+ ! b`?ū~BS&fka"eP5~4:sȉ!I*ȻN+,!@XQ׸RS!'a?ivHr† H_рH[-,ɐ]9`?F'pX5:AX=2r†4Iu2!@X !{d.is3*rE 8"Z~uyhvBT5؏Qߝ~2M 0XUm/xc0Z ρA,%AO ~,Whk UI[Br[(1d+~mh2 r`}""1I* lA2}^ӫAP@X2Nuu#JhUfɛ^ ZZ)+D<숁GֵQC4"׏'.֦@>Bi/kT⃐14X/{!GU^j! y c5I| *ʂ t`6e;(:2׏Z/ԾZYC)!I* 쇸`{C=q?ί>V SxaCXƽ(G,% A,l@w}rl V`#M[G23PI:0I*(ԨTvW F'Va#47MjkA'Vb?"AӯJ#'j 1FR^Y`ʶ!0?Y׌]  .K`G21 e[UkK+a k`;1a$QkcXU؈A&>YY# `?\K,$F P^oE,$} 6Un;n l@8g M!B~= B82rc<,A( oOlÇr%.0Â$,]2\08=LW󴲾xW(nN3nu8r0G'00fk0jAsϰRp2ؤ+ p usi!aK 3^M/ 9c\5T"v{q*hY"@C2q8H@n!X,h& _ )T,wEpk!l"9O`y$GaH !7`7 = <=cp 2ӂZ-]08}=L⧠AZT8A|jVڢQn tW,ͱ= gI:@!ZO:$eYAH tБ22S큖2؄2:Llo 2֞2n QZFf-@8=2(MZSgX+EHe:!x)fVAxq.6" |8=ĎlBN`8 lo ]Rt0TJ̈e" PoQF IQMJ#`pcgjP 6gۃn LnFb#X|ANaHȭ\!He9=L#*H) 4yaR9!Z`p@ȲNHρnuROYd azf!7`[MIslO/bYO`UQQ xu@f]<<*.n₌-M*aܦ&[ !7N`)^;"p pSKQFBXIJ24Ӗ.>R4 Di,^u_X&M >6e5;;*O+1g 7aO%L*TV!"Na/hYk\4eH8=$(ZG  N`vVn`q{ ƟiB Sg([ap c $@疄BXrJcwj 6SYڕ1@\08=`Qiq &u♤GӑB I[w3m>Mu+YePN8=Mtx& K Xˀ N_ê^n,A-a( &p̹VG !7`]iHۃTrП5fl-^ 8{=\ҐD9 t`+9 6L[ܡd AS@081|!Y$ZP:Y,MAe g CBN՘eg'[fmz"F`|z'䉤Z7_O&VNܲ';OK7` Ap#DE ,@!(_  ^O+K6,[A*Kbx  {GPnFnaeɻjr`zE O-zH ^oiN͆!?E gunJeh`zv8?R@7_y/BJW2#r % ߒlÃ/R_ QUX;h gH:;8e '#|ev@7qpz PriKSq@j!l2^*.Yxh !7N_OX r~zxIc(We3#Ri`b g;# bz߱}}/6dhj:( }}Pj-I$׺Gyh!`aCQ~BOnB"S\B}o :Qk;Q 0`c| Ͱ8%̨& mC" u׏k)4µeY8*2 V]S>IvI Zs1:jwli@ V\?拜E ~hԮL{'Rk?SqD0qy.g2S kۃPlu![:`1Ev1#Y"ucziJ$yu{ B4wj``]_vA@-9J׳"-A$˺1"59׏<(kSQ2w&ԪEI~|&"랴sgA'_ 򫲂E-0X}18Ty1Pj! BY^Ǒy_[T r`=oQ- ~ ;VOqK1C`LuWӬS+DA@u^ kx 'V_?('Q-A*GO-Gs;⧐WϬ9kGɾ*(w &k[cDG-B 0L>='_?XvlF}$` ʖ K2A,K)C t`u{h# J2r \.BN ~y HZ0Xpf𗫟pA* G<9Ne-Xy(1bcT!u׏Ɋr|HoL9W^wqu %AZPد/]iHՖOn+e<<,-@XAp>,^v}"$geA ~L@!NYޑM$oE ׭9uKL*^?^&% @[d-:ny/øg+;J-|ځr`u@dF})D@X{x8 B'̫ b~Wtau "}'5 RW_?+KAnAZSCZ0Xy1=%KѤjCY&,k;Y8OZ:%+`LG+=:vB CIJh\ #0`5%uo!K`%q'kB-I*B1튅gk;G#,rK%BN (lr1nIcR m*'|"-z:`c=a*ȹP-I&GcdkbYh! ~V=!-L~ ]#.}& }u@5pbiǚ|OA2EWmL@Dk`ɾљ BB/L:Pzp)a c* nW 2׏gL= r`u{?y@'EI~a39 GczK2Ɇbb?=T)>3 V6,9BE ~Md~%i ,xzRNpvhB#Y08{PN!IՈ`ɂg U(}aGapmGX|fcj!n0e"~&KUtȂGxRpߐelc)z5 6L'$n60SFpz NۮL'L |U[^5BX28;{eg-q(bw}Am#̩}) Mdr_nL,ȆGͦ _EA,n\G`puW~JY ^O i6dnBY_ gp בl~T0ʚ! "V;Zg6BX~00 N N_ K"|4xT#hXi#M* !GP m ~72/~#1Gp @n.-uP7f!"`?վQ\l` yI ay{TF@N̠ _?++! Ac*-A(Sy dhƌP׏>) jv%#@8=A4CbH:(q+jN5pt^.&,~kVƜ_׏4/*b cOV{ͣj_-/#DH1 ¢W ƾDdB<2؏6)5"#ף."o92؄2~CP-BHp ! 1լ-+'6 `O +O DJFHد.Ļ`|N)r ϑA,0;a#M(1дwJ 6`*ќFp {F&BXIJ~\E쥄223wAVDzLv+-~ls[j#Se#M()3RD!9Q&QڏS!,RNaO ک" ҂쉁8PEp{RȂ BoݦXP6'<0 n+b ( Rw86NaNi hOm~F!4sd ''V.r, miF 6',?e#@88Aƭ9yഁp q[YQ !{@pQe#E(4U.i w#X08} j2$rhAZL&4AІ1L,iA6N_OUQ:/auzd`?ьxD ' GedP KQ$|P1H2L2B ׏=YC>Aq<2<}J˦#DzW~1Ҍ]LPIU<ŴS׏"3hȮ#/B/&8 VmHjG#E, GKZ/G#-~,h:y6#,08RLDf&c֎ )?JFp{PF+UXg$AEi@P؏PH#L`pL}70 Q"Frzvd ͋GTc*GDp AԆ 쑁WHu!,9A`@8h_NVq D8lCGTׯb5DԶj42!09#M* &DHD;KA5 #5v>gap{Le(7j.dAb#E*RTa5y*Z<2؏3~U(' jEN7l'/9dgBk g=:Ժ2DP[@S؏ⅽ@Rce?8}/pԂ'dR7E<10Z08H3쥙12M ~<QF`4!lR9Na?,*m&G bc9MUFXS؏H  51pZ08=1`0X4'˂ATS;X^3M*)W V]d(:B s+p!BP@KU!IwGzD42(08=1 2.NF4B 3أ2R 'js)83Xd2cL$A 葂Yؐ1SzyGՉeԥ_"d5`x*a@97&׏C%vw`W@&V^?g i-@׭fuʪR[Lc$MP j`r+aߦ$$~ d?+ >Nne-I*/!{L6 b`k)HH,k;G3=Ghǀ1`_~U$Z2`q$Bp&k[r\wǠ?ba᱒~y)eP JpGT l낣qEI@V_E~L> O(I2(붻%R)7g`ɶqpk>SbB #k/PVL ~Пr HX10Vʻq/C`˾QC K_ b`u|L~-_V·I*뇮TN!aHߧ ؏L9,0XpFUJI? cw )2׏KWY!Z5`\Yq)Ww |ʱ}ɱBݫ8-@XBb[`gtu!z}˹ ȰW0" 4j!0`cz02I kBCr~*] ͎ba#+9ɦ-A,AMُ֙"$ V`?VzeZ2`HVe`Ak;'ZB U؏UD)rqH&aw\eSRHAGr4Z2`q>Щ>:pg`g؏b.v, &5د(BL-0XJ#;%yB&ac'D{T*SۇARE`ʼa2؏j5$yT% S)|Ogq d`u@Yuї0dY}ݚ:&Frȅ]Z1`QKc)A 0e,xɲe$v,<`@X{B UTZ6Tz(PkDcq" ɢEP+ewPuWi$V^?3$[Pm(uؚ baaIf a˶})Hr(V_?n}P\"׏~ z"ݭZLm&QWkZ@B ׯZE5B ؏M:$~u RW`?> ᖁ ~m!Gg,!-AM9^wz(;`fՖ$cV(UJHσ@X323E.1pLnCO ANQp DX18v{`ʹElj5.ƒ2׏y5ۅ3 &k;iRPqPL ~L!꥙Pm!쇷\FD kci">+̹eLlyYiˠ ^w ~ iu rʵ|\! 7rר8Ue0*'%s2/aS9iu@vheP[|ԃjq:׏ KX d[y'\eBPaXv5T b` k";j,-A*ccB<1(€W4΋Z2@C8B{D]-I$Qea7 Qh!Dž\LR-0X1:0;ؼA&@,HEE +;N'PΓ23rd L2Y^w:V C ׏ׇQzt [Ya~TQ-$ǐl~<)(Y  ]2ʾC![L֕׏J\+"뇶#UDdauK"@0?Zn-A,G||I" b`u䤲"ePfK zm p:Ie[Bcl"w hXH A&`?vWxTNj!~;}!ǭ[X5؏9巌' 2؏(Rc0`mTcD=B1竒cRBr~DPOl+e:O@ a˱oT$l#1` e 'L.sGJI25bk`ZY`ʹ S֧!(o!:쇺EދY-@X.bG"rxkXE kT#m#Je2ԕkCwP{`ʵ~<9o_B=@X݆r4qܡ*hC91wW,CZ2U؏Ov12,n v0W-GXe+[~@lt<9H5-}͝[ U؏}Ji!:Ys&DG aX^hDĞ-0XƲCD7}ˠ2-:Br;r/MRk_G*.lKT A&aw 5nC[6+[ǜ]F y"5 j`Dը!1 `wG!@ bClm'qPFl cAD #O&cKx?omN"׏ߢi92XTc&k+=YyDd;}=2@P O&HjVrU{ZAj9AP@8=BHD`b,ZM H~סx bଔ\idIe?=Ab,oMS  PNFxM6NaO>ȘRGX3دMJ'd _oe>(ˈ6#c$ EfQĚ&L*;Gdk`ܤ e` yɥC0ayeĮjc)VoM 1 ^?DGc&#SsR#M&  wBl ~hzRrBbX:BXr~tW$zZہ]53HZ08{ؿ\ZB+|d ''`ENTZ'G&+bAPHJ@uBm ~=ظ1ߩ'(Z3@ _O @A<gtAJJ93؄2~ c74Gp{J @c8"}鬅W b IE͑&R> Ic 1 ov6B  @6!XV,''B`\G@pe-ZMYXbdP gG[as* 1|BL׏a`Cjq#08{~JC=xd_&H#E(둁̌Z08{=Bu{x-~4z >3M ~tvT.#M*G kJBl ~E+sd,#E, A: &G;1ݩ҂.#4k-nB#Y08}=֔ m lR_?;!d* !6`?q?JZƅB].X"헁{@ Na@#=*g'@mD3YcdI8:SĜn2Fjc~ 0N'.}6J dGdޞd>3Xr~z1hF52cϣ*[}d }p 1SPRԈ@6` Oe"@"lXi52ף2B@iT N_?vr[P<3M&1]z!'(k 'XMHF¢Lx{P՛\Sge؏*BiS<#WPkEe'd ^O T;)@V12M~<D2 ir6L'7}JT@lBfW%$`tzBP "RȀ ]4vQe$-ȂG5Iϋ+G@8y=B``~=@|dP'ci>(N -2]?iqSdY23Sׯ"DSHf#?9sjv$~a_FL3׏gU;Ȇi#@8w$[RmRFL'_'4SI0 ,Ch?F^l#E(뇹6dk]#X 8u=!B"Q42d* 00(O6^?̳\h _WAL?0 UFTVJK5Ăljb8..62QhL1uvqjد&dcfd¾ c笗 )#E,쉁0hQZ,#Z 8="@rT$bwj`plgqJFɃc(dQ5a!lB9`OBC>*FphJ4*9vE91pZ08Z'./zf@ N` ȃ>FRi#M*Q 6_f#@8He-k_̉P_EMEjԧ<=1gȴd$ 篟+P\%MV:U 6\'"Hm^_9kPgGq@V<:C!i_mAp1/.aAx{| $PiM eĂ| j(7,fs ,Rc믧Hat芢 3]Q*@f:B S#7!ÓfX3c$(SmLL423PW&CXȠ _?. U;f=ܤ24 MS5Ȇ)R>"h"4B>hrͨ~2YFTS؏;4 (,F`pPU4Kyn($n3 r,uT.!lBY`O(iF\n#@8Qg4yHe9=l2kKL'ӂ ǐ&!MD7ȂAes#M* 9F@8ޙ[KP0#bc%|\"hJ:/nX>B S؏>0ȀPhYIJCV1te,~m"'֟u:62XC`We1`vg(ԝ 6Na?>ʵ7pq>G{Ap{FAk#E*1 JR{1I b1 fYx6g ,?. T42@84Fl Þ h l\#E,)챰ދh$ ǧ@ 5ۊ"VA-~zEW V&!!KA6N`?J%(sN<=A`U.he5BXrT;P#Z08_)R h  ͭ" d'ɀ}6\'_ѾŴ(d! &GW"cQs6m<1HZ08a&,$3F`p0i1,RYÞi۝6B S؏_ejMrPiL"֞dOB=Oa?.sq[4HU:23؏^(ֿYcd`g@'G I*J$#M*AS6^#@8h4R~E1yJeE@8ظmd G} #%GXS؏\op  `?^8 lROa V#M6a?V2շ\FfZ#@8=A D>BXIJQ!Y4Ă) A/dAԂGg9oRYNa?z0U?@r ɜHcXl@Oa?G=Q#E& )0bS7W͑A-~TҨЂAKNl[& Ĭ.`Ć Ǭ,c4%!,R_O Z!Ǭlb`p"o dhâ1 1{0؄~22'q bĀ PTDReP4 E>y`T &AВrf g=? ,1Gr!/UOlB9_?ZٷL6B aoJ2Bp@8=A`Bk H8=1".A:2XrQ@xp,U5"׏=(юו 6grX-W Gc B*'iX#@8=}kQl#E* Gi_Z*G$ b͈ JԂL71rujpJ A6`?FBUe3أ I ?:B{(+ 4ZAS@#3,iCQ%22(Z08}=2PHq~ڊF ׏~B'HeIe:h0)9B S؏ a#E,Ag"%CZ 8="p(~%'J$F`p1%[&%R#M( B 2IGp{VѶ qj cb31'e>=2pOr,~z%-Tj9"#׏1Yqi-#M( 쇮TʈYe#@8=A(.b16Naɴ;4$!"`?ZOI+,bYO`O *xOy0c*3x! +S`z5LHF-p ˔ (d˅,z#Kl Xg*G`p1\mcȠ N`?׹ E)51M*Dn^[e cLѿ k` ~a%;,dHe?:"ފ\n<"bB&Kq4$H7ͶEԌxd <8/Rv3i 8XhTlB@Gp !IFP׏r\ N_?C ed g-.R?-12dr~_Nֈ6o2B t(+ҶW4%kP'GM`UmRaX׏ϴ`lJ4IG`pzdP@m@|d(*18ZMfP#t Z6N`?OٳU3&Ig'* Y93E C9,à Dȿ8EB$#X08{=1rC8FL6<=*.Q ؏IMA Gpab L4d̎BNłA0DfW.ԂGשKʮ2SM(VJCdȆGQ6c(X9B>m ̧Pvp"T$bdP g!ٴ2-~g&cel $ISAv&㦯)(x< p5XNfLףvHo%-I2w/v"" _dA[D'2 4 l-@8=\T' STДL,N)XZ`p}C z! E4ZTB" ,4R!7N`w"pK@xjp C<:eaY [Hû(Mfv b-E*뎁mF-_08{=;5NSM( TVt 7 N`3th Ӌ<#{B-E(Y}C9) |@p -\08}=X\~EІ2mB_w_!!LŽ-@8Rj-dD A pET29De9z;{a?,ZXyF}"#FRU00.D\"qJπ7p{8E0Ie=A}Y1p 7NaueE!-d" v@奃Xy/I1\08=L"W2e gʐ?2-ZP3m(cɔ[p |u<(j !7a/Kq_ TE*)V2]̩e gө Dt'; "1 6gTLuT?@8A|Dܗr 7a]YzH3҇nesyX`q{ sE _CC@lpolB9N`+ J%'Du7`KRٿ'|)-@8=,77N"dBXrUذ0th쎁 e:A[`p{ haUfl29_A6R$xv!1zsg¢p=MUPv8=lE&(H`V8f q0Ȫ>7p{7r[T3m"s:+P0[p @ 0vo!,b`'ʁ m* 2wր% 'T)d`tzh;UL@0~ -@8}Fr>Ĥ,+()[pzX? P;e:=Ld Ǣ+0Z`pzxof=?>}=2MsG`ilR_y*q}Bn  #M# n &ȃH8=MK5)F(-E,7I$JU9e*`iq!RMȹӡRŠs m!?@g=E Aa RYoM2H)'y.-\08w1|\g*s@6'O;OYkfx LE0#[`O;LE0 aj!,b6XK]UE NT3)E@pCдT ZS 1PS &$ͩe;&0\/""Z[e&pp?0w2ê}T"Ke 8ᗤߓ#V1k! K >[p{̔uzEv|q{Zߣp4֖/0Ա^.3XTu@{((-M*C@FI-@8A`yX 6w7aO45O%[SE :H]j-r iUWidB avE&$_a`gmh S؃0GcYZpMe{)Rv#l,BO`gSx!ZʒZ" |uP}9rA0R%MF!=M(62}~F)O[apzjW* AZp{nR7'vxr{ q -^08=LVCS3B!n,jzc`NԖ&O ';OS%M'H@8ݞO%"e/" v[ɧ#S&vj,bN`R˿(J_H¸a&:aAq 0k\ Fo D>BX&`+9TaEr0 EhmǍ"/-~AEHR(YPi=!%HuL:]55NH/EIc519n땘,RGӐ[{\$"`W  PE($\Vq Y !Ԇ#!+!UZ#ء5(5V^#v$TBaQِkr +j5 k_3]ep! WկW.s_36qt_B)+(GAft(䘃+Brz=$ | +5#K{ꐄ/(wˍ(xmAT7! sm"T9ٝli׻f2r6!',B۬8d5b [$|3{ιm<\.oi Dly 4l&yFkX| M un006`Ibλsv#VP7prSk`mD4P%Է.;2NwG\>g&C Թ):յ&Ќ:Nt;;`v!!jB<ωu/zw<˪ZgjtZÈ'XA:o!ۀJ#K[ wݢw6Td?MUxT<4PZ"R=\`6C8$ !f(G{"}>Y>g,%wK14y7/}g?ҫKZF_z#Vi M|)!tB=$GY'6NֽۻsȒ=,nW!UE4?S25[\6nhCIS霈D/.}f_|O-м7x1ۗl m SŊְp h b6PjA.".Znq,|o$uk}=4Vļw @ ~w.)I~޾g= t gàU/,[<.K/;\z{m `w@p-0ZǯLl,8D>T`+j /.fB0%zu[>16ͿHػݯ7?<1@51Y݈H59k YLWc;GN~k #b=cM gps` XH!~ib`~?H +r[kps A)&GO b"\7.4c[:'_gl. gxk ^0hxb99 @ܛI;g'tqρSA'' o5O5-Į8=s1eTrnP >Z:q&qa͢C80 ^UO)71`ZƱ0^܂S1K+ogy7nqh[s#d~\CI,ׇ4U{`9Ebf\x1@{388ڲoߴA]8C,E@;PLkϾLS4޾p>B` 8݇97 K2<H`9lR|h ữEje|A0.ahKmITRL J'λ=ߗa. C!0X9lLc+9h ԀxF#USG8=:GK_A˟,"ʛ2 bҵgGt* xJ3 @)!|*o‹vl. O+$A9 F\Q u[ {< 7Leۛj\:<Q9kgC1<>C=^q`@0̰`b0'iOa ֦P2X#fWˡ+5n|AkG>2ԞQӻoGkhoDp߱/aȀA8@>D !TbY  \L4!LV&Z޾*  FЊW7~fhsHP܄Cl'(@Јj`x 80h5A3Hnd9d%/v^DWV@3V?{ү5!( [;o0]F*n]Jx|xo4`)5P~ >%1@ꘀ@2aBrpΆ8BT0!ʨmdiNSG}艐m-DM㛐x]k8lɅMC1:IgA<Zb̾ZH͈LHrMu&mt|?rnTyk&Wg '@CIjFhc}U-坷x}N^}bh.lbK!ZDӑIXdkӓoG"6% A۷AߥGch+PVջ"s8B KMDA8q`SIeRQ#)W-@ZEdGH.tΎK ?#7F+LYkPl 9J (3|Ex D}d"W%~ i~-0Dc[6bVgWp?@M֎XHKE} #UIZA Pr*PL| PЊ=@W z<f9l`Q-`Tks3鬴}[xCFa]ʚ$$jaS+VB8aq? Ut`PP TC@FݚC, |ֆ`%ժʞ֓'/s˩O_8O}eÂr:* `m ESϠuHR"QXj4䑡A?o'IKE7-3JM,]) ^Hk?P[wA)`R5!f2BT %\Q/E`Eu;TSuW׸[8C&K=laSsIM5ԈCWu boh.TmU"(K CC w~t%ޑ״Bg %’_uU&^z~E8&r%BjH?Bo{lۿ -K,٩B ȳ~- ھ%i!{eǃsHNSukޭO뮈uź4Ω/OܴTD!JA P*1ALJ`ʶ Dc$b>9X!Td U4PTzWm;+aɸzPvI<O/?;pGpusU[f) BS[i64*h%8u UXeJGpbje\ QdI5^N^SR}\&8%NP=_EQ'9@)[@|fLL 58SA{bh.ǒyˊF# ,}^ow>ۓ::V6<>AhDB J A2@rO[)鷾mDLdEN!pPH_7NU<[17ϯ% aPƀޱ@y0l"b[t\6/D'%OD)<)BW`gT0xpG?r{]?Om6I$) j2Ne{! W+[fq E]4 PA3?:xN׳=%IFMgWwzVoxދKiJ32,{0`T?d uy$i8rlH,;];&RvI?=SGfZKG5 4f DKvt)xo'&x?c<i#|M}ф ^{89s1of^h)EzTAE =xƽ>`a(bF(a$9'Ϲج# O!7YCi!0(Ad,57Ӊ@T0 Y[]" q_jǵF1nʱe lfM\M01ڠCvbP~@ xD>9'x(љh u=a@!N(aHnj$RbՌ]kL-pJv1mVb-d#E>k3t$*FAim >6D'(qާǖtc}(a*mͥ I#uݼ}H/LS'M!944O'"\ k5 YLp<䅥SI$ɒ'_n7;I~h.Sۛ򴜈Dd4g0" }JgVLR+xz'  QbS&J 8ǭtT ̓tXvEئu/m{pm[r2+Eŀ$ `HZsΕW,mPUZiS@&{y&R& C9(l쟝WwYcM %ߊtmߘCVZq[:(UTuJ]75z8Y/JJ)e&Nc\#@g y:8M8t^-qK$+x~XYn14覆F<҆X^.%ؕ|{JbZPYYahtÆFK8NKz0R܁SX J%#Q_'vl_Mbq) `{{&Ҿg|7MK~/]?VA `$ꦺ܎ݍ4S )zrahX>Ťإv>2NR6uIgq{9^s<蟓hsjR6WCp85iXWJ#,i-(iɆ{m.%$"*"Czxx.D+ 3Di=ހ$`a `**8*[U(z scUm'uM:3TUҮk/ѽcr}JDd-i^@M6l'7u gvgh/^q qU#Y@|y A a⼅`o|d9Cy; =-^ 3_FqC3Cuv</ cҼ<) Y 5j@jԀf0,X-KⓢO4s4˺7:eBAdpyN聃}+2V&ۢcMOn㕙ƧKCCJhe$ԽzRj/F_K,y?AX6IġrjUވfXљwx 饼L;d|Y9d6PVr|1de V9&ݤm춒)⌏sK\efJ35rAJjkU $KZ2$JhMI.O\>?)9h!.XC]2,qĂP7B«H p`4MP ̡u JVK^95 V>86Ĝh \0!_̣Mf}(vsAy֠xk fZ8rd`] hő E)/Ot=2 dXޥrkPixGНc&(j3$ZB޻0cfȗ&iMeIś2@$+6i0a$hh*Ri hII:8o7l Igz:z8t!JP8-Z& E&K,m6i9IzfxCȀhBb<H!.T"PRIhV 1/12m)gb@ii(.j8Az"ۓow65`jMZeȹ)3Ÿ:9š_ZQ wf*f'om  p cś6{tO&&*V8`m؄Hkp̄kB$j*:zY0~OrEUߊ,p=ٵwJkBC{~ G!B"%X K :2?he=b)0N_PT2( Oعy''O/ôV0fm#o@fI(>Ōa)zQʠ$) J;v>}<`4$sH?1!ʊ&,fHc "[߂ C+h̺Q}kN[Ǝ=[9iSxbaa7&46 *DQZj -sU*8,\_b4ٸbg&Hb挳cӎ#{xx||>Oj+uY7Qg" Q O%H$HAi|Ar*U8uz+X PV,Pp|#kRirqx{(N;s~.ׇKſ_䳱j5z4c3PE`$JD5ݯ u֎IRܐj2_} ^_L!v5傭LW>}/֞2/[pPSo_Ut?W T`cPԷH 6F:|n P$&z-ܿQE@_IENDB`traverso-0.49.4/resources/images/icons/arrow-down.png000644 001750 001750 00000005551 11163362147 023170 0ustar00remonremon000000 000000 PNG  IHDR@*]sBIT|d pHYspp}LtEXtSoftwarewww.inkscape.org< IDATh[lWߙemN-JDDBB/!!!hE< PKTiZ@BhMjB&qwgx4vu|\v̬1e2A`͊I<A:5 ht k%9&ɹ;=i#Qup~]}jB@ՠ $%Y 1y$?H4O{\DHo䜤&"MKj̬: ѱMo'7d α@ZEEQUJW2͉'Ĵj!Q*rtA|5&V#"SLD%N,T:8Dv1j"5(ϯ6k33ڵ;wnʕ2͠IQqkE}Ϲ@Z"$$Ԑ&-քvw+'@쑬D>\|dZ i p PZ T:-/y{c(3tKn(ǷMING%þ(H2IEjjѭv%01h,ܥsk w!xȫOחjV.K]+SN񞷽q4tZ:wDsa4E5dMz&q 6EJ+ܙ{Y) Xki3kYc 'xό<``tL(%FLx}z2Df%ȶә=fr32+e@`Ü>uuCq?;!c[B){HҘ!mI6M@N MqR~J {-'.ax໿.JTB=Oz S p!?΄1o;2w\B^K ?O+m<}@`mdAr{mz|<NhwVDȒe6s;ŵk5q~ӜNB!@U u +|I~SN/xHN<`A0`tΑd9 Ѓ)o'~Q Vzt.ML' W!BN$ ʀޚ+.{9#=4 @l=AC:ĉO2]}ing?O#f9BUx~QB?} ЧtY]{$p5"jdҕ Z,ufj#{!AzyC8Ebi3-(5:K=9G}hK<ǧ6_wiK8j7jn/M )>Hl1w|O b[׹Hk-M`›`+UAw'-!bSI?8B&O:ڍ|[0 ɐOv4kfT/2g?j{R^\m<$%khl~. .tk?d\fJw /Wު?c#w}q]920'@ l<ԲdwC~m+a+Ka2&qH|BZųգʀ$`|9(gOnuP;;ɓ'7d@_%`#\6q13ƸZ9O3hBK޶t(~0W\C(NP/! 0S%jX.p~\\m<<{Q (u;o}3w!Yha.2e8yip$o޽0ꏒ9.=.ݬu`gSjfƘbrd4+}:;>lZUk*f[>6tU-.e]nX?;o?oP7fFIENDB`traverso-0.49.4/resources/images/icons/media-seek-forward.svgz000644 001750 001750 00000003650 11163362147 024742 0ustar00remonremon000000 000000 ~uFmedia-seek-forward.svgzY_6ϧؗu-$BxƛdS[TRu6ŀlsyl_K6 cN_ɬgQVi/lm<.4_-/?̸mU2ʓ(+r7ͬJIXTUmv-v8g"*ʕ3f3Y=, `j ,ݕKbGdb#rY96ߋ'TؕI}%d ƒH3U\FY^i R<#9Nj~ /mtp~̀Ns]Hr! sQ"2y6Et=~&r @EZKO s g_[0or#jV|$\WMR`ؽ͢( `O)@Y$s8JH:SqQv'A ^0.9кo ,w~D,+ݢzy-$ h/y*!v(?0}) bY؛H-F`Յ?xS!̼I\F^C 7\D@GN|0WOLOV=iEqQ L8ȊrvI:9k)JHrn7Иn#Hvt}Bm/?><*Aǃv "bndNHG9(~@&եtnın:Rn(o5hjzj7_5k5{kр_\u cOuk Ax 5Q0\fW E\/:GQi=zེ\<*Mo{mkmHE^!V,LiYđܕѣgn)~vUFlWIsI.jsB`ds1; B2@*fʪuL8P] UՌYGwGnn^]C@|4;*D D>:V ץ->nwԣ`Ʀޖnok.1aףGaЂw}-3]9W΀j.o#a^`ur&uj.MDW3A8& A~b%؀Kr2Y! N&vzweַڜ6̉Ub~c+|vp~zߠ}[f56&z/H0~RgF(dd$$́fC?WPS\UUE]1cay tgC/T r>4>*9Z/vW7XZ`pf$OZuWQ_c1NB!E,>'#fb\@;qgF^W-km~{$m ¤`ձ/W@oNmWErjaNZSz1i;5kLl }[(ytJXs7}w|7k%Ҕ'߁@7QeIN&qE "Bʉ`;#/$< ˩}"tR[gG̣. BnF*@^K;pKC f2߽BhH] ۿUtraverso-0.49.4/resources/images/icons/edit-redo.svgz000644 001750 001750 00000013362 11163362147 023151 0ustar00remonremon000000 000000 ]o$bNPwQ怋 . hWg$H#cGc}8ر?bGog?.o./^@~0Y-.N˗|ojy2{wz37NjoVwޥLׯ_:׿fuڋyKwr|<_]^n!AO~ܓ[J˛5!i%WZ"(f}=èޟW5|t1mp e=#b:ous:Y l4lbvys8^n_wdZz|<{fշN^TP l('¶kvŒ :G&7ftry\VW<9[ͯ'NӘvbͧ n݁fy|<5N5RO;({h}XN-9ڴTDS 쿴nY2ﺉ/&TZb>k Ky:-}#%9--=XIYNIZO)}˃yNH";^\˃T`?Q9c9)gZ7,]f9޻}ةaR_vޫIN^4 n_kњ~ֻ\\Gi?? @i߇SK?RH$C2Zbp4kz1Ց*ǨA!^ I#Ysl]ȭ!J yiP{./BOw&]}tL&'!Ls6E %/]NyXy-'ȾSX-R/T˧U]]SP=={RbT3{-Yî{!4?-nony~0wͭxLy<) .W3sUƁj9 'xt8PA"=NI$t$NZ[PYXپw*W)H3^Cg#^N0'Ԭ %WfDz)ļ+SDOĞ"fO\1j' W'n3={q I<^yT良%|c)1A-IF&aivݬ='%k('wA`|XZwW^Gk~7Gy^ &Sd}{V#`'7OA{XJ_X20#X6 6\LQ Qhb1GUyg5eLO] I\ l CR'1cATcaO  QiĒ"Vc1XBE51e"RHcI۹u$%#&ɐ:ݕPn Nפn, JfP&kS&Q(E)E ΊA "$3bZeFa)8UUfT [S$,0 aU ĐK9K8GK1%8ђ#,9-*̼&ǔ-xZ(jC:HE`=_dnǐٱ9Bk[P jɥXN՟fqa80..OWȏono?O݌u06{gy\vh?ju.C3U|C /ݤB8ڙ`CʍڴynRyx1O1WK$Hh'}\{ZHƭSC>ڠ}OB6< q]3!zI&#[a7d z[N)c:bxH&y|x& OI.9/m#<:-5rF=akSTF$'pBրbA׀#m婨d x3,s#Ne4..@i\tf?ܔ1)QKۨ/oY{#C\|o ֥qy+&BS=N?w_ui2RY"#$ht jԔR0 }# %ۗ 8 08(oSo'?-jqkWԧxuy}tiuuާi]建۝?]^ @o!%4a{upRyry|?9]Apb FxF^6܄By /^u]:}5"-o+U!!v9v[Yx\_|?ʼ?B]}N򑾰jqX-z 7ON?ņ)Axuy[5=9> WXm?~a1"XD~,uU?$-tz9jc#hzū˃~\_ \^3MITG>aW/ask+ܯl0sLDyfQ6RNE];KSS{!t4/&` ;m;~R~lDCB2U,CR/u)+am'KBrMΜ+/ iv5mShI1.Q,;Ds$ms}ASn@ij/@[ Ɣ̈́yЉ$`F48WZRvXzbhN+F!Q_.QL*Xcq"(F]%詃SM@^K'E`b(`-sf= BSR:JI@!jdo8T.u$8XyҐ2 P+fĶBkS'vEdjPS6f+ї@$wHXYPY;v>0+%+@Dq ZB8ضQ/Uɑ0\KE>O"ϊYўBOӪMJʱ@C?ĝh3s瀺uLe!J:{~6J V>M=vJ;T8zo unS`Xט"i9ލΥ%`qm1"f !U4ej1A,ܐLј!@gk1T[ciTFDEcʝTG^ %fRH8a%L er*lcً`L)bn M4ۋ4Cn)q*Z=!vHRJk[, gb\7g;{,$D\МO)џ@w z(v֊I V5qzݕ=boTU$:0DR:**#Ͱ$ ͠cS0 &\a9 ɡxkȮ`9*HVk'efP>RiP>rC1a،Ʀ/}V]w#DX+fefO~/m9]yRdIz]чz[8RDYLb2>}nEz1bG$R1!ћjI*yELY<[oO۳eQlN6Npx]?%7y3A=b=ItLI{lZ \8tҫt]la>O4)7)Ls8r}UNZ;&lz"]C!d muzܭ?{q!6_5$:sm8"5ms;M6ikޒJ&qIwJa9;|L.g%43㪗rqYez&;olȀ|ݞ nO(.韋<^d6 Z8i<ݦ^pRMbμAfPQl8 E[6Z^ %׳e! H0`|]Yr˳EZqvwHףz+Kpftq2-@m[\ӻ"]{4 ;f'F2R u ~4_RkgM6R1\ ~,1ݪo֋ΙfM!bp^khg>Ng|[)@O}̖[jNmr=IܷE`~ a, `>I󗎔-rg6YHA4~k˚S!wC=pTo;7=Z,1|v6?{ {_\der+kC JӸ{&ø^.H[cкIѱ7|cW=dV/= 5; lM(ѣ& y<\\ 9H`$e=-5PFcibƈc5[ƾ1\ k&c |w˞oKB:xteYy"%Xms%.dOcz'-dWgȗw?!ZmeaTn6%cK#S`#G5S{}uyGrJA)dl uw]}ߢF)3x짟~ZFi?y&1a8P3ܿj|YM@ij%o?Bsgn0p^2h jGN6.q ",ܗԊ ^J FŒKU $W/W=R JЃl[%[cH/@z^dȮZvCjᕯ߲c{u-|PqABтRnc)|"""[yN!H]<+-}5mLBU7-!v<,O{X9>/?CG?f\B-@y=2 yN ," ŋS·;]I,uL4ґc駱ӽ kx'm֨jg*R47}Nc"$^^^ Ll4E#j31`i鈹jHPJV /İ FbLy c_`O8.@{։c{ًQaNY4{(oڎQ ?BT>ƈC鯽Jy ~+LpA)4ܭ74JN%fM츨-:4JtHT%l$GdCd5kn\FU}<-OPz8={HB k$|إ7i%P WNzyXݵA55LVUnUZ$HJuI)^ߺT45X}, wnE;0 IgDԚ擻@n5E c:/~ בOYalS,_X@j䋴(ȯMA]x"h_":^ cvrikdV"(Ips/?~ V\^GOd‘{Ļ-|6?W?O\d^|)ހϻOU{΋?>Jq_=\P}~Im:Dmx'=&1y=7se8Aiqb `'c_OxDy87wpz';2~Nrz+ޱwmX?ؾMٹlsG .{y x?L/PQ_r`q9naᨕ!R5nSk^I%3 gun?mjId[Np(5 AmD*21Rg*HXhAXS EK#=Pe  B;5nwjSeA(Yb^)$ CJ(BXY,` K+:_:@xiQ"a2ny+%:aGVЁK9 l9P5:Z8-68t0,BBb 3 "c̋@&%A1xRK W8RvUWr)tp;$W>.(Q T.&Ш#|;l@O^puBE nv TVxeq/BBe1b)|zeʲcU5*kɭtbdP}Ocŕ) #e1XeE;BLv @c(2$CȪȝ509G:ƥeLλSV :F{p3= I>ގ8e_߼ 7_ғumgj )(4ٜ?($+[ԫ%~8[DYL@3a ٕXɐ޳±'ݰ!hN/i)PsӐhdp !"@P!6XfN3̔m4˘2 ih@R y8*PЗ y[?C!PI1 iiZdBCv(H44.'|BBk/: O1Rhܻ#H t__ϐhrF'C&!*-]Q>*B/w\ wm6ޭ<ծ>8l"[C^;R. 5tV8JcPn˥]ۛūFoHRtraverso-0.49.4/resources/images/icons/project-open.svgz000644 001750 001750 00000031324 11163362147 023700 0ustar00remonremon000000 000000 ~uFproject-open.svgz[sǕSp+/5)O8b''MMc А &TB' $J uUgUVW{u~qrvc|huztv|r׏?-Wg=?ѳћ˗|׫Gyy7o"pգr}/=Zg{zWO/xtW~ܿ˵97/W'?>?9>zw< ]WW]gG^˳WON_9;_Z׃ãAHxڜS^׫S*֩u}ǫ^39߮Kdux'kn}l٫W5Wojo5nsd1bLwAԸ\_-d9)'qyoRQ+m23 kjd.Fad_lO1#}M7E(\?e0g>fzPwnk2?\]z⧋_bT;?66O%_5Vs6ʫ%/ ȕqy ˆLC3 ",%ŮXJ velY=UKRsąȺPp"d@7Az\xKtkӥ|y6ՋXBP)R@&n !E[o@.XvYi:Vסl%․ @T9sx`, \G&|dۚ`B%M0ʦB +BH{ 6zTs 6:k  }bvͅ+ KZ e_" g!`G"[͆x$dN" $C1UAnI@pKT#IyVD)݆j̼5dX(A"2/ҍ~f& xkEȵ%}1t TQJit),Q n/u8FPr" \s{Xb)aXr:x"ID2֋$i Ɩndknq7tvTJߵ2̓nTaEMM(J&RB@ !hK cnZm (f&Ղ@frs1Y "GLV_e2%D-^#t66`e34E:64I]h0wY&bI)X2K}W^)*b'Qݯվq>g߫ޫ?GR|H3{[;kJA,Q2޷VNW߇ۺDd'WwuܱwUDwN*`S2 Z_Zwux;mdvCZUvv-TGMۼL@}Ej?h,eP VZ{^v1Jz_|hڣ&mגoш&QSYdJCKâP ^P.$Ay{":o_b_+!j+ Rq*UX Z[/+3sD*O bOeL1J5lUpcI䖛g&]~͙m33?a_cۙ1`z^ffM%dy,#Z `al F]+C3 RT CB,D.!sNn)^I~W *FS2tUžZ0jPo'IKjw=jvrҫeA*%qZsju|p4N\@|2:C""쪖}3ky7k;,ɀKS֟*g[VE36VTsC5̻H[mH~8Y*0@Bf!]$e+/+nEvE"eL3II(kpoE^i"vkmc9>)s~n}t=sɜgM#][2odIRdʽiĎmRRffRCY)YU, Pgo;/.s=jvmMkDn$Biep?2!BBJ]ciag/GJ tep ;I+HaR]VSE$ b72l\m1C]QV`EqB74:I۳*s@j BdNBYh ,ȹODPH^-r l'hs+Ծ^y!QuiI5GLCkP2jZ4p.6O?4M(ĶPABMI6`ZEs>CU-Lu;Q\%SIfGi+ m ;ip kH4Kc&5[M5pp7嬕<9TR8D3!gbs-KB+UռNMYe\:e*HlP%T #. Qy*4%?`I >!RQiPذ]yI"@4?CAB =F׏$2(ҹ%-K|>9~-G ߈zI fsHCx,̭9?eta](\Ftq S¼;< 3EC SrE4Gy7CF0,U4u7vYK7lG"1)zC8FbgZˏO> bիpl9 :wl ؒ-50f;JR7p$t cq?hTf׀pZː4ք?5ș1̰dV^Oo.u3 [|*Jo/ (fpi&ܶ=qq $÷ÚZS^OrGGu#^ek;2}:$u)u`0#1mıOq}:plk AlW2cb3Nd }:%!>yf(V![ ;oG(aplU8dAg)jރK7h;.x8fߔ>a/nxIhRaV"JTk.J{ێٕk]l9bwY_>퐥(;w1vly_zvlк$m[*]->$9ON3RN!=Cޱ!>-mwӾ5(wq}?Sv~X{gظ^cI:ElX~E""YY]@D-P 9pe f \o{|M;'6 BT~ARƐVv1ݎ j0K"XX1:ealO~J!aAMg Gwp" pj0@Ued &@ R|7&"@DoCDQW66]/m!'pz/ۇԲTbX3X[?mF[B\V]YD:&gQ̡gCOk(irȯɁ۳oڟd<"LYweSm |:EL~^kaAj<!XdKXz,nifa2 mՕS~&wwO7RlSdwFܱ8C_[ Pf%ܯIҴ?4:gAl;X=Xh_ ۪1dm*B?,u"mƿ,DZn,+%S{f9.+ROHC=hS9dnʹ"jCk͐5Y{TxVjMsb)<%}+J9FьO xw9H_nC`_4yIiOK@Ķ)w$ՐSSLv9j40ǘԘ.Ri_6]i:Eil`|CnҚ$brCݥпmdD 2[[n:5U_4?}YsDz_A/a*v=_|QDH-]==A8 `-뫬c8(I[8ҍt;nt,]pq^Ϲl'朦sigϹ j3.NFw4㤎b\]z9uRљssΎ\DŹY܉tJv<eAߙz} ')9'{pNߒ*=ݜNL7SҍG#C0[6|e<)G#E7;wI[$ uRG磑{p JǹRp#9'tq}!}?tA,E?%K|rBBf^ :5 6=95;ރrt$P)2#PC:kfi0B-Ǭ rjrJpxcrȊ? {Yz [6==1NI9=gKX= R{!XO9'(<1$OJ=(gGQArr&v-Iܣ\ =5蔔SDCP"Frtjʱr|>Ĺ{p-ɸF{Q병QĄ8%|rᮿ'/׿ϹY[{uejkN_JwXuDbw_'o vx]f*r3K}*7c7#Ǘן|<ˆsod&t Lt?̈́n-Lxzno& mn;>}_7L ΏTʘ8!$P De'aiFf1x;ѹ]{77cW>}U%aJd}Iv..0~՛O~yu@1xR??Ӆ^]^.]"g"nbZ?={ ošDb.rꧫa}0Ύ~zfW.K+_xW^~iKka}OmnZ䊬7֮pmrH޼rTy~8(;iM^|o7/}3^|V៯o?(+t^]~x'[xwzd7۷5: q nzg*>q~]y^]Nw{Oͫs:ݦO+ p"BʍiR1]< f@XO@(qnXs93ƒjetb^G`s jcҐ R57<[s.yds[Wm`.]qГ?J sZ>?W8W1CV30_^-3i˫o_Otz>,؜Zr|rS.T6A"f>X]ET D6Zb?(scیCRI͈ӀER]PёE@ung=z@Y-H*BܸS3a`lʹ%?TmXo Fsf (;]TAQц2.,SlG7A*\H@U1a(Xkӻ*fiQvm<诳r_]=}lzgiI4#keTQ^ͧiWC,;~^d*`YEb]`fRCB̾@e\ʿυ#)XMkMW eҺ2K89{B+-JSZWVzRz&9  Xl8iոc W.pEqg J,1YD3U96X .s+ېW ٬m)SeJ"mP&K\m4W-$fTR+KQ5dNX̑ c 1gA nKdLPDaN#&D5bS>G$Het",\)h @6cmo?2ֆ2n5abcֆmc/$Ѣcb CmǹLF9xfjJ(1hǦ#ctovDIETq0!#h;fhJNmG[T3P^l{Nn͐h[3hHh6ZZ6iOL6Uqec@֩V ڢF[LGP&czMخ0ȤV+L]kb$Gċ]k^I$n}X.tQV'sdOJV3%" ےV'zg]X]G'یbo3$QRL.ʄ6:pqZ".R*em7!$M:136䣯͝_E )B:bU&qo-D3"rpFi ~б7hrPX+Ad"KݛFR.[h$;米֥\ŽIݽ ôB~3O(P'T tL`Z&Zsj2#sj2Șdh/3A@.3AefB Ue& T93.hմr(R41d^Ɏ>iaDø7?lAE݃5U" 4$2ްi P/x@Cm8X'm !"E17"ev{rD3p[$#9 RWV"FIF쌹D_tȐ5c#0lj) ')#x(0t:K7L|C+dZ]Wb''7{ Ӆ^Q6&`I26ܨ"<8"h FL\E/@Pel:T dfdwHoN]>}1U,Iz}òH $7] 1c^\6 w ~xogQ.>۝E0՚gZi,"=o89.TU?qw-We(@%i o+R* \Ml%؞ oe{Kl8!GLrȽu<&lr256 Mb&e ^ԇAbpA#D3 f$kLOie婵(u$N#Qi$ +C o(h-H_g2h=Mv<5tNrGdDnlUI6Jz85nj $8Iɿ~c_dd?74{/׻~> &XDz·FQd C*ؕk_ۻwlv_)] uht B!2Hf9PH_.D/GceÎу2#>X_=62;,6]rBQmL@)C*oyQ `<@I,(;SmRۢTc(J`MEb(Y`1toT`Νخ.=mi,q}&sJ&ydu𨥟~wT5umzT8.MKtŞ;Y G)Fvpzk>\ }M+^84fa(q4d"Ui" &1JU;ʹqg{ZvgPiQ&y;1M2Q*i`5ɭFJ#pwhuݣafȻ.6UHL<Ҩ|]I*\jFR,\ ~ijr)QŞ$ FrXCwZB5 5!D<[4A 2 1!KviØ; ,dDEP׏K J'^`Jlx*k ԪdD'b)z֓zδIw.k Vp'T!lml$eCjlЗ#ȴlè<&ăF'Fx¬iT!Ӿ)A=, k,PH"&P&-e G;̂dvdA"5(Kle׈w3u_QuGlY4ര056Ű_vGMhz5vs>(0*m ,%=ɦ3it݇qcxcʾM^~(/-!&Dq9Ȳ yOҕ!G9wo0.2E-Vh*\wY? 6`I3>51y2g#[traverso-0.49.4/resources/images/icons/document-export.png000644 001750 001750 00000006125 11163362147 024224 0ustar00remonremon000000 000000 PNG  IHDR@@iqsBIT|d pHYsu85tEXtSoftwarewww.inkscape.org< IDATx՛mlSv&4I`B+Rm*Z &2u-V1TLHėC5ib)LTLet@!@B وIBl7}s}}#ιǎ=pS3)@j`T !p-IjڮxddͫQs8 ~Xq(Dǣ$$IJϚ*Xsk9/ِ?10ka0igd,؉|fDJ4W=fnEV$!$z!̙sWڹsgw0xk][<$ ҂,ˎD6o\SSSmllKf0hXUXe$j,Xi;vD"aK$/ , 9 \L>j,Tݫm!I<̜9N:HoڴiYmhh(,G.u3hCVO,f"<#Mww#!Ifnٲb*7`$ k[E; # 裏hkk#8 Uoݺ5P^^~ v}}}3`C ,f2Ne; "OΊ+8r|m۶hiixUYAC%l"cV\ϟŋQU>r'PRR`Y}}n X |//IXڬQnܸ0Bt]GA"@uDF2e]Z{1Ww޽{iw p8leĀ,ғ$ŀytuu6m7mӀ`X@,Ks-@ER狡l bܿj@yJ~ʤgS8K+6jjjV?s@C j7v(T *`m)ϓWSi}}}>|x Ih= ZsV䲈/CCC8pp/Y.P !XanI8g#ǩu%oJ!"KQS@!8^.Y$'{~=HH 0hM|(" y%ιs稨u,皚N3sicƁ|, .xꩧ\窪zi(ep8uL..`^d!XB$_|t]w޲X,vGEqkq aݩϸ4:G7H$ۧ l öwi7BBMWBpIYh߿8ڀpXu h*9={!B+WtءCzggbnv,0/ԋ'fF__.]vZ*t?p k+E^AWWBx ؃ ͕$x^VPa q_ T~ xW_i;9Ѽ:̸BJ֜?ӧ?FQX[[˯J^˾cŲ =@UUEe˖!k&uvvF ȑ#8~{Ⱦ+/s"!j:ɲLEE .Du=JOO]]] Iwތ8[d|"@44MK[,Ȳ*1wn ==inB$|T̘ц 'o{䝆۠LUUEu8Xx\)6y] ݇i\VR3>_47VȐ$)}pU\t1y {NgIF<; @P|!8XFܨ.mߚNxG$*kC~7,O2`mA'O]B 2`YW U\ 0ۜ0\/vL\h̹ϡn$SnM`g)aݒPׅY_IB3YsYd DHw)%_shO I i@Zpdj VηjIvpkO{7fy{uwsڲ?=R,*ig?X1L꺣Z}8nN~ suvv"?6[5gx,S#SS-t<{ ڶv1Lrt˒IM`1᫷?ff5b:HKoOj&hZ,hi9?ՒP>HKvՒ>tCnõhq0[>=5}RF=f~XbrQʻh%b}ggJq_ <%ڭ+':4'n}S Ö=D\{ R ʘ;9%'x̘yG!.ҳ9߮m*ddcM%cMp:RNU|UW'#J*jNg͛VNEؔ(99R m?wm{Lv'!Lc?& gO'潢M`//58!(@.M!eQx4 ~NQPK-VxI[QĨf[2iWM]-ok -}~w{{>׋` #/_x>_uwR o Hy]gfUƉj9 6'x7NО*,N&$R|9+SN(r}81K%nLg~yļjӜL,aHl $w*4eE/jdr pvNڳ!N x4Qbl:L> @%Q&q)ʉ-@no_wWuU-1'[x\ /%'#$w vN3'rc8;Ә} N!AYWR27eHN 8%49]0ic8#YEOuثu)K I(amI%IFY_OFfST-d$ԼW\N6Ү%\WNڳ!ëʑ|`sg2'ԬSJE7pN!} #SWCTK<"ϿZW\9k."z^aKzuq/y͈/ygߌ+یkیל'o3RI޿?Oy;Kz[{V$"ϚƇyZ=-.9 (ٔr*EPd6_WI~]ujzg=rz\ ` wrsuw{u~9Fߟ׻t߾k?!~ugLUa̠pbDªgLl4 pt9e7ED)UM h O2 [?K"S˩Ʊyo] 9{,=I,N$ ȧbIe@YSn/GPN\I'o8&&*jbni Ug)b(7Z?X(eZS&bIDۙ =aAo)E |E\J O f2#*aVq"!![S$,00UabHPኜrf-ҎpOZL gbRk *Pc J bH eAf} lp: ]N%dTKEnW[o`Ĺ1Z,W5ޞ_;~F86`}\ mbyqY/>>f}sZm&dvh ?jwTH2%NRT{nM+]kT%I1ȏ1W:۳]tX-dgWh;~;h~%>dĺu!kS-<#;Wgʯ$+`~"ez9,-!ږ'jIy*(>I^r )MA1`р-sSd* < gIcӮ Pr2NRa:_~nʌe.x(m[㐘ExOw+c{(2>AĦْ Sƍ{b?$]_{d̚W/?/?yf~exsuXt]CЉ>CQ'tVtf~/yo pԽ#8;xOOO>]]sqz7_}5XG `ȶ]?Y{kU3bQ_/  ڴnbfy?./.&mWwkX[j׿X;o!9QIv1$$?030'>`怇i[&8cQNE1vTW`V L]C\%`ƎVքXD <1eX'+S$T$$ 0<#OLkwQiѯ!Z1DrD@ c*)2I\0XA;6K0bTE ) Z4 XTSzE,Rc%:՜@+T!KiGe!*&[ Wyb@KKS\!IXR۠D&RB*vOB4A[Nl5,eERJ˄ܟ fD6[jlʫ=y)?9$>a߽Wn͗;,&ߤAkz@Yg9f5əJOsgS}vQuPB.MvrL=6.)9h"L=Z1K"Q@%zR&i.]n#߳)fnUA5.{SI2O 7#LijlST<{`zmʒX lPĸh[w ]8y%Z0*nzisYhv${R/!Nl \А*){P-.90T5g`NP3R&mZS[9W*9Te,a%PId֏QV"%^&VR6$М &JHLd@@:qKBVQ2!M|=$A|m%-/cčȨ NP"$ c*`_Xx/ǟqHm-KXc@р44'ĻTX /v6$*&%2S%@6O=|m$sTl )Ғ(0=!|tTDG'q|z쏍HI 6<3,4<1R*'FNb::0NsbJyH!DѐCb`Cb JU)ÎJ9+<9R;*eت3{q6C݁`wP{?}^?}WX;traverso-0.49.4/resources/images/icons/list-add.svgz000644 001750 001750 00000007222 11163362147 022774 0ustar00remonremon000000 000000 \mo9>Bc-U|WƳs0<8vwmF 믊-dNFICXVS>l8A,_`]i1_.b9dUU9̪ϋ?͍֓5XΏ\:n0z<W׫y7\T#p4L'iMQz5O&&InT!#G#1Z-vXM%ǍI  {s+^,Ţ>a9bZM32Lv,r}ULQ|iuA>6/EڳևAn%olH %wiiuM/jTLx٥۪\dhYiuw?ٚ~6c~꟫b:#Xu )wa; bU}w;nu kz}ހ-f\{~]5Vw(t='h#p<8#Y֦H-E3`Zxi-ňT_B+w*2'*r}EkKY],d:qVnѺ/: =X_W'IRJ]3ZW+zne#g>BKZ嬺a<;[$ s@>&A/7%ἥKI߈\6ws1Tp=Y!wlN؈WsaTrWeE*>$m@8$ZDZ~ϝ>V1Qkb]y#NZ\jqM S{E)3ųټ*WRkD)$(+LMB$,PjR%%J'<Xz5N :F6P~U{".j^Dor ) RBJ(wr6Fc!chu[r쏣wG/@}苵^瑩?NएPƨG{OHBЏbEx"e/ gܣXE~hL‰5tl'{g"Zd,L_'"LA|t)"_,qg '&փb0*H}C^H6/Hc>H+lpV얜_ )Ag=/Pz/=&bf@Ē#q{t񊦈obש횢n cQt@S@P;h^ )4_:ܞFk .c3^',}4Ѝ \ۙ.Wq^T廑Br)|δ^z۩b@:yI7/߁*(2tU兑jzY^\F}CU]|%ӬIyWy MjZ.?&tlW_/2v%)PœmwsYc=;k%]wu{oj]I ?ntuۉ7A+–6RR{6ق;jfgв R?0V![M' Mu޷wu {yOR]-/ncM0eULH"ZWӳi&,WkVӌNE쒬h7'h;Y! d/M}^xѿ|33Q#h!:.4ηp^|,ϗ m\^_].ecmioTwUTu:E{j/y w&!$b-()\gc[lZV]䑣c BzB-$hٿ L`,Z<ԃ[PK:ChP̱z J(B&$84 fh=XMGYPȓ uNrƄx$JXG~d͊8(4Z8I":p(m3^2Χ Hَ %-%nvPgjv;~{6r",]#0@z,I#ROVtw@f4z_Ԋ Q_EKp1V9W!oΣi3_0'%syk>YKj[A_#giNy[=;\zhg}6?4JHCKĤUV_OqjT5 p*ҝKCG__" VT5g̐YUF;|C_Bؚ A)&m䘡79<92X؈l@)g<\u&ahrjV>tl=yV]I2PBdžVBzyn6٠ĄyVt=6l3i6aݍ>rR߯Y-$Ő`i$xT!) kƢ4#ɈBTp:)6H?PRxmTA8hLl89h4jh΃֐ƍ9fRF1Kph7Ku/f曛=fF< C50x֛n&çi"o2ԁ@"@f;#eT8Ik$h 4[ c)Q[X@ni;sݗ=g#wD&)rj^p#'ub-=ZgLZ/MĤeԆ7$ }jQ9SZ{ P֓,cZ"ZY yw# (z#:b^I`,֛HlhVCeCQ ˲En0Q x5峦%OWI'%T^-=F~.w$VaX1?)$ kk NI Iz艸8Pj`#OI|!o%BkotjnymT'Tk ى@k! 85AAQP1C-h&EbF2!$P{˨9C *03gĀMhWl6DP h\ q擛zdTӞ/11i]ܨr6,{B6źS/_SZw4-Ko)[NN㿥oi<~cFp{,Ɩll.ި 4~ZNT9fq>1ڎ`41ji ժ߈с&h8AxNH& $L2Ā@%yQh|-^ ؈(-[r J;-a^zAuI-WB4ʹ'L֐V]}BN{IٖM8:ݴV<[`D|xusAYK!Ttraverso-0.49.4/resources/images/icons/view-media-equalizer.png000644 001750 001750 00000011417 11163362147 025115 0ustar00remonremon000000 000000 PNG  IHDR@=osBIT|d pHYsu85tEXtSoftwarewww.inkscape.org<IDAThݛ[y3眽kb%"*p0`I)ʮ؅cK1<$q,I SIle<9AJK"gfיsJUsfw5q;ݵk~_H!DJ 4B&H!H)i/m)@So 3 J+@5hhZQ j,˨Ns꿏Nͩg|]w|yn̈́4MHҔ4IHi"IҔOdb$$2!Ȋ& 2^"eƒ&4h! 5+" !X)\Q/^bn~"/ȋ(@[Zo=[Җ%(4BBYcAkJ+JUbxv,Ͻ%|'e9|`c+oܻ$al(z-u3'*JVT@aMXpiB#7 "GE Ğ;Y΅x7ɳ'x덷<)<i5ܛ 624Z}&I__z=!aKQȵC%򣎫Š`0*a2Is1D&]cfggt_H$p ȑaپXJn+'c$q`Ipf:@Q-}qKJS"~aRʋ/>Ojvv"Il:Mvz$I|㌝3&Ծ&&q*ʉx\;a0*qb~2J)$annv͛)4EH@4M#.x3u=*Q(m\`]ZM:RKP`  sm,)Rd;w',..RռȺ,rD)ECdF<%W׺.WY][-s]tN'R&H*Uem){^|[h6j`( ,( @ I"eF]i,=:jo-GAH2ϑT8M LvEal|ɿ=qjȲ !;V $" Ёv')ڪSod{$~dF|ɱGFFGر<5yl((VhJ<!d8?PO Tt A6[(سv*&;3OJmqw&_W(,e':"J,t`>SCKD>!渾q썌;Z dOc?l,t(>ЩEjR?qrus*iL>];.~#JD~߇t+.hrZZ "Bxю /D&^|9<4EQ nj0??OV 怜]El@F1(K@qٟ~]"^بn/CCC~!VBi6 A<>1+dIуx*aݝYoD]=&H+>/ xǸ[iZ,,,NVhPըjZ-cnnSGd? wȲy}!$} I*q=6Xs_Rky=,JkB13s<Ϲt|^J..TˠW ]Kk xGx81??NJ v;|'h=@n 4S,..P٭Z#[J~όOdg+lڴ~/xWo9R4MFFF6Qi?4H#nnڴ%45Iw~ykmb[Z ՙ[nQ[c}qQWVn{?E]*<6" ϺA>IXhqT.[TO8|\J÷+a;Oo9ri/]Dfww_f l>.|VxuL$L ֚ZqY,//p5yNemjG"..g,näųt[.JoŪ8fv3kG (t@{Ϟg}o;0BҨ rx8kwkP@ؘ]+sc8$޶׎V;n(6_>۵vp!2-º?a@ :1f *)[w;W]$l( JCi:6=,j~f%WqnBP&B`/bKwqE\wvQJI]4KL$H4IfHH3JR$R9|Kl@"G=~TP?C/3ZΔnq,R_oO3g9?DJjijMӔ4Ms${?&)(&(VʟРfgZzKh(scn2JRA*Pb}?$(=s6IB\rREΛHJDJSNt !˗՟ӏ[k8t'7Dl,Eԑ%YRѹzh4Xw`trC8_(*º5G`|uT] hU@_1QujZk%8%p( W*RKuR;  P*QUI#(rힹkUi1D5DIENDB`traverso-0.49.4/resources/images/icons/media-playback-stop.png000644 001750 001750 00000010134 11163362147 024710 0ustar00remonremon000000 000000 PNG  IHDR@@iqsBIT|d pHYsu85tEXtSoftwarewww.inkscape.org<IDATx[mlU۹3%6Hb5M ?KƖdÆ$5M!?___֗Z_S4Qk*X)RĦKγz̹gn"{}3=u"­ m)L(U!Eﷷ[?_ID#bk !ԯ2NBxgp~7P?#D !^ݻwKx= @-yފD"{ȍ1Bg})Otcqq1 .GQQQsD}*"z|llB:F,C, 0Ckػwo?bu8lLDcc#6l4aYF jrkHSr_|88,˂iF>1  `,y\;mZ{q= !#L"HB^"ib>chh}`=A(**9|޾9 |:f2,,, b˖-eYHR())iO\x9t!l6L&qdp>^DQy[ã/©Pz)ADhq~aaxQWWT*5k r()HfJ ϟ?~Ҍ<ϋ !6IG3 5)Q癛j<H0j;a dDt@j"`S`6,˿nAj+I EEEy@e.gXjFGGmܸ u|av/5,߫61a} J `:SPMTQZZmrs Þ.SPRHiuaR1t,}. !:]G˗/cqqeQ2F B* .V@\wAuLNNm "&W{{'bEɻ2,4LBߕɗb"vbvv֯*u d+*"U6$yׯQu^Ҽw33\7"t<&t133tKZ^st5Ǎ-Ngj !fff VpN0%###V7N '9r{Pm1bppOY\\-B<[X{g0[wɻw}"%yX2 SSSO۶a%:;;CSu9; ۶qYLNN8rg;_3GQ9s&/FŅƕ W+Ly3 h)b,'k^:r FŇ~oHFݹoTp<멛&133."u/sf`&Μ9SԮեauJuL&a:u*p[i8z(hp~qLP7*ˁ!SW\#GjߞQ@SB?1ز,zzzp5WͭR Nո:׼O?W^y,KEoѣTy˝BI ,|<TdR@&\)K/S'h6۷ md;v@uuu`몮|x ]WY_{s6;vlhmm݁FI8%۱qFXX,淸@(YKsU 7n >;qٽ­ &iN͛7cӦMH$~ǙcA!´,>}RM}}}.WXDO>-[u9NxBр*?{,}]N yBmʷ5]ku]]ذaC^9y!0 E8qW^ lZgsBvy>ZZZv!,y\NR뮻qF<0.k|/1==/pboT~d ߈h-"bN^T eee(//G*ӘF:F:.\L&-L9 `[__߭{dPu"zX ̨1z]hyNuK?4GKKˣB?QBMy Ut7Sr!9"c9>ZZZ=)"Zir{?FDB܃|D;!otob\P@Ow":&xYhii$_ !xb˞B D4 8thii{|^}|S¥)"a"IENDB`traverso-0.49.4/resources/images/icons/document-new.png000644 001750 001750 00000007664 11163362147 023505 0ustar00remonremon000000 000000 PNG  IHDR<@FsBIT|d pHYsCCxZtEXtSoftwarewww.inkscape.org<1IDATh͛{]ysι}khDKEH RETUA(5)GBM+uB[b(BH@IpPc.1~bwsLs{ݻ~ќ;goZ&1Q"뱹("y8W}1u|? EEndױSf_s_'?6a?7p7g_%_|* @\}%7]|k+k)\'xf3Dn."q'nnذo߾b\rWk;oaPŋë́2n `,B$1MuVy[Nhl< ,Qh'іg:;)yyGfb p |f|-m6=OC9TUtjs!;c8#  E*4 EҹBby.}ڮ4-qu fp MĎM,@^% ].,$ 1>+9T;,e;Z#?mVMQKi3Mz(Bt.P,zn73ҝo+90{cc0auze`h;Iϥ8} %%e% \ Ms া]L,Kɋ?FD W*B0)PdA|Ev 9~hzNhZ,Q jC!瞅 \KY*4+Ŏfp $UX-,laece+OV NFjTIvzgڀfmKwp@2[e-~w۟"@X= }rȄ^}p uaP+DQC%p̈́Fo  "J @'T:%ppgYZ>L`1rxvSOTw2IkpYZZ'Ke }$_BO"t eqjn? 4`V,\.Ge`O }ez\NƘB3z5XPvb@֒Xuk_S<ۚuۮW8rQntoDآ ZIh؇r$)C3)yI2o2[[No T.5\^ELTkyFtlHx QhV@;h^3C@lHj ¦R(ebbV]W?*++͡`Fym*a:I"f ЅpJlaπiU_.M|`\*X|9a"{e[yc2VIk :Oui@ʙΡlIv 8nd3ϥ ZKMmۦR0>>/q+xpdyr+1o ]LԍTnKgv޵I=`0 D+e溯l2qĶmݯiNDt=ƉHJFǖ10Pi=o˖-oٶ'9Xaӕzl@e⒋/j۳޸k׻? a,/&J)bPrSS'xk> g~ju:}z-Zu,?g%; VXlΦ_]J-X87-*:W`p6޼aӹ p>3$mSe+>孷s K浹4D$H8~|1!,5QNo|6Dc+{ڹ?YZ=IENDB`traverso-0.49.4/resources/images/icons/list-add.png000644 001750 001750 00000010276 11163362147 022572 0ustar00remonremon000000 000000 PNG  IHDR@@iqsBIT|d pHYsbb8ztEXtSoftwarewww.inkscape.org<;IDATx՛k]uks3sg6F* MJ-*ZUPꇠQ‡jR&MEȣi+hiBE)!`@>{q=s={kuU¶ ٪Ϗno\؈``D0"ʗٰd2ޱW* nޟM=}K'wh#&S([WiB6.Ī=܉|*LE˺tS4+mVVQ7 ԁ=jڵ5gq k?'gsWE2О{}S/\qpMsh7&0XgQ|W߭Shna<^IӌȍnysO$sO4ԌF4mVWNIegnKU5Q,5xXVGW57زb.ZWncw9w 򛈀hHɅL.ơ8:G;o^OAZ ,8<ݜ5;u^,9:?O|) ,2Z-k%ԝ02כi$ԕ/Cݗ`z~qiL${VVUPU@`?Ǣ,qũz4~*X`\!&h j(ܪ x3P񦐸 Sk"&fV ΁(sg+)pj_ FT}4NSº gH$P8c(+4u2PF3j"* +ؤ$p`oT2SEQu8W6w|[CU|A]q.C2B yKQ`㓏ȫI;8qbb`P[R6a(u:U:acZI\R|NvSTXPN:jҠ0dF[gݴ@<4~噯3RҠl3ZňYYX3&yxq~I)W&(.jvWK#d[BpR4_U jhQ$`YsT?<o[n ׍c@ѦUk{^~}u9aJ.v?3s k6ڈрKS9[11QxI1~,AaA H%3mf{'84ht%;b:ϼCwHoGß^; 6msӖxX\)$I(9`& B(  8 ZD$BԈFdbjRHL]ԣ:k2+6)v0`>f0|C 4M8E~vq.]lGMIPd ^/2Puʁ w\sGN[9od̃"Fo M?\:͂f.fO]RGbSvѡQޚ?4( J &!"k'K![ )9% (Ay(UE+>$o篰 X+m_Z?|'&$uγ2zs,!gıI;X,=җQ PHfA9 2`A8tlZer <5&g'N 9O\%$_zG!)V 3\f} ;p<\N#Qc"{vKLw9R0F+d }rvJʛ"7?S5 df bȊtqT(^p΄sA0b_k OQ 8}-~pJ``":;+%@lK;Ei< +ܴ?57sKrOw.?\A黁+G.ͫN%X\0SN*^(6+(aPd. I#J)$- !wpYA/ooeqn?(# Y%i U2Sd`TJ WUYj+KTmqƗ@Nmn9JUPїJ)iX^b'V0b1N\v8 V՗C+v MH# ɸAtmϟ,[V1[eD<4!%r S:G9bD'C召 2}w^\ `#q6EYLXPinb#%u9S_cRMsջ@ ||SM&)u~cz?fITt*DU@X#A$F g(4E ^=֍a`YceNki/ ìD3lGH\h |U3fHGfLsMVE_{,Np Y+1uCjh,ū0>E 砉UZ\a΃Y9RgphCHP>Ro15eu}6x}5CkP;B)s"|HHQHETb~Z [1Fk4EUQ:=>I#akFDF*1qIENDB`traverso-0.49.4/resources/images/icons/traverso-snap.png000644 001750 001750 00000006036 11163362147 023674 0ustar00remonremon000000 000000 PNG  IHDR@@iqsBIT|d pHYsz<@tEXtSoftwarewww.inkscape.org< IDATx[]pTn` Hb*V3H)Йq>hA__LZu (huD-$a$;q?οw{wo+t79{99u\FDJoC`K0Za 8 Wt^sᨗ-y21p"("RPʄRU0MȷMQf*! !seٙ4-_U`DW_{Hwݵ,T0 T*ɩI1;S p{oM  e@BJ`xxprrj7W^mŵk¨p1)e{S.fG_T*ҏ^ ! KO6HRW.cx2 R/ݱti4 B [4/`,(d0C2BlniHR7RJܹtQ \Ji)DaqajaRH0E"R{^PH& J&077 nR)p41>>o4] J)""HEdH|"HR vi He9ND8 CCCK,;rN8I˖-Css3"HE#iqc6n:Y000G;رcRO$#R R={۶m{%돎ٳذaC4X+. C)U ?]9*B-ءf-b1B-uuuhooG,P6 R*$DflٲB:gΜ޽{s:;;~zi"L4͊ HRbd Y00;;YJ9/țH@D@D ҋpB0'5{Kc ָ9QVȡ ҡCp%_utx,Kp!_u0ϘAo@4߿sss {M <'~h>Y3)+ٙ8p f`r0<t@n*8:;_i%9ILHTn<d3Mŧ~;2#]o_\DDGƷ##~#BTx5E] ڮ0h't:ٹsۃmX`~z{{pܹ\OC_"c, M++f#{*5qVU?g-f `Ar\5lfiH&@1شqe|'.;&R$(XZ*/ɝwޅm=o52?L&m7ppYR;"Wʎ[V$!wDo[:B%T*}{!.JCr&{ 9(٨[-O<9?9ײ={C8)c.~@i3Ggsx]-ZlxrW[VXիW{6rq"DAϚ7aM|u 4`sK+>kA-bmk]6hfFӴgiWկBk NRhm}W/meRbXDnʙ%Qza['DiCtIR8==1KfBb%d!x W0xNaw۳Y7X.@VPNxÿ޾)Dق "h ۷=/+̷^܊wZ<:y9 yx^u>WCp E*֪^!pK <`|+0ql}r;FFG= gȍ ~Rz0D;މp8>9)pO EyiO0?o"[Z}1Pk9GP*ky>pi;?GIt@9̏ g u'ЏkT! ) g!؞/~ԟhcR SS~A=-ZTv{q@=#4>1 B^D"O'OI%횚itʠ~e=%%O{ڵ5`Vsx㵢/^\Ȝ2~UQ躎_؇ ѱ:5T2QPZ7ol}%wkmފ!(ʉLNNbE _Z 麎z ]=O.9`Wl>/v-C0BƯ㴸R  n4Mi o*R@@|?#cr"ZHi)(R_d2-Fu]@D8~8tM)e Z"X\u1K.+Ӆ^;!"\v ǎ4MfF##"6aL\׽|i$t]7M}}}sXӴWLMӾSta H`nnx4+R}}}ߒIENDB`traverso-0.49.4/resources/images/icons/archive-extract.png000644 001750 001750 00000007035 11163362147 024161 0ustar00remonremon000000 000000 PNG  IHDR@?PsBIT|d pHYsu85tEXtSoftwarewww.inkscape.org< IDATh͛{\}?;}z]EJ#)iHTc mZ UQ%VEjAUE&(rPZ,&A1?vzkvf?c>L~gι;;Dfv6_`RD6Vn=z7(ozѕڕ3g\VJDް ҔH$"`Ǎh]@0J@Lnv%RZ_OiAh _ v@7)l6QmE@FMYnFI[}@GVFǭLi 7(Y0؊VoTU"6ShފhvW"fJ[}V&Vq)`-_͎7ZڞDm$D)qpm41 }nO??DO?ȴkjaQ꿗;?u7TL&0kWe]7ӻ[fnnW^yc= :̆iYHp3;'>eYRկ#z.s|ӥ<Ϟ:Vww7>'''?TJmrFo{dϒJHu`YvxSyxy%8;;"˩3gN/254:޺+H8jU#Vd2 "²[)M&J<}E4ta}vСCzWDΆ7~w ?u, it$йvoA64Ͱ# [0]F޿ Ie塯1Խ+vBkzz'|=w"޷@0v^V" Yr?TPnF%etF h"’scZqW⧈KI26wBww7@R8֖Xv6gߕtE 8ȾOmtY=bv1[›!ٝm:)ضRb03D;phm;܉.sx:ubuv}bSH\ྛ mfrb8J2hCZ{FbqR7l&B/HTQ+^m&ݩ J9&)/bJ8q]`AD`0Q=)1X\\uin5mfff.:uj諱 hSG&ڌs3WfJ% 6#yFFF~kq ذbU7L:,XZ)naꔢNjH H(LNN^:|O~R!_;xh^<3WHyp "qvt=n|)xuz~^.y݂mM7%$_0nٲ%L[7LWl/6˜* \\.c4 zk׮Q(Jo?1XCF6ca(rv,CfFPt] ",,,_%!0l [xֽUOmb{o<tl+v|J>rҥoGFFF)"Em~7vߺo=pт x ZՄΞ>\&@%MlS*;TNLd eX/sқ'&& @ٕbaSWߒ(0h\A-,\?~Yp"P-{*Y|D*EXD0@4 m/TguЮ˩_47 Ii`Rot0EfOO.p6-ZiAi"Ү rE((gӂ"g( h W니 Z@Jsz_~ )ApqF?\0a͍Ep9ɋJ^ &ہxL?m&X5H3F鈽Lox?涯 F Wnf5n6 $ \GZQy&-SIENDB`traverso-0.49.4/resources/images/icons/media-record.png000644 001750 001750 00000011140 11163362147 023413 0ustar00remonremon000000 000000 PNG  IHDR@@iqsBIT|d pHYsu85tEXtSoftwarewww.inkscape.org<IDATx[{U}uqWE&f6dd6Cq_!q2Lf<"'f3LlЀɰi?1JvEMw~ݾ:qέ{L$'u{13ney饗fLPUDtUVoeVy3bj[YtѾիW}ؼysgm׾HЮ#vQի?Do_|yԫ0 ;׫[h!5k"`ƍ h3A`euxȣ# p0  `Wa---U شidf`>0 Զm:U"d۪%p4w($׭[wqƹ̼Um۰, |e,B!L4 555H&H& N#N#```/^8ÈD"vp-#9%\.\.x<ɓ'cʔ)Ti }lΟ?o.\@&A4E4@ y HՁgYdYTUUaΜ9i> F"pNY-q9|GB,C,+"B /V ذaC `jm{d2hjj´iDFH$uuI^=R> ˲=PmueI0bH' <3ض !(gjm9|e59]"`۶m<Lh4jTVV" B"V'!v㼴yP .DUUjjjP[[[S UtTrUm,^ 515`ݺuU\K,A]]Ə{Gv&K4A5ʴ, m{ŋسg7b1or_iӦwն bڵ$xI6}&J|j/ciBCc=pgu3u2 f͚$IR) AR/gVAb1!0}t(6 .ƝEf͚3o D0c DQR)23rfjkibF3g"2L05kD`3j&ٳg#yC:RKAK7 IF,C2ܹsR. w2e; !G__SSFq/s5dO|Ȝc_FĦ7"ì-:Z;D", 3f@wwók[wXre !!?::a,Zwu&Nq:8]u8s7}-p68X ve@W/WQZ {!N8.TVV"H#0a˖-rn13R&Oh4@'Hq׿ŷo 8  *  D F^K*TD":u*7\*̼pY4ӳ, wqLDee2|/8F!8Dp+t;b1 ݞ= BslhhV@(N'*0r9⡇B*B*B4-˩u".m|eA Xal=g(X- C_" 2 uMJرcx`懅1]LĤI`fx'j @Ӟt4BUUU)β474СC_g2%_ /1KyI AZӀ 2.I ^Ugy^YYX퇸ry"cQ \U3lB!aȕ> A<6D6˃39IIUUU!#՗].''7 "GT@pfo~_ `!.ewrKO67ɦ~r- 0P^UpMJ)A\O\2(׍@нĬ>k ={\/AX}W%/*3<<4j$f``OgE%@D³*i4 K`HtITef .Lq`3iApymÅw֏:E~@`Է~[4tdp]&[ ^u

%xՠpۺ0%~}P* IٳgK&5蝙z%M%ع#k {^0#܄VGIީS|' f> qYor6d*dhx}HKӯ}N1KI_Ѷm9s|ac֭i! 38yܤoXkA?(lOIfgs"äDeUTl_qp֭i"ԥTp)o5ESrNjY!ܤRc ܌{>_>H7*+`ppDB2^'5?Z Ӄ9s 4MQ08duII?Y, Xrv6#V.ѣGwQ|3 LH|Qa=P>o>vYθX-D"i9rKHF_A jOO8|0FFF|Yi;[۽C8q/ kjFhPj^q#ϩVRf_ su}l۶ylT5p8{ŋ& Ac|9SϟǮ]|;rӭm% w $ HaGyΝv횗!%jjA? eޥJ^.}w3evtt-"- =4vQDt,EK֝*vմ\q1ir>\1&I,_~EਚtxΝCGGFFF|J9?~7np)7|ؿ?^9e"ZcǎOW˲e˞#W9Zes~L:(RyOYӧO?W_}1 %3bޟ"J9V+ܹ}2#˲e&% _yնբY(A Y.hy<[єZ|DgD iB_ $hS3aջw~6@̼62~^F ifn!ݻw٥KFD3f>1vTIfMD{t6,]4?%eؘ (Dphߞ={v?.Ux≢(y.l>o; gIENDB`traverso-0.49.4/resources/images/icons/media-skip-backward.png000644 001750 001750 00000010703 11163362147 024663 0ustar00remonremon000000 000000 PNG  IHDR@@iqsBIT|d pHYsu85tEXtSoftwarewww.inkscape.org<@IDATx[mlTպ~̞g:h"X#|5pc M|I(A8%ѫb5BJT!A)E b-LcϞY{͞D=o2~׻nRSSl"0$i.3|ڵ#wsnm۶qD' 람1C:c֯_?z[nU/x eVٶl HMeaꫯ2"z &e-rc1pG4661 ʉY"yn'h]cc+7o.%w`1%2k @:^5Adv[KQUQ(3[iӦMjhQڜT*0:RREAii) hh###bax χ@ oȴk*^ jTVV_`MӴ@p0vڥac"@<a?>LM QXXUUm)sr 1 D#H̙38x ÊD55556k׮p4X,UU`?~|P$}\ Q}d耮(((1dSSctp`͚5DK`cǎU>Wm!wE-5AtCCCؿ?_o'\al߾=+OpiLm^|QQBƎSq Y#c -BKK bX1J2ۼjK/4̧R)<Ә0aƌ1cؼoMc3OZ0ߏVx<Xy^{SKzjN0UǏr 7'yXu߿>>'OSO=e헇P\:nZz5 iQyyAyy9~?ƍg!d'otӧOcǎ8}U'䨲?08ɤ-Lfx{UVDELq4 UUU4 ƍ9|L˒W3]<ݻ҂h4 VA4 4 dؖUVo џ\t|\̙k:Q՝$+#8qE:c=fR2VnlŨC(b TR9]an=m3/R4Ess3mR*Rpq@p\4pdL^Q9J&5kTUEqq0044p8ab1$IR;bxq1 stV0gΜ,?`& 5gKe}ر8{- MKwj\!S,oxܱu2.$x)o'^"px^Ab4̙3c#Tiǣ2qyåcҰ\uE(:ȭ(|q8|󃃃x"q}e6\Ep$!`ddު:Zp #89Ur!#wjbNu=Wk׮!z{;;-A!.$d5(jSj466:Bk?CCCYehe\bn "^HU(,,˱|re1vyFiLErS8}/BDcD"2PbE"UWWGss3=Ă{k1Zii"gE 6яF9YKLBk"P Gss3Ν8*~aev0JDPCիWW_dX7q\hjj9UwB`ׯDZcǰsNDQ[Ln\rVƂYÇl wl͝J;!~Zر3gδ#:8>S\jU'2xFqQ[& /:vpJV\g}:wB$qmlmm8ՊQ* TUÇ1qD̘1 UƝFn4[g̘)S`߾}a"@oo/:;;z1~pXd|":dF+p=Fฦ:&>vw|x/^Ď;@DS={={t2ƬĈ;M@Dصk_nMe[&Nv2\ӵq< |Mi+лd2r(},^~%Pсʝ\KoH$;D+91sLn֘k2D ҥKQVVf]K\CS\d^}uH$p%ܹb^!0޽{o}LSCCRd%Ec /ӡi^oι|u' EKK/kkkkMgCҢ:Ξ=O>$~%}qfСCM; Mi[:Irȑ#8qϟKV'e_œn|'D"6Ccw+ JCCm\^ T %%%X`Mf\l/|.\o5mmmw>./R}}R?c7+e0 `֜HRА QI"Z|<#3 Q y^L:ǏG0D(Bqq1 cp8W̙3H$Yy+ݽGfJCDs9lɌXT$>EW7.zДHuQ\k@RD؜Ham!rt{:)y62Z^%0Ɩ,TH 9;FD{cog<:DO?r X!"`hoo}x:g=>s||F)mϷN# IENDB`traverso-0.49.4/resources/images/icons/media-skip-backward.svgz000644 001750 001750 00000004024 11163362147 025067 0ustar00remonremon000000 000000 ^~uFmedia-skip-backward.svgzY_8Ouٹl*[Im pl_K lv6s{' ZnIhܭ2*g.AuTI/fO&u:ʓ(+r5sLJ*qitWqVe]nQQQ.3fe8W$zSfF.=#xV=RUŦqWL j-FaaQ:Ih7ɫWU0pHb=Yۤ 1EׯwTh 09h*{pdN0JMy{:yR:UtMz @i.UXֶ&3)L`z!|jXm] ~7Ie`:|TyL)@[+%ї4~-ԫ Z]߆bS7*?@Gl@> F_}Ep(IgX6Aqe*F6Wn+`b,~>k!lJ^4yZCn*U~ԳsΤ>Q^Ahf*t" pP%1ALY4cAcB "\ 1[~ T,;Fe烲ea2]RH1x 1wP 1ϬDZjeä,kgQ)*dԟ_v;S|xo$)2ܔ!Pٙ]A;qq(.MqS 8[fb_o`4!~ T\R?CMW!: %ȕz' rh?\M_+o3wS-L}w5eoq- iV{q^Q)Gfn~6UFlSvIԗ4aXs@!)K1S!1$% fߙuܔ o}gBnjAo9Gߔt\\ ~oo SCoF{>;)/qMcmRo{vExhu1Q"(A6]^-z&2 8gnJx*D-Kc5O>M"S0XCiY4Q]^( 63mw S[X(40R$%q||0bR@;pg5u-xWv `YjGl3d uE*4כc*8!v rvl4ޫ_ 9rlO=  Xr#JB1ǧF1- X(A($CIXB:n@xτ^I)ޡ` $!Fb@1: Ћk֌"Jiã>[M Huzi8Yh.ǯK{~5g ?Jd traverso-0.49.4/resources/images/icons/media-playback-start.png000644 001750 001750 00000010470 11012072261 025047 0ustar00remonremon000000 000000 PNG  IHDR@@iqsBIT|d pHYsu85tEXtSoftwarewww.inkscape.org<IDATx[klT~޳g:ӹrUjJX$*%/[)LT6@ Rẇ?|Sh(GQ\E,C/sY۵׬=-AwV3{ykhnnCDF#-Wc|vځ9?v7xWJx W3chg[n?nlٲCD,0 +>Cl c6&c2~1;&`͌hPR>L.˺1/;"`ƍc[T#>spݶ 2"?oܸ࿕M6#w< %MHd2֙&nuhf5M¿6lr ذaC5(Qh*B:F2D*B*i7nB Fqi]xit]5M6}vhll!O&D"χc„ ;v%UQ!9fse\t ?b ðDHXԴw%MD4% P]]cZ'-7 LRM~G|gFzz6ؚ͐~z7b%T*d2D"X,ǃ*L4 a>`x5?R27|N$I|>]-r1-[%A!4qt%J'OFgg'Kiv`AVk_̇/]Y",ubHӨ `B xlZE|Bg48$8pAhg7Xܼ Xvm5#Ddx0|#A4[<CJ" N Q}DhooG2DAAA $`͚5㈨(.D"?>  Q\\lISm_+FQ DMooo/>[~A cU۶m>4w͋(..IR \t" 2"r… {n hclT6q{jX Xzu R)<3{QTT"ud>t>MSjQ 4bb\躎+o0W_=$>%~hhh`LYC\͛Rڋ+'B|a$rå>cǎO?m͗PN\&inhhIfi.A|UUQRRb1+gxϟ??8&N}Y+g'Dz0M'O٩=*r4`ժU"jS\ @EE @II`ppK|0Y4MaaH$H&rִj*OD'"*S#<k:QeN6o&;oj|/$D"8^~fRџr0Ms(}N@$ɓWORnݺ```>ViUsTTT +W,0Sμ{1x<D"KUIrI:y$n݊z$8i岙ΝD"aKMYC4M,@ 0 /O<[===رcz-~-$<r uE-qW,A'LMPXXh9-y DZn:tvvKHnrQ191NuLd2iIE1\8L&˅Ǐ >,*++m硊Pp\01.ߡy| ZEHhbt픟Emȗ78p8!U),,̹Í3gvR',fuѨѭQ# ,[YvK|K3gIJer| Z>LD4͉^Y r$3?2@^s\9$nD"X>#h,p-[#~嗜A0 *U 3$Z0 W!#G0zhL6MŪmUVVbѢE{gEɋKixOơCz6~ ?hXxq r`l-p\S>|U/ҥKؾ};H0g سg!Ƙ0 vڅ+C^T-~:N{KX 7o;4aj#C$ ;2Ʈΐߏ{/q[ YſuBP^TԱMnѢEV|D@?~uU^S\!lfyex8 >`޽{G&G]]]=" q1EaԩSPuY^]>}w^p;0+\WWP4I8g̞=~*p[GŞÇСCqUtkkkVa{ck].=/555B*?9qrYG8q>CNyvk7@]]]^5j(̟?&MM%Μ9}ի6yQ=[z⨭gQ 1 ԩSQ^^Si4SΟ?SNGooJ4/ADmH1+3uuuNDu"L&׋'PpHP1hhׯ_GWWxNd$wq%'9 lɌX/Y9{Y?M܁!o_Gmm(H3cc&٬Θ  MHh }oF.bnm=#?}oWWg_$/VǗ'g_ߖ꫗/c|wg7^_ޯ^7_wpv ׯ_X.~/^~s[k8:|o^son.^~˝,Xk?ǭg߮fn%!|ur:Hw%Q5k ۮs]rԛfgƳV{y9t(?\"ܜlTsg%/Y]?:^][Nn N9[}|rЏǃ|=Ys?z{z}t|3rzCOY} u7?ibݥNX#8`˫5{g{W×חk;zG_|O~A;?{:nbk#O []0v'6=#J׷_ :_>J}O_\"+?4XR* 7<_WG櫗\}k\bI \,*mAcF}Go.߷c7?k˫7"cߌo7Lgl, JZ[aۭh->Sc}I솙kéY;1#ɏr60Pc>i~΅CϷ0==1c,qNY,:~?WqgiFk>s~wkz(%mݓ%aDZ4q|=tKd=,ɒ{Xrh^rI*Z y=Wy|cIQ#mo_R{/=ۗ4ǒ#X 'Y5m7Kb{~~yq?ԃ`Φ/K{/% xL3[ݭ,cO`;;K5czoGG珞;7VvIr}=*IGPJ 5ɏNӝW_TGfo-ٓ?n]N3vohç- ,}*PP.85eaTZ%B,B amL@ c6ⰳ8ׂ^+S̠K}@3.%"-ڊ!5M!xL=֊(dB_1tgu2"q`jaDLX^T&Z-hA NZZ \qipғyo.vQ{-GdvEF锩eylsF(g&=A JaSv󉶆 D<0Bb@hI `:bI`$#P( ?b6q&M!mk؀C',gͻ;>~@/4g<3=_m_ݸ4܉~՛ˋxr2DL;\`p7W.N6?_]Lo;?yn[xi[x獇 |$w`v*]$0y +sA `&@"\paD+Ȅd_ k& XdrX)Tf-(pXGʗKǶT^$`Z V,h`Bd6u1D :lZ߂ YsYD@JX z Oz HPi Qz~RBǶc;, F|A,\@T FttfďpƂLc+C 74C6}\k Ѻj d n]#i`- i-#j&v\x QX+i [ӏ)E-B0S3@mXn]^0c[@+ŘJkHWl Ū TPRFXںy;& fK";X:hd mk%wi"~0]Ӥ0G $l܂%j3G:oƶP$i`(@+:X=dinMHE&M)cZ^ vpiVHsPur iLLi<LیgcJOc;hfJOhfnF2c0"@[C $3fcww/ fTƛA {ÜMs3ys"ún0֫i6Mef=~ij4j5D7!NڥAG T y3f)V~[irdQl,qPo.MUC @5ڌScdS2)eJDaeg~Z6v綖7-sg9@`8yQm_26EAgXgma{PM7;&Gn܅f䠖N'1,J<[8sB؄"ChUOD޺;$R iO=?:3oVS8m%p}P *yZ jn7,N.+=mH>Pz0N(pkmw ?%<VAcޑyuvګ/q\N.zݿ ޷?ݿ=lT 25!e&{cк>죬m)?R1ݶUlؓHhObL5=NL@Dj#v1pZ17a_APcsQCR`::T]a9?yGpv:׻w_]?]n]̀C?o&L:r8{:m;H;ޯ? AdRuXbq?n }s~>ayw/vu_*kϰ8!zYSQ)yeMlm.j:83_d͗}|< B}!):J3 4PWK[ i=fYOWPK,!@5.ѩl_%'̻kZ%CYIjwE" 9lAs}n1gwϴ~ΛFOnr- 9EyP C'Ty<9CYZsh=sq$X]?[r$vKPy|ruro}ʐH=sT~pZU>Y%.K:R ׯsHik Ԣ]Dy $U⽏~Vz}BoDhmѫ&Ν]v2ܬr 9Y4;ddAhY4!h{>dQ0ҘP]hXԝǛ^ jT`]7 YYjACSVV1 RT}YL-or LA1O-23=z[|WrtWE+g,IѝCRFͬug1e^ FHIPEw^Thy,0<ػE3Wo~L!E2.-Wa> F<_߼zxU`.ÒHjڌ 3vVT<|>39Z['T!$'=ǿ,ͯŸo$N V"5py=| wo;8Rdfs<0<6{31{L"d{t3,RQBȽ4twDQg_{FN|^'?3sOIˉ!?[r<fM{&\6\h13^?7Yڑnܳ3{kdn;O$ugz-T%0ȫlm6[OJ2Or#( H  'mPNC=vIDYMWfM%A%H9z!ͮ28ONdy){){#'ʃ\P 2*^]E#\kSx";``p%[<0rl@d7VIwkưxFjJ޸5pwj3#Vf `Ibqm( Xj w63 ^cxT[Ӯm𗖥,(FPŇxŜ&/_=jnZz0 ňlOcd[KnPvIw:w:"aߙ+A%dR. #Ț>"ӘIy}Ҝޮ4E[ c8fL$LRM*qΥ"g|j>Tr9~໴[-=`vz+=9>v7$ c=85ڃ$9܍+Hb?9fs:Y:Zϓ=bp64{ΧqӍYY2ygY"i'd,=d`b2`vQ}fS&bfgyWOo `*:H~r >u:OQ9t Np*>i?KxUXt@}bF8x#\b:_|eGYe65XRBXe91MؗXԥ(s%u)Ui RDOE$YaWcME&[*hj⑬.[Em5oY9~[ߞlcnL&oFK#pS78FAWw+;ooOOힼsҚ?g@XM~Jx}GN+@z Y^cVǵɔ+vwQk3*7ÌӸ㳫մ/k7WSW㍄ytL+~g}zzv~7N~/Otc@Sg~tݱڍ`n 鳦WL\,WlExlɇX yA׫}FN#3ļ? 淅-?A < u4 rcciI&bƤrU 2<+%z2j gyQ~Ɩ5Ydž [4[B-\urbf|^[Oj :"=8]ч볣9Ъ{¾F?۳ˋ8ٴܼƺҧT$*)g=RnN ]e]2KCD+68|,;g؋ ZrCH4!vH(C7{z]- VL44RAoPCфk@KGӊ؃4k]|T7*ŀ&ZԢt ZU7Y6b,eH>XqX:z P`Ѭ 5X9u7M{j&R/[T7d4U9} ë7oW'̫˿\\^n/;;y*凋MϗgSa!v~6FﰓwGWWG?l6>U_.í ĭp픀0&)JnT ꥲP hO T.#`IFDZ3` :RfF$ n=#XS:[ܶ^=%()]O)GAfO %܂=%XبmB=%X837SʀdL ( ”x3%T E2R=%1t `YmT|!\X+fJ@`)yYmbSMxO z;=%)f6A; )AgQ6SJ)Z2SzJVrei? HsmIN@Z@='X!$' c`͜L I7sZԞXZ`ĸ&9Ak&,6rRj94kB@5x3%0Pq͔״MRK))A/SͦzJ3M66M%9RHa$'h6#&/䔞HS9C[O ֽT͔TAIER⸝zJ0:I L,|3% n&)XzJ')A+|O nGtAb)oFi )J%35쩓`D{F3gky=#`m!cqL HP5٣;v' 姴6/W?AQS=u21'Z-c޾Nh\Sz=wΚgNooE8fuUGzji t=duuwǿɩ%~{U#w!<_ ԇ湻of?}[kW/Wxۏ?yrd/[/k+5v072߾7|Do~|X9؍םun oD~C#i]f_$9wu}kDd`oF Z)bm~y _/>]u:L7 X.P..osQޯ7^]{%Jf,, Y^B2?'W\^VpAM+)3\ݒ/}Qz7*onT TГׂ ҩ Jm "=wT;hMa܂<> й9`Dѯ9 {I:q^t-2hOkÍ Vk".`Rr^֍EDC##Y]Y3ZZ,Ϻl$1=v5˻KZ(p]'nT.fg c.0HΞj]d<~4v9]7R-_Z|/0o/ہ2 tY+o[+?b\c5GI[Up#$6IHc*]!tܤJ1 ͪFFU ] KBL7ekKCmoF_Į2|/f|վ* ˆNaDQfDR;SH"XcU-j 5'nf h.S\Pj F;[^ӓ"$jjgVL•wȇA 9Yd6)zS,9dJvM4fDNQӭer=9?P&sE)SdF ƪ G)]~~Eێax5CC8JQ<>*GGਔo⨔Qry)[yǟ։LG_1H㺋 Blm_6˾es!yHgKӪ ӻy7b@sh1X4ܙo&Pk_j)1$rL_<<]zow~ѯ[tTWXHHICEא'qHߘI 6fPL8oJPԠ*rδBi !J͈J6 x"iEBXGNP z$Y"cƒpڌ,\h`l9G5 +iIެ2HO1E6c /mPqe3Fqfjx,MN5Ѧ&DcBn8g`CzHg,@X i נ')Ha-zrT}R@^+^jfFO:{έcVdXZp@`K3d'YOj2)Q8V +(5yɠJ%nMFT)ܛQDGB K}ӄ2M<*]5^ҧQ^a7{re`u򎮈*{'kuLufiRw$=;C$$+j͵{ T2'E_,3SH IYqp`OiXtb[/b̧찈o Բ̔Y]Fѕ nDh  9zREQ4! g2+TPe`,Jp{T$>Yr#D4D)txWЭ@c#,ɽrQ:dccX{$LPLJ iBnϨi\>k5#O Xxļ3Lэ-,wP-9.PO짪ӎh\ʜ75t/m.=F\ib]d|]py:e ňr0&jik)R,1ݿUP Q.uKTZ)kJ qpȞ1#=t Oa ~(bX3x@.E6ѧx3 Twqwr KSbhK9R~5O3A-/LBM.a/(Я|ʍX,*;t( L鬉dqCy,f^E+8IQ\D2٬K iCX10 kX^ erENW+8wZA49bUUS3Lv$2`ix;#SvfW6='lNP|zj(2qS&daͻ 4N^Wa6e1lTi .Va_6>]]Aqw~_ 8 ]E\=)GV<#xG_$l56y]ar *%[)83aک* v7[Ʉ4y%UcHM8y^ ͶȏCѐձp& :nvvÝ1z}SQ@j=1N #8j+LSN$6cЄfĥ)gc ,ݍuZy'?pY2=4>-x 50nd13K-2!Xs+&-ZpgUZ?@>52*P9Zi@EtԽ|& ǟiƇ>}%EX=7Fsl!{kaf)m"&PAxkE h3bv]XU'z@ HW \-|#& 1ظ-H}\ L 56&oXs/)u-sI8wF T~L@PRP't 0,6'knhUcJ ŘL9'2pսarRL8{! O1fBDHYd_c/0fh{`&ӑ1PGiZZG͐ߌ)xe ܌'ۉ)f0ͨ"KlR+}6(0#ql)o+PMͷΞA1!ϵv>KG)v,` JRi *x΀^>!KC'њJd!CYj$ϲ< ?t.) rX̜&decBdW נ`ꄖ $)N,WSm}bXZa֕;Rp\ d7W_ !V!U2쮼Ѫ+%\6V~|6̯֡?;~g'-traverso-0.49.4/resources/images/icons/tools-media-optical-burn.svgz000644 001750 001750 00000032251 11163362147 026105 0ustar00remonremon000000 000000 uFcdburn.svgz[7v+zQl5/eǬXػ6d(zH69o LEj2ER!U}  q)?|__~<:ھ|r~/ǿ8]^<;}~r壗WӫwϮ=?_>9}=ͷWW>?9ڳ'O9/ob_^~Gs=9q__^]^_ 48y;{r]ٓ˫lɒv<}dTɓgLI|=f W۽SֲLϖwK'2~^- ݁6͔s^nN~~x lOb%f݌/O_l/_>^x埼Ƀ(oϞ~{|v壩}_4tH8ꡘ'O/z|{b{2?/|O/_<;9'O/Otrj~ɓ'g__leRJ9Vߐ!d?]=<=9|dNEDfeJBKsUS O/>[|2ӳ>/-yοr; ŖRGG'?4X+ KQZurַVcϿN+Wal׏?^>?.oӗSыӫg7P1gי|#H&6ą~%-_ËvJQ{87ߜnS&ܿ;( N-=ƶ_Z"s}?<׵t*tM``Extc [mD_[,Inӛeۭikӳ {o])ҽXgW oi?Q${V~-ĎwY~GJ,GN:t J C*VK]qUWMxb˜j^LU$o-Zpz֕ﱗaeIo0^Z+v|0-K{p|Ė7瓤<{>16 `HD@2'6FN S,\Ry{yUtjZX=X!k `+M(pP_ l vؙ׆ 8=FJ @C %>!o<|՜R&5a4@bIKI'@?l6t6]?p uigC9n;4qlIմc̈́>$DGufS$7StM,Ti첦Nޣi@.l2{!1AoؐAxJ3F2M[̤7įCN Sc81Rt a F(|(5{3݉ XM'MMt& L؀T&#s3`6&CE֛1*i(Ұ %` 8~YnV$Eo0.S8$q rHF~cA# uBn' 7ьӌDZ)mktE0/G26 F~Ј675҃$iikTW">ha;T,~Svv2GٟZX>LƬhݟ4Tͳϗu_|:7 &m{!}J]}aeʡyф<-M9p9P~:䆪Sz%!'?m]RzbgzͿm+ngK4%ž o)7.^Mg#[ẓ=POoTUwƺkvZD3FǕ^Cf~"?ᾃ7t||)_@h) cߒ>rc'P(eCc%#ѝlnϺa7A-b˱h)4W;n X Fjdj!bjjdizI$m$T=qGcyra+=mwME}^SQ}8-1KK/_V_We._,|]U+qb+^Jީ~䇿(b<-.zW^>J-}I O?}w#ڝg0]g> O~ fO~0zWt_ot6Ionz~00oüB 6Ci?iA"Cӎcѭzwzl򳼏O/JO kgۋ#ګ^?NgF7|R-7tLyq-84vaN96/.&O?zsoϿ{z8>/d;~.7STǏϧM3O Krr uϿ{rROL;#,#TQp]/WgW'䃻害o>z7ɓFF%8}|z3ҝ=~|O=a^mX~|Ч^y)v^"漗'>'%O_N`)OwoǏr]mO_:=pXZg[Q#ݭ_6ɣC}^LJE@oWg*L]v Z8r~5ia+xߞ^lٟ,.8Z"Kg1}&ӥYz/}]zZ?kT9wzuzI9zꉟR>C:?ˎ^Nnrq\B6rWc,}k衾MA憀[zȤ} ׭R4sx&s R{١^py˻3ZZ_,W㋛s_Tnj&g#y kG=utp{%\¯֖ze~6>6sOu=]n\=$g!,@%o5R6A-(J~Tf\ ï $" M?|4,xl9 6 R!諣̦h}o'~t Y7Ȅuz6M`DlA@6IAƒ S %8.07JBS5!T=xX5MJY* ܽ-0 ٕ(J,"LsaA$ f$ (Ts&ItHv@218!Znޡ09ʒvQXH&~ZAʣHͥZ앿ϲ :rURY$,(&7ƫXfoN\Ft;oZIl4$u1HIM@ԹpZمY!8aCF>`,ob646`qO<{ ofBR.5X஋qQ] H:DߵMFhZKڽ h(iSƩ!2E78z}IT-*?'l$]~u 87vUj;ڪ (!dOӫ=>BZ.t츆8 9zrq΁x4#|2=^P98I6t~Ԝt#'5p(6>8x6sߨȽ1OL:6vؘ Ԙڔܪ21MBS0?B&U@W)704)wF3wʉ6Щ&-L,( ߝtޥ/OW~<#`IM"ӎM 3x,F)%DQxi4 aCX@0SDg-w`of~͜ZM&S\P 4 FfnQHc0 HČ pRҒIkb`=i9C=Bg XC-{RRYk!3aSǝQWq3yqw2 gqй"Ԩej=z@JQO,fHiMjjbFG!q32!@ZR3n?_ ~g--| rh$ "2\}I#%R˱ը;6͒cxMԄF1VMٚku5irz%(scDǴ9{,jrCX ]&CK?M>)ƒ?+!w"<|-#"<{Mޤy󒐓 d)$nļ'l[#-4DT}0 EJ$aљ&hJ<`8m"EEk8eϏ- :) (F"7#%WYUYԌc]CDZM!\` qkScU# 6+m"2, rұu$`KұF~yVU+c`)'(\amh&M&]EK{-2ajXj *蔔E OFf%4 a##R̈ء8Qߺi9= y1R؁I@iVysVGO5TD=_Bri~8<{tL2 [ŵ@0XFanQwuŔ:(ulh>0B,a2t!ˁF~bP/ka~IpVf&;}h"Ysm9WE ,Ėd֭ w(k0c檬'k<2Ru>F{nI F@77Q7P6PV+&$r6}tr40 |(NRVcIkLƉ]L4I@Ȱx6nнNQ읏>Ȏ8e~VG]+qY/ߦR[1gi!Tw%NZƻ/])r@O"X7M0b*,Vg< x2nT7I@3qM7a{YS@NVYQ2N$ZBƨ wdzbSgReZ3*#T'q~R:~EGY;<=jq?]Ιs|{/]g@vF8de#) 5Nk1h >f^qeGZVi T v&P\%Ei Z ]`MAvҮ[΂j @eZ"8{ !rd9c.YФ S=Z xp?|=hB|--["NM>cAd "kgdU;Տ9MM΂ʝŐ{)K1u`3=h?!b ,dhV-MZcr*gB[a^@sٯR&ihi᪟K8qSOo  oS^K,X`}fTc2YW$x1jaD@*2K)1+1" 4 Wj*jcd68lwS+w4KgN))g qu Z"p,"a:[605|yPȭX$Di>t6 ks_X@$ܽX<ȄW[KFS"6PjA$4߄"c򪣦!f50Q< $&V8f[Xa'GHCT)(*jr2:Aca:V $YnfXʪc]آS]qjf'D8+G2qk $>!o:EsR<%>"d3U$׀/Sz?S ,JS4jVLtm[c72w{~E+q6vhduy`O/ 9{{S@cGj͘1;p$PsX"c'(b]QzQ;.sPҸQTTaQ(&d$ 2#=,Y-XF X2; RY4i$P0BhR* >MCF4zY 5ĈH:$YxRˀܡZ,(U :2η" `uVp0;d7\tgNю#ÐzqjMA#$y)Y^,tt.UdU-&?[H`VP10mE9-;SIY 戙th3lvJ4: Qg&KӿœU3ISDY`EnA<īY\0$yhE +XRݥ0, 'ӜBURE "C"+ Ld`N6!$CqNÎZBV5RA\M>-,0!FLYx0uH* 6"Ԫ Ih`H 2T/_5I D#rj1wXʱ]ؽ4p02EH: jb!;D-#S kP̶1.̤N: هٴ#-Qefc@DpǒD#-ufIC&EQ97ˈQ XdLGf!M|έXs0HP;tB0Dd7^apa@Ozǩ~hJ ީ𔸰f6H^eV,l,s|*GA -(gace섦_r^,XhZ8Qع`t3l@g z꟨ XPl@0.H9%g^&cOHV)JbBz`)i@QS6k%94>*4s ÝZdiJa6 t(a1c9[9QB Z_f:=k0VҀL6)4 I.B2:PA=U :Ot'4 p$FI@uSDLátz&U'+U4YX.[azK5;X58Qu7VXi֢u  OЍ^uc{E.sX̸̄V-bsм]p;`b1]S8h̭l%`!m, ˻#TG)V+l1 $guKUX}w/Qya$|Q[Xj2ٿh&6Ar"&%,KHpU1bPLFUM1̓kꠉ8w04"zuM FV v,-E Oa $6X!.).>~,4St8"<AO|)|hj[w-z"5s1YP˝yA&nJg7a(Qቡ6u]vh/Grz^ پ/hK2;/@oWKޝPe~9{vYZlx- vxj2>ߏ;%a``zP$-oJGMIJAKvr ~z c]VX$[vXeڭ t"RSafk9ʤb3~ЧYa+sM3H^{*5KXN"{1*na"p ye.2TW᳾B.R3AASFYL``1=Tt6P~-zz5`|r,D/w!*jaOBbs[tP{钉{ugT,;}4]KEj` $% 6iX w6$ <Ý~- :EL1a2zby/RMy.B[շ9 %=e].H]5l{2ӎ M5+o]혫۷2aR=l Rn\vS)=Lj&ZU/=ӮHaRM{L8;N_ԌgZKg Sak~3Eկ*ughL*hOîqMQ(ōКrlvz݃M2 gܣ(-ՇrfY̨'EJk [+lD,ty!^U+nQk;yP2ճz!#ul?4Yv.&g] WSM4[Kp_/ I&ڶHu @rl+2LUDzjjOR,t$2r%VyP:2<(eaEB`aJmd~+KVUds^dYE]0=kV.c M{1Ȼ\U6/k*ʤ2 G-k#R,KvT0k?cՔ-"4.ݺXE-C JMY9Ny7{e) 'ֈCiM?f"]=2rnHz`Q)[/&x~&O ^p=: = LSlT nTo&=rQEFJ|8\HqXL ,Â6Ѹ띌Sq0Ġ0j? y2@#Ԡpt5q˅ aA\V]T4jy`~CšY3-h:HSAiZ\i|SemQC"uԈZt"(35VIXU7lCNW;mѰ[*fdEm]'ΝjS U QEOP |Մ5b1D?c# ,ArUsz RnpE9u%lS1a'!.vàC B!ľU2x6`18,,zkNZ%䃢ֽ?F{lsC t. v4^ hkNWf.Hæ a'3rpg0 #ּ\oQoe+{p՞=pHYTd[oha`}<UZ/X Ve&"e/FK=juFb4+B3[{JkLgidݦi(E8c0"ph.&V U5PO(;<c3رxZ(64.IN0|YlEzVcq:Dmf[ Edd "$Pd`i.杽ܫ޺"7s([4:y ٛ5ӟmf0S$n P5𧰍JᄻbW"R*%N}&e:i.vf"Dn.yOqP,g0dzE.itsEY²Uh4j0-`r,ߢ: G\6f芳!Lt]1JaV}5zVKGNU.GDkeT)Ay}ZNaFzmRS[Tɮ\ /& auX4T/j"(7簶p-VʔuQ\8(rYdd;孋HKAsj>hG;Ģk'z;틑j ݊l-jfTÀQu5\L4Ew O~rrp޶dɉ-H V,z0+YcԦb R✬pj)Ȩl.%UFTk geZ,ՠ ?" |(N|Pa/jcs% SeGl8%}A-)0  ܮEԨ0cbGdĭapr.B;R3"R$lP]ee]؆:A[Tg}{W)+,A\- 2L {l(YyWm\g"\ZND4 fx2J(w0ssu5c fF E -IV܀z8MaZ0}͢D3(~FK CS-Q>Wgme} ]lB<?lQ٫Rt,LKN6Aֱq'x1/[e{xq/`4E3{~_~O_>__~z~~zlnϟmtA~/~(E?~= 0|ݿ~޲_a|7`.]O|_'Oݿ{+k~6%w/O/aotraverso-0.49.4/resources/images/icons/traverso-snap.svgz000644 001750 001750 00000005425 11163362147 024102 0ustar00remonremon000000 000000 Z[o:~к/-֖xEI-Z]l[bюNmɐί?CH[v.Mt8pHj]ɲʊ|}4d>+,_>z7#gJyv%gjUW-2wj2T 8DB& 1vyl'nWPW t$NF5:~UlʙCO~z5N֩5L YLVlCnk7JVpݬr.z2ϖQL%fA*Xu(͚df:_ Mװ!lYA,J 6Ы ]tr(шZ;(mPuZEg J ^_hPF;ˉq&E-2X!-Lj'rɖq IL m9̊<%dWDaت.֭vAQ_]畄ȪR6(y ZV尿EieBDǔ.*A<)1=d7W (Q҆EFtS~(σQDE,"%Έ`Q[e)!oz>I~|>)ﴃZ#q^ B-F~F&c fsmUwQOh{ fD Mc~g!&D"MgHEHy8 "좋C8 Pv>(5$,1 k<>y/l) v{\O6U%?nfw2ҷ*msh0 ٧V(A3~k9:w:Ey9WahX,QQ@H !A>V c{8USARfoP 1V28!Vd1M%)'@e<0w$w!XDdRq,I1z0|_Nq&amu{TG,PUW~!n8d!pk.LEQl'w @tXJe&6mT:mtu9vڐ?^]&iq}>"7Eԡ;}@kAQ'ynbQ, uk뤾<DUs3̸7:pzX,>GP b(bmDAb` cֈD\^Ǹkjo!\3J eJDMy,zVO@pvtՇzgؖ`̝2={u ]']'`t&U7"콘.:EK eևXZ;XdMؽ\>r;9aq3c){HXG(R:ij MD&o D b>k܄a5qGBӝksCp!J̨1j l"Mf ƺ<%0JE RAizq"ȳn-ZR &ah$ !0A*Dsr6HACa<_칼9"#. Thf>!u=0> !Rx(Ϙ0k!ϋ':RѡkE:S%:LbYʩLzxO.6u}@y&>[+ex"0[ p\hS ps;uZ_J;"8s &˝NL~`?&@R/6o^  sz?~ӟ{gV059traverso-0.49.4/resources/images/icons/32X32/000755 001750 001750 00000000000 11163362200 021064 5ustar00remonremon000000 000000 traverso-0.49.4/resources/images/icons/32X32/audiosources.png000755 001750 001750 00000005004 11163362147 024313 0ustar00remonremon000000 000000 PNG  IHDR szzgAMAܲ IDATxmlg3;;oǎR;NҴNDIJZFKB Hr+~(BH@hJDQKV@n))I71mnc{mz3;Ç4(-M_zsO?37zJڱc.0>c`0vB2&KǏ?zѿ՛w xGAAeYtww T*XER!]WZ-D",#mc6 f4fJ%r~ȑ=3ؿ˖-/mڴ鳑H^n7aP,)hi(~~?zLh4z駟~daa!y3g}ArLLLYXXX,RVm˅匿A页]י&ƞ|=L&Axx޽X;( 'N Hi@ ò,4DX,F<0 &>H$(^gtt{îB .\رc4 |>l۶ATU@u&''9{,xR`׮]u] ŋ_ 8zhi\|^{5E!aoNgg'$Pש\.E4i4LNNֆi|>H&߿@D"t8DQA୷v N1 ׋,j5t]X,De,tttFٱc`,YQ2L@ iaT ۶QQ, Ah44M<(ގeYHT²,r,k:x* ˲d0MIp~aBUUDQD$DQht:QoPteZ`CQRT [듢lm 0ժVVuB>UU@udYfAPdbacTYv-ShSh۬2{~[/-st &R>_Fׯ_H\VqFPUV>昜dhh׋(e^zS yC8q" "5V(֊LcY  ~3/_u|A\ ڊ,y:$]<{uw֨cX93Kݕ) j%>͹7kC@6>|:}4'OdϞ=\ɚ5kp:WB8x9mBHVl:F2Э U!kf)_E0)`pMqYz5}}}|>N'$!I,QOR-epE#I$S]d@ddL2_YڽgRq(8k.+822) .\`vvfxp\\>gʘ&O/ΐ2f(Rer 4*Qsz9v[OUg̼Fݻ===VVV8rNUUiiiVdP^a6TV XaWJ^?G}юSa HfWW1\72@z'ؼyH$r$ImK|۶l'E o-@gS9c'',8P, ДE}? woJ$3DI@( B~#R##/H*/wG ?FYBͷR0H70ji˲ҩTT*%2R놿4FӚ~Xh:B> U1aXi튩;!9k4=_*EODX8ۏ.9|eh-E-ɯNW'*df)>&}~ۛ\><5$It^솃~GU3,VQP{mye/͆6J3,䯰R[f%cݣ$2Gњ,3nTѴ[F_=rsg(IfbÚ.Z*4 wIOx*N.*D‘/2 0Y5Ýjqv1+P:f?Ǻ@~?~rs/~Y1Zޛh5ںwm=lXN.N?w@'K1w(h.SCOP#NobGN#<~Cd~T9J7f%kw}-+/>.ZW> W]ZIENDB`traverso-0.49.4/resources/images/icons/32X32/advancedsettings.png000755 001750 001750 00000004144 11163362147 025140 0ustar00remonremon000000 000000 PNG  IHDR szzgAMAܲIDATx{TƟ7o qQ: LMѣǞhON\le)(-NQk,A2pI yIB?Lb8n׮]Ǚ9{ڵkee2٤Ç2%"NS'NMM]RKHxxx&""㨯\.]tI/֭+uv@c>SQQ~2 p8̙3]aaa"o7Xb/JrX0UUUX8r/;V,5k\X,h/"@zFFF @SRQIII#x&¥޽+߶mOCBB^~E1˖-{W*n7aN'x<t:aQSSw+#*VcD2H$EqqhxOXaTww7GP<ޮX,q[l˲+ӧO_NKKރVx,X ͆v矫`@ԩRTqUnӣS:h4B!F#;rE"```ʕ+5M1bvDݻOIՒZ׫0G$ ( ;KVTnllZjmm%NG.Z}?%%99y~aaQQQRIN'f3aT9=vqDE<_-zٳAȵ̘t8=x)Ngkk/Xf_|}:J͊O/!rV Z;s~K,YZRRrN$tCL0|n],C|eLd\|kǞ/U ##cՉş0 ߣ"X> ~~Bx/zB^:+iRh_Դk+ y}q*MJJ+2 ^>Ё+Z.4Y87t;0׏A+_ԟ#ɢ%IX,NRm)))oٳ]j5\]&IH(@3 ges^W( aDGGx^B4R_R%$ uki{1M-d&sgss0-&/@>U\-pX`DM ^-p'p_ .0] $șj9xFm5)uS + |YY6(˖X!R[-wsf)((аʶXMM͚D}}ciJ(44lKU5 xiӖSRbਡtH*XUVVdUUo---ÉDb{jkM6 3}zGd+x9ംe>|';vC2^D\\E,E)eD"]`A)4 }<3L`X9h?p!?m@@kkkr=0wλ: lP7)cJ9tiW|7qС{]_ek`zo2x*mXzeYf2Fkצcp)(˲yNӴEe}ol`ֻ`.$ܹp8v˲f>o>>. FϷm``09`m^[<`1ߙ)'iZՆa|olI`ӅƍX,VŎ455m$iPԓֹc_+b'{/^ocmә}~MUWsss*sҶm>8,s̷Bdm3f,-,,l \@ >yr>p%SpݑP(duݑH$q}c>Ƌٔ3xc(jݽ{weY':::Jt]ЦM`BA 5e,77wYPR\Rp`c)cIENDB`traverso-0.49.4/resources/images/icons/32X32/projects.png000755 001750 001750 00000004065 11163362147 023445 0ustar00remonremon000000 000000 PNG  IHDR szzgAMA7IDATxɏ\G?U~Όg6v/لb!p )B!B$.8 K@$XN@mb;{<3g<ݯ{0;HWzW}շ~C/~2v4 ÚRPv0333ycSSS<|@RIך˗wƾ՟K/f9s&?v{QXqK%iڽk׮OMM}xwޞ`yyuΦV<+><+ǪUzuu`/WD^\ZZsg&>o:>-ͼ:qπwrҴ|uDf?=%3mco?lSNʆVTCE1ԄPBBFʘzWnMA Pٿ}(h$L]ks1)5bOQ@iKR4 lB?鴓[EvzQnDnqhXAMfZ(8Pt삧WYP.A!*jW74 Zܨ4 h%6*$p9(h58.xz Є7PAir<yN٠Qx*(,X4NZ Y\pQTB`,9ݤOyN^'&(lmp*c0XsKn-I/CGH+,-W&t&2TaDpLAedyk-foۿ݄@8{Aw"%E#he  \sN{=G)iRڂ5('Cָ8$h0feYQ xIOO)֗bef^&Rw_ S@eVauPhP"ec Enhkm^ ][G<k4GFXZQV9 BWW0nnGFDAm2[l-Ɵ_;6KQX9vaEơehS~۷8I߰x8OcEڠ@v YZf}E&NalǞ%L,DC2qEP1^[^uWj&(0.q5B aT°< M?=- ~y˸뗊n-=ñ9fs>9K'[f?9:`L)η__9j(2GQ>T4yKKTp8IENDB`traverso-0.49.4/resources/images/icons/32X32/sheets.png000755 001750 001750 00000004244 11163362147 023106 0ustar00remonremon000000 000000 PNG  IHDR szzgAMAܲ[IDATxW]lٵzw&&vS'rla%P MS)DU *VT$ wL&3 ~@Ν;8q"HUUaPul, G$!}۶m;_mۦiFA{1J[#oދ/jkkim,y+++3(n BijZKٷoߨ( yp\.?躾PFFF~wy48R,|>Ȳ}gYx.|8B駟.>|xO6ǿ90<<#G)LR B\ׅ8 0@,( e"y8Q=5u^ti zGOR~jXYY˲#<q,~?xض UU88KpNx~2000H$H3i*ʍ7 À,˰, 6mxm6t]|`ؼy3,˂(PSSS\N0D($Iغux1.w8J)hi4``p.DQ!ey(Bi v؁rZa(ͣW9l8|>y{ xF]PJ2|;۶qW~xD,%0 \LӬ|>ض" J)TU}`(a*!E3~5 qp]B,fffgmDQ giA9ӧOڵk, `ll dsa EQ]\V#r8<σR Ap [b0M7oիW+_i`ǎåKqu]hiiAJ)Kz4͋Cj5 X,bnnd`6lid2ظq#"._ u{nضl6 IrdY^㖗/yɓ\HRrv#~?t$IabD"MLqFF_jBVWW155|>h4na ݳ^Cex]]]uJ !gh7ߌWy/---vڕܳgP xǭ[011I0==}X,N1 I_Z ^ ˲tXegL Qm^34 | >c$Id2_Ȱ`RPp3M9{,4("ǁ(PUh]0`6Lӄ,PU՛E+Wpq\z7oF\.|wgv `C2|^xyݻpxꩧJFp(XFl69bmm PX }5M#o_=ccco>lN8mmm^;4 Z (J[[[.fggO_x|P:յ'U<IJ, À0 à ÀA "xitii\. 7 XD~3H$BQQIG/R8UURriYXC&os/ 'IRO0 FeY몪f8dr1!߽ /"~_9U 9,hIENDB`traverso-0.49.4/resources/images/icons/system-switch-user.png000644 001750 001750 00000010642 11163362147 024665 0ustar00remonremon000000 000000 PNG  IHDR@@iqsBIT|d pHYsz<@tEXtSoftwarewww.inkscape.org<IDATx՛k\GUǼcG;/z/2BvSbL-7+mju]IW^^$[W]/^Om]%5}[o?7$)ة^b-M[w{eoO&'H*0G%@Hm2@Y#JPtt95h:Uml[P* T+>GsO ǡ5βDl@sղ]L% f&@=eYi%Yl͊,;";񦯬Xyi2:auK/O=_BG`6A"hf23ʰtD~ޖf$N\8I.c23N1LѰ>3uq;A2ĘE/Lrg&ΰeƧZo/.//OSW^ʐIeh_َsa2@ [@iE/&{1-maq,zGIshiE*)N4[m7('O7* *eUV]г8{,7cl3^aJMʅJb6 UR p-q7"S]gaQ\ر1nY1h1ňٱ[ԟEfYi ޲*`?x!cq&ufыf(W1?Wi^Akk+/|2`* jNr{`ǎU~r^{ "Y4\ThW~5v~k_~Cg]Y0K],A Юfeض]<^+fIj5@9ky?p#gy,ET,@uÀWҩS,i <~4 mf$0xvp~O|]-XB) k^oد0alf 6_⎭wfjes eYRJn7/Y#Hâ-B V,~Oص 7d APR.X^H`0^E]Rm,aS@WOq~w6Ғu+HA6*,$D2d";A2>7܏R*t޳kw}'cd`]uպli`nubȴfOH. ǹw Q,B FP(Px;BQTELܟ$pQ{]?g88PyGO|Uq XMۣ_mɪ<9h`%:Xߵ(P"๋1xqJ3fȨ Y%oL(yޞqVWrs 3e2KĹȹYTIJh&hɼ7XA<ȌayuUDpQylCC5*}sG>3}_KD"Cџ0<)҇UJ2@SFe{y+$ !D=KGg$cz /۶C] }|jϧy%) Zjki7GbA(շ#axTF?f{vug(uww7t2qzs9imBy~@͚E5U#`D-&zpA~THmѪo%嶱y}s;$T|T5Ex :(=m)EFN^U [H%lyS$k\Pxeeصl]  _2Ya"go>(x~eP 'wqzظz#H$ _ӑHRJJhnCHZ\u[~E@QB<8 3lݺu|wẔJ%RnbeD">p;H=o@`0!lmfƍX~># Ujfb 7 ǫ@JQӠ<!;شiӒM=Ev`F~g>r!BF156iZ(BiunioAP)J\4"+0-,#UTeYDQO,X] 1&J| K",!H$hjjBJPF91{y+HQBÈJ!>l=V@q+CH6 nEZJn67my?xo"s\ !GytњӤ]`u|kǷpeYu۟?9D?ay$Ha/ ~1/ 7߾.prc23 '(kXF}4L;>·}H$Rg2; 0 O; VOw{zqj?1<5L.PgQ!@o0m  ~#K) 7e -LeG ڃ1~B r+)345Įv}0@|̝;4 P^ }|lc ~?l 6-)dz1| :`Y2:?X,iH撍}y0<H={0av@#:߯${๱ضm۳4?f׏|f6^eDpw>' 8hj4FRV~WF" Fijjb(5Įo͑[;-KXhM)M6sگ'`r:4y~ ÿ0]zjm?ɲ3r tܸ*bvB|>ڎ-R%mkƲ$ci%;`vPa/M .m7éSO;m e@ͶXʼn$ű;>m29S(Qw( 4xع;T EKFbPrmf `rr mf=v?M+[ iJnW( + Hk>%-l1!U1z92Lѐg@dm;[ȾV~=IuZ]R(w-WWnO!B"V!$J_4)|~kWSZ X]U L A+J+r]q/[3|Qi&'>}$D IENDB`traverso-0.49.4/resources/images/icons/media-seek-forward.png000644 001750 001750 00000010664 11163362147 024540 0ustar00remonremon000000 000000 PNG  IHDR@@iqsBIT|d pHYsu85tEXtSoftwarewww.inkscape.org<1IDATx[klT~޳g:N iE.ښ$D4M !*)%0!GlT<%~'|Q1,jZc X\NY׬b=Z^ZfDٚQ%L藎댱 ޲e[D@-xs/;FΝ;=D@=gQbw`s }~߶nݚ#}曌VhP)e.,v@#c7޸'D2` ,??8 ;";رc2}`>4Mt:m!kvۇiY4)[m۶km۶$ JMR0MdT T a(((G @  ahhA$k`&t]x<4 ĈZclɎ;o4666x!O&6D"χ)S&M*40*}>l^+W_~A,a6 뛚>C hllt.ā9s&&MdKLHo$D3IR":4Cz_cL֭[Dt1ݖN*B2D"@,AUUN 0PPP] pJ^<ঔL&qY"L0 x<nim;wK6CeE$ [O>$x x^|>~[EEЪsxzd?S6mz{{q)Zev6ʇ/lٲ"lub0M ,@yy9 @0Daa!<Sb7UiH&8w:;;i|>m$2mussG-[MD ~dd(++GII |>4Mss1ĩ/K0ʵ/HmmmH&((("10Yl޼y2%Upxx%%%Faa!0~x[\s%/y2k@ }6~p1Vk׮P$A&@$WcXd ك, cM$nύ"䝋S-[xƍøq7 iRZ`&bb]躎;oư>,lڴf9 qU[p!j/{>M8vABu|>|>L4 ?=^B9qtyӦM)8LLl8_UU ~̪;xgϹ5²,L6 7oDoo*olܸCDMba1c @iim[8zh0k 0 ̜9a H L7z 5DTR~^uˠsI_ى;Zճddx^~̚5KiDTADk,k(}N@II Mχb%x#ʄ'W6JUZ!Nicƌ())QMj)g+H`x<())U_ϧNɓ'Jlo ?x ڔ$0 ̛7D‘.[d0`YVeY.Y@SLa(,, ^l'N@OOϘ}qI%Ia8p 뿲f~G4 ǃJ,-` Zw)hyy94MCaaU8~~޿?9 pݶs|G|!N9F-oݺeY8Ǐ5kPZZ 0lO鱽ŋAD(//I@GGCa&Ξ= ˅^nXN.ӪC\"+$?YTQb0MS,FD@ Lre'*DtږFGGc?~N ѯFkk+\..]4D؋&2› @1WJTn7. p\;w.x P]]=؊rʉ̌9s]h4ADQAA`0A\pLtǥZ7Nn&*.$d;V3 ŋ殁ȭa900/]e#f=Hpj pda1B!y'/Dׅ߯Q|c hTO+8&#^qoժUBOB! ʾU, H$+ze0kL@Tɡg_aպur,8x]>^LV\e˖)%d\{FD~׬UqL/$u6lիsj '?X,+Ww) c ۗ@w1f'F<)}ݸ}]!/f6UF+U=K^sb)xK ^I@f!'ahhq RY!6OT /^ӧ?b``t&Q "Z?[LNDu"+z裏)))A0c @$A$͛7q9oy]&@&BH#?ksb BV0ƚ_ɐA)Dk /N- yh-cWgE̼Rg-g:jP3jz IENDB`traverso-0.49.4/resources/images/icons/tab-new-background.svgz000644 001750 001750 00000014204 11163362147 024743 0ustar00remonremon000000 000000 ]_s7OS^!@9V.l{Iퟺ{KQH"u$eHF3$=)8hFO0Owד7|1M=E't8Wߞ?b9ٴt:;w?z`YNގO~nʓ_/7۷oxfIj.\$.ߞȧ 5.J5]W?M&| hPv> 夼.EnBv>pI9]$[]'t9M_mT U%臲D$dgMan u/eYiˇrz20Nf0,u~`|4\|]^/Sz<4ȇJ{p{4UEf7 qT)' S׼lx1X_Ϯhf<꿜 o_0\?{wUNb,'I ţ7-ߪ nYNJW2ʻ|ٻO!U-ϻM"ŵRwQy߫a)૲PXzl2)A%wMWaoLb1Lsr۱8lx\k ȗOO;JiVFf+RfwMp^l~fa6F/g2yϫF/ ͸R 5|u/Kg6F#iT52e0_Ռ_zV.ߣEyEtu0rͯ VAu}Fi<-+Eh`9} =,iw\$iCp֡ih|"Dt=gbn6 Ӗhtֿ}=^[:_;.㘳 a$< ZW%TLd-Sa"flK{暆׈a޲3'+hgXH94._?| '_t$[S2ZDIJm:Hwߞj{ZWrT0T[ۓ}rԗًXfFVGbϜ@CxF~H1Mb ΅!oL\]G}3b1F.F.$MN!U@9DnD2D {x+8){6"Ъ"Ԭ[%(a 1../%<N[$wdsΎl97D(JٳknLa7Qt|4蟢s׶,V!fY{BJ0ʊVHFw,(Z0t3{G,8m뮱4im۵ȯ{pn/P}v`h?pc[o5^evnPBg߁%һax]":mX}x p0h\A;\rL#bߺ D݆յu9A`b>)Ӽ$=F-ǜwltDh?e; GT6cJiB6؝O(ag(>(]ohp JDJ ~U-3{@mriX#!XDVSe-e)QFİЋ #l[ԠD־ fBWPjA+HYpQ,P$NJd%֕:UQF2MjDg7bn3#ItV*xM L,qF;{dbN1prV^=VD+,YR`@+@䤬 9mkv yӦdQLE+$R--EDg~g@4ugϫlYw@ *vԔjj[9ud "J/ EX%$X )޻gϋfl}zVDaD]Ho-eHmSIHokY Rg&TQWBZ#wi,Prk%΀7Y$A^o-hHФQЖ>3gIkqs Qء1(]E4Ž3xLфF\Ei\VZ/َ "?rĠ)mB%YtX0:@,ag)Ü}M Эh[1րyN̉j;P˙ J>(gr&`V$V$VNʢ-6(kpSki/3L X XĊ|ye0rh 6}Zˌٚʹy}@(Aev9`ǏY'G㇆>f:y3%x8!#Y@|zOzۨVh(g VZG8; v ^9P|>O/O;ƜػɂdEVB"8o$ji/kilG坜 Gh+Pd5Ye8!pe,+hK޺\6CGp&2֢*m8czֆ t`# pG6*10). ^[X'8ki.VWzp$P0i MJj v'QV?| eHzQb2:?&ZYgOVj03`%^)fxA-V M",?WGyhPJT{m9#͇.ehk,%kVV~kv]WiAi ђa\Bt#D9ޡ$A=z# <8JIpAAZ>Պ!{]ƿC 5?|{Gd`33:hSycxZ{L5q8MfBuw.ښHxC@՛$]8ञSM[A5YۆI4hˤ`}qwWBoA]HqՃ Ki 䱞ѹi !(6%Z2l4GlRdYE_W^嬐E> .[» :1;=Dg;WjccQJMW?~ NkZx=N7dYG Jj쵋a"a $\ D7${씷k s %_v6.n7J'#-.RzD[+1!Ջ.w *#`Ж=. wN4(cOH+9D0b g1Uc~Q?;s.1ghDĮddE^"JJa\BDB(!v$Q,"*2RНG2j[2H. yi M_+f}Ii؇@|]$m͒TOQF%X?_+o2 M?ĻIԛ&@Tm&ݎ]Ns|~su2`uȓLn.+č oF"H{;l|p!>-N5I4lj@6#XeHҐG"u"x}̤qHOxF]7pȌliΡ[Z p͋`?t_Vp}{B4 Nw8eY,U\cNwbD$| :HZ`WJ3}tu/n=+Y?Jɳ0+d|}oQy~z:.Go? u|zE`@(܈FqWlj87t7!֧V06Sy5-^YHN&l1/ԤvkG~Eq~<UuA#HNG{Ìg6-MH0:+kon5_F¿q2]LVNmow8/oŪ_^IA?wyf>]*Co.r|.,ucOMmzɝ N"97~Slmz0/+;nJ0v%E[XښTIkRn?'rXx:t`U}mnk t2C<3$9n!'" A@T䐼=yq̌}h- \rLl΁ ŋƳߪd_B-^gD4 r63<7h9׹Y#K̭fev_!`{9ؤBd.zf\SE1[C5jkbscwU+JĉMvO|ZmTF$pOcJ 7dRx:k ?ٙ_77֡uћ-]Ddu8Sp3oB+ x*B;Z,~6`CtbK$ ZY>|㉞N5I;|MG, 5r{| FkRFkg_Oq7Y+cIZ@gxè긳%eIlVFq);OMfZ=Wy}Uz*pJdN~8hPs*HVxOz**S_ ]%dj *&g+.TWYܧ6g'_\{-RE\*MdkLϸ QeVWrBU֗z;^gg=hy>z kԧ/ʿl-H.Nu,zt1TOVјBjݸbB۸{и8mֽ5sZlHgeAV0]ݤtoՐPXݚtaW$v]7~Ck'O"ښZ_$me ;d,{JgYp<N*dO ӺJWQmIcy ,pC6o-v)TqHCp!I+,(HE/]bT=1F8UǜpũV6V<pH>r hAn׼vmW49N image/svg+xmlTraverso Document IconBackground page comes from crystalsvg icon set traverso-0.49.4/resources/images/cursorFloatOverPlugin.xpm000644 001750 001750 00000003675 11163362147 024321 0ustar00remonremon000000 000000 /* XPM */ static char *cursorFloatOverPlugin[] = { /* columns rows colors chars-per-pixel */ "32 49 6 1", " c black", ". c gray19", "X c #524152415241", "o c #C46BC46BC46B", "O c gray100", "+ c None", /* pixels */ "++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++", "++++++++++++++++O+++++++++++++++", "+++++++++++++++OOO++++++++++++++", "+++++++++++++++O O++++++++++++++", "+++++++++++++++O O++++++++++++++", "+++++++++++++++O O++++++++++++++", "+++++++++++++++O.O++++++++++++++", "++++++++++++++O.. O+++++++++++++", "++++++++++++++O.. OO++++++++++++", "+++++++++++++O. . O++++++++++++", "+++++++++++++O. O++++++++++++", "++++++++++++O O+++++++++++", "+++++++++++O O++++++++++", "++++++++++O O+++++++++", "+++++++++O OOOOOOO OO+++++++", "++++++++O OOOOO++++OOOO OOOOOOOO", "++++++++OOO+++++++++++OOOOX oO", "++++++++++++++++++++++++OO OOO O", "++++++++++++++++++++++++OO OOO O", "++++++++++++++++++++++++OO OOO O", "++++++++++++++++++++++++OO oO", "++++++++++++++++++++++++OO OOOOO", "++++++++++++++++++++++++OO OOOOO", "++++++++++++++++++++++++OO OOOOO", "++++++++++++++++++++++++OO OOOOO", "++++++++++++++++++++++++OOOOOOOO" }; traverso-0.49.4/resources/images/bus-out.xpm000644 001750 001750 00000000454 11163362147 021371 0ustar00remonremon000000 000000 /* XPM */ static char *bus-out[] = { /* columns rows colors chars-per-pixel */ "13 9 3 1", " c black", ". c green", "X c gray100", /* pixels */ " XXXXX", " ...... XXXXX", " ...... X XXX", " ......XXX X", " .. ", " ......XXX X", " ...... X XXX", " ...... XXXXX", " XXXXX" }; traverso-0.49.4/resources/images/cpu.png000755 001750 001750 00000002031 11163362147 020536 0ustar00remonremon000000 000000 PNG  IHDRa pHYs  gAMA|Q cHRMz%u0`:o_FIDATxbd@*o*?}ߟ?^M 9{;8ß=p#_ן|O⻋`zԒW6&~6FV0ccc\@ }}P@LE) 6Ro~2|zEk@'@1XߞnYj" ʲ@00pꙇ r@g30:|*r''5O ī} "BtTp;eN =SqS { VE g&FIENDB`traverso-0.49.4/resources/images/audiosettings.png000755 001750 001750 00000004556 11163362147 022647 0ustar00remonremon000000 000000 PNG  IHDR szzgAMA7 %IDATx{lTu?Ν;:8}0 Hcb6fp7f7&dqBbl4FlHܬ@(X mHiPn[:@_Ng:;;{3RM{uu5$( 333ƹs. }<22r8 7nqKKKw---[7o쩯'Fd2$IvS]]͢EH&8q8r'NK4ذa?m߾LNNd( dBe*++Yz5s&Cw= Į7}`0'x;vH۷$$!2ݎf!I\P(ӧZ<5Xlxi  {g^غu+8p\.De, ټ`X,V+vQezzvV\韞822rH=O}۶mg}Fgg'6 Ͷ$I F jF,#i&~SSSzΎw|%bGbZZHbA$DQd2C 2("V] "#"֭CӴɓ't@ }Euu5===?)ahFuu5x^dYP(cbb]ENeB+V`ƍ_}ѡk`0F2 xaA ˅hF>Ge^/~A|>˗m}WW׺kZ[W @mmSNb2ixyqYu^~'2SSSDQĴѱW%CTQ#_@f~^!( DEQD"***Arv(B$a||܈D"gĖտy?]Їߟ…KfN;:&@m+r90H9b1~?mmmnt:P(D<g```P(J~-U?|u:]~_~shhwUׯdf_fy\5illٳ\t UU$ŋl2h 2;;0clP(#ܢ(wyG+7lhEu2b9%TVzy"(bXEFŋqz^Μ9}.Mlr,l@c0 д"^$r{y^eR.]LOOd8vn"innjպ~ ^oa4Mɡ4;0񚖦X,277(tww_8uԳaH6=wΝ57+(W##Z\Rgpgȣ(;qLhZT*IonɾDԺpXs@@Ȣu"f䩱Tw*kW;$XM`x♁ }(ƒ`̼'r썾F )Uyև<6\Q]I@Yz;QpΣIENDB`traverso-0.49.4/resources/images/cursorFloatOverTrack.xpm000755 001750 001750 00000003506 11163362147 024123 0ustar00remonremon000000 000000 /* XPM */ static char *cursorFloatOverTrack[]={ "32 47 5 1", ". c None", "a c #000000", "c c #000040", "b c #303030", "# c #ffffff", "................................", "................................", "................................", "................................", "................................", "................................", "................................", "................................", "................................", "................................", "................................", "................................", "................................", "................................", "................................", "................................", "................................", "................................", "................................", "................................", "................................", "................................", "................................", "................#...............", "...............#a#..............", "...............#a#..............", "...............#a#..............", "...............#b#..............", "..............#bba#.............", "..............#bba#.............", ".............#babaa#............", ".............#baaaa#............", "............#aaaaaaa#...........", "...........#aaaaaaaaa#..........", "..........#aaaaaaaaaaa#.........", ".........#aaa#######aaa#........", "........#a####.....####a#.......", "........##............##########", "........................#aaaaaa#", "........................#abaaaa#", "........................###aa###", "..........................#aa#..", "..........................#aa#..", "..........................#aa#..", "..........................#aa#..", "..........................#aa#..", "..........................####..", "................................"}; traverso-0.49.4/resources/images/harddrivesmall.png000755 001750 001750 00000001332 11163362147 022753 0ustar00remonremon000000 000000 PNG  IHDRagAMAܲIDATxOHTQy7o͌Si. *UpSAP]ATP;j#T&k],rJyn qwy|8#KЮ]RT.- >Rb*FGG?C3eYuIͦ2LLDAeA^F"`hLeic*E@)~ijOx@ܸٯ_^+/'ӇYO&/?@2oQ{"0IENDB`traverso-0.49.4/resources/images/traverso.xpm000644 001750 001750 00000015601 11163362147 021640 0ustar00remonremon000000 000000 /* XPM */ static char *dummy[]={ "20 20 382 2", "dm c #082b35", "dn c #0a2833", "c8 c #0b202c", "c9 c #0b2431", "do c #0b272f", "cJ c #0c131a", "d1 c #0c181b", "dp c #0c1e27", "dH c #0c2634", "dJ c #0c2737", "d0 c #0d0d09", "cO c #0d111a", "d2 c #0d242e", "dq c #0d2632", "c4 c #0d2831", "dK c #0d2a3b", "cv c #0e0d13", "c6 c #0e1823", "d3 c #0e2b35", "dI c #0e3743", "cw c #0f100e", "cL c #0f1e27", "c5 c #0f232e", "dr c #0f2634", "cN c #10121a", "dE c #101716", "cM c #10171b", "cK c #10181c", "c7 c #111820", "cP c #111e25", "cQ c #112128", "cR c #112b33", "dl c #112d2f", "ct c #121c20", "dG c #12212b", "cu c #131319", "cx c #131418", "c3 c #132728", "cV c #152b31", "dy c #161c22", "cy c #162327", "dY c #171f20", "cW c #172c30", "dk c #191a1d", "cr c #191b1f", "dx c #192120", "dd c #192e36", "de c #1a252b", "dw c #1c1f1d", "dL c #1c2a30", "cD c #1e282f", "cd c #21191d", "#b c #230a05", "#H c #230f06", "#a c #240907", "#1 c #240b09", "#2 c #240d0b", "d. c #24312f", "#t c #250b09", "#I c #270f09", ".V c #2e1410", "cE c #2e2d27", "dR c #2e3029", "cC c #2e332d", "dc c #2f2d23", "dX c #2f393a", "ai c #331c0d", "ce c #33312b", "dZ c #372b25", "cF c #374045", "cs c #37443c", "#0 c #392318", "c1 c #3b4a4f", "#u c #3c2120", "c2 c #3f4d44", "#J c #402516", "dS c #41463c", "d4 c #425257", "dF c #453f3e", "dD c #454748", "cc c #473a2e", "dQ c #53533e", "#N c #542a26", ".U c #583c1b", "ah c #58432e", "ds c #585246", "d5 c #59564d", ".Q c #5d2120", "dz c #5d583d", ".q c #5f4b45", "cj c #61553b", "dj c #646562", ".B c #664935", ".# c #665345", "df c #66572f", ".p c #67564a", "cU c #675944", "#c c #684e41", "Qt c #685547", "cq c #69462d", ".W c #69533e", ".a c #695749", ".b c #69594a", ".I c #6a564d", ".r c #6a5749", "#i c #6c5947", ".s c #6c594b", ".c c #6c5e4d", ".J c #6d5a4c", ".K c #6e5b4d", "#C c #6f5c49", ".t c #6f5f4f", "#U c #6f614b", "cS c #6f634d", ".1 c #705d4f", "#h c #705e4b", "ab c #70644e", "#3 c #714a32", "dO c #715e50", "#B c #71604c", "#V c #71644e", "au c #71654f", "#j c #72604a", ".2 c #72604c", "a5 c #73604f", "#T c #736052", "ac c #736650", "cI c #74533d", ".L c #746150", "#g c #746151", "#z c #746153", "#A c #74624e", "da c #746250", "bn c #746251", ".M c #74634f", "aN c #74644f", "cz c #746551", "av c #746751", ".H c #756255", "a7 c #75634f", "#D c #76644e", "aM c #766450", "d7 c #766452", "aO c #766751", "at c #776455", "du c #776456", "a6 c #776551", ".o c #776756", "b0 c #786555", "aa c #786557", "bo c #786652", "bH c #786655", "dt c #796755", "bp c #7a6757", "dN c #7a6855", "cf c #7a6c5a", "bX c #7b6552", "d# c #7b6952", "a8 c #7b6953", "#W c #7b6a4e", "ad c #7c6a4f", ".3 c #7c6b54", ".d c #7c6e56", "cA c #7d6752", "aP c #7d6950", "aw c #7d6c50", ".P c #7e4c40", "ch c #7e6853", "d6 c #7e6c59", "dP c #7e6d50", "a9 c #7f6a4c", "bI c #7f6d56", ".n c #7f6e5b", "bq c #816f56", "cT c #816f59", "dv c #817153", "aX c #826e55", "## c #836d2b", "dM c #83715d", "#k c #837353", ".u c #837359", "cb c #83745f", "bG c #846e56", "b. c #84714f", "db c #847356", "ci c #847359", "bm c #856e58", "aL c #85705a", ".0 c #85705c", "as c #857359", "ca c #867057", "a4 c #86705a", "b1 c #86755b", "cB c #86765c", "#S c #86795d", "c# c #877052", ".m c #877662", "a# c #87775c", "c. c #885d4d", ".C c #887458", "#E c #887957", ".l c #88795c", "bZ c #89735c", ".G c #89775f", "#m c #8a714b", "#y c #8a755c", "b4 c #8b6b4e", "cg c #8b755d", "#f c #8b765e", "#X c #8b7a56", ".N c #8c795a", "bJ c #8c7a57", "ax c #8d7a57", "ae c #8d7c58", ".e c #8d7c61", "aQ c #8e7a5a", "br c #8f7c5a", "b2 c #90775e", "bF c #907b63", ".Y c #917a5d", ".D c #917c5f", ".F c #917d5e", "b3 c #927255", "dU c #92744a", "#G c #927e55", "dT c #927f63", ".6 c #93623c", ".w c #937056", "cX c #937e49", "bY c #937e66", ".4 c #937f5c", ".E c #937f61", ".g c #945f4e", ".X c #947d59", ".Z c #956e5c", "b5 c #957055", "#O c #966a55", "aA c #967855", ".k c #96815b", "cm c #968c85", ".x c #972f3a", "bW c #977d73", ".f c #978262", "#l c #97845d", "bB c #987b70", ".j c #98805a", ".v c #988161", "#F c #98855d", "cY c #98886a", "aj c #99613a", ".i c #997d5a", "#d c #9a5e54", "bs c #9a8768", "#v c #9b7b6c", "ay c #9c825c", "af c #9c835c", "#Y c #9c835d", "b# c #9c8458", ".h c #9d6754", "#e c #9d695b", "bl c #9e8263", "aR c #9e855c", "#R c #9f755f", ".O c #9f865b", "#x c #a16d5b", "a. c #a17e6e", "aW c #a18e61", ".5 c #a28960", "az c #a38d5a", "aS c #a48c5c", "ag c #a68b5b", "cH c #a7907d", ".8 c #a8543e", "ba c #a98c5b", "#Z c #a98c63", "a0 c #a98d67", "bt c #aa9271", "#5 c #ab6945", "bV c #ac968b", "aI c #aca08c", "#Q c #ad7f6d", "bU c #ad9687", "bb c #ae8a5c", "dV c #af9c84", "aH c #b19e8d", "#w c #b26350", "dA c #b2924d", "bu c #b2966c", "#6 c #b3724b", "#n c #b49145", "cn c #b4a89b", "bv c #b59f77", "b6 c #b69d88", "#q c #b7733f", "aT c #b78b59", "#s c #b89439", "bw c #b8957b", ".R c #b94d42", "ar c #bca388", "a3 c #bd8f69", "bK c #bda385", "ck c #be815d", "a1 c #be8b5d", "bS c #beab9b", "bT c #bfaba3", "#r c #c1743e", "bE c #c19f79", "bA c #c1b2a3", "#4 c #c28247", "aK c #c2906e", "#M c #c38f46", "dg c #c3a36a", "dB c #c3b7a2", "cG c #c3bab3", ".A c #c59c4a", "#P c #c6a48f", "aD c #c6a88e", "bR c #c6aa72", "bx c #c7a287", "cZ c #c7c4c1", ".z c #c95642", "#K c #c99c48", ".9 c #cc7056", "aJ c #cca280", "bg c #cca988", "aU c #cd8a51", "bN c #cdbcac", "cl c #ceaa9d", "c0 c #cecbc9", "#. c #d08b43", "#L c #d09e48", "aE c #d0ab96", ".y c #d13c3f", ".7 c #d1a44f", "bM c #d1bdb0", "bf c #d2aa7f", "bD c #d2bcaa", ".S c #d46046", "be c #d49d6d", "bh c #d4bba2", "bC c #d4c4b9", "#p c #d5aa4b", "dW c #d5d3d2", "bd c #d7944f", ".T c #d79e44", "aV c #d7a67b", "aB c #d7a879", "dC c #d7d6d6", "bi c #d8a271", "aZ c #d8a97c", "di c #d8d8d8", "al c #d9965c", "by c #d9b28d", "#9 c #d9b7a1", "#7 c #da9257", "ao c #db9c71", "bk c #dba677", "bL c #dbcbbb", "b7 c #dbd8d4", "bQ c #de9e5a", "aG c #dea368", "aY c #deac80", "dh c #dedbd6", "ap c #df995c", "cp c #dfac73", "bO c #dfdbce", "#8 c #e0a072", "bz c #e0bb96", "co c #e0c6b1", "aC c #e29d66", "bj c #e3a065", "an c #e3a667", "aq c #e3af7d", "b8 c #e3d1c1", "a2 c #e4a265", "b9 c #e4ab7e", "#o c #e4bb46", "ak c #e5a46a", "bP c #e5d4b9", "aF c #e69e5f", "bc c #e8a263", "am c #e8a66a", "Qt.#.a.b.c.d.e.f.g.h.i.j.k.e.l.m.n.o.p.q", "Qt.r.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F.G.H.I", ".J.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1", ".s.K.r.2.3.4.5.6.7.8.9#.###a#b#c#d#e#f#g", "#h#h#i#j#k#l#m#n#o#p#q#r#s#t#u#v#w#x#y#z", "#A#B#C#D#E#F#G#H#I#J#K#L#M#N#O#P#Q#R#S#T", "#A#U#V#W#X#Y#Z#0#1#2#3#4#5#6#7#8#9a.a#aa", "#Aabacadaeafagahaiajakalamanaoapaqarasat", "#AauavawaxayazaAaBaCaDaEaFaGaHaIaJaKaL.L", "aMaNaOaPaQaRaSaTaUaVaWaXaYaZa0a1a2a3a4a5", "a6a7a8a9b.b#babbbcbdbebfbgbhbibjbkblbmbn", "bobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbH", "a7bIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0", "#Ab1b2b3b4b5b6b7b8b9c.c#cacbcccdcecfcgch", "aMcicjckclcmcncocpcqcrcsctcucvcwcxcyczcA", "a6cBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcSa6", "cTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9d.d#da", "dbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdu", "dvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdO", "dPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7#T"}; traverso-0.49.4/resources/images/memory.png000755 001750 001750 00000001635 11163362147 021270 0ustar00remonremon000000 000000 PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe</IDATxb?% X֯o߿lOl@1O;e['ѣ\, >eАo Ob# W>~"Ю AxW J>lX$!"J,A{[BFݼ 5;<)/["3x3hk 1>/ L,@WfeVb04TcQb͠l A.,7(߼     **!Afy  <4N]'囹&A61>4П %񟟕Ż9Jĸ+^b ?eddbQX @1L~W狿qe" ;$600 Vjb¥ !fb4D8,IENDB`traverso-0.49.4/resources/images/cursorZoomVertical.xpm000644 001750 001750 00000002355 11163362147 023651 0ustar00remonremon000000 000000 /* XPM */ static char * cursorZoomVertical_xpm[] = { "32 32 3 1", " c None", ". c #000000", "+ c #FFFFFF", " . ", " .+. ", " .+++. ", " . .+. . ", " .+. ", " .+. ", " .+. ", " ", " ", " .... ", " ..++++.. ", " .++++++. ", " .++++++++. ", " .++++++++. ", " .++++++++. ", " .++++++++. ", " ..++++++. ", " .+..++++.. ", " .+.+..... ", " .+.+. ", " .+.+. ", " ..+. ", " .. ", " ", " ", " .+. ", " .+. ", " .+. ", " . .+. . ", " .+++. ", " .+. ", " . "}; traverso-0.49.4/resources/images/keyboard.png000755 001750 001750 00000004464 11163362147 021563 0ustar00remonremon000000 000000 PNG  IHDR00WgAMAܲIDATx[lT39c/8`|#'$(ΥTJHPԼ*jxhTQK RH QM Jd1zm>}ϑ 6iK]|7?.4@ 4@ Bfooon勁VTVӴf!8 C[Qdŋou@}W%O>C>oM*ˮ[M]jMRh)@M(T!R( (yaX>Z ^z֮]\sK{ůrOrB&ώ!2#xE GŘ[zl39rH1Pl_׊B䐍P]O/AӠ^/_ѣGtɿNNNV{+_{nݺuGoo㱍(`H,W &CTF/ [hjP[AYX%ĕS7jH+"7=mBZEuMKeE^El:Cqղ0ǩkR+diBjv:iR-ZDREJiT*,"ڊiDQ9sϟ?ykO=c~͛7JQ^STBPTs)I[w rB @T B\ץZ)(+xGKe"m.APT˲m իW?k׮Bڹs;vhwwrDz썔04 ]IRI]דlT*ih68wΡiJ)(B4߿;vе}~{hu& i%t!Pgƍ455u655 -AB,B)R*ɨ20B$u} ]}K) 0>_'۷oٳʨ]QNH'ln}t&27hRq9rzdd\.W\t2V1}pSQafW麾`5W_)*i&XzD/o&!?p3P(,q'Y1M 0p]7)N͇(0<4<!Drwr9juf|c85 ={n޽ 2>>>GB(وA\ۓ;qDa۶m;\cvf.x[b ދ|0 ;} ä,ƶR97a*1R;66Ν;9s;my |شis\!DBdvwu]lۦ\.S*(e2mSVZ|uz}xOJIT;G2#HPgtttdbbbO<џfIRwe#jBRPTp'gwQuy^rk6G^W,z_)~;۷y7^Ybe%^c6mS 0!ZոqFixx୩zrΥ]]]xT|sU(bYe%oZ۷9|oq@i\xtӦMؽ{uֵZqm`pppٳ_={իW}߿L2[7LbK-[ ]~}OWWb˲lu]' C_:t 40u'مN tfٍ[l:0004R*y…o\rP( & lS)dgLJ۷f͚ŋ/NR^>z?#z)X>313@J`ϐOYЁ)Ɓx7b׿ŧK1-;}~Ohh'/!ʧ]IENDB`traverso-0.49.4/resources/images/lsongs.png000755 001750 001750 00000001436 11163362147 021264 0ustar00remonremon000000 000000 PNG  IHDRagAMAܲIDATxAH[///}XݦN`vȩ:v1:aH1(&2U&Mmo_L\f/uwx3ZZ u m'2יk }7?x[Yds9=} ԬZ! =5L/4c3-V{XCM@gg|f)H 67~/[+T/+yjyy9yttbyt]Vjt1:_~w+ŘI855gJ%, . fPs<4]}y=WX>5 Y1M"g?&;4 6VrwPՖK?]b_ӴR$x< iL?qb/.N} :hfCE[i[!$lF`Fc[@ @TUUj&n[yy O< A*v E:?? J햖 48E$Ibddt:}wii`X2kkkeG\P(P.zHqMksss‚kVU8d<ұZFD"~j5RԆT*$\(~=8(Y1%k-6[IENDB`traverso-0.49.4/resources/images/traverso_mac.icns000644 001750 001750 00000075577 11163362147 022632 0ustar00remonremon000000 000000 icns{ics#H1cC~?|1cC~?|is32{ӈ;5/78.*>73=:.0?;7?<16@=J?=334 ,^O<)< "0." K7& 94;'2  3;5D<8?.;9E=:D0?;J?7sBZE 'hDW3z[< RBZ7"^?WF"\>v)_DH[< C1jTX/  8btwi[MA5+ 32 #RR "]5+%[M21 B\JhA+^aE% 'hW3z_< RBZ7"b?WF"\>v)fDH[< C1jTX/  8btwi[MA5+ 32 #RR "]5+%[M21 B\JhA+^aE% 'hW3z_< RBZ7"b?WF"\>v)fDH[<l8mkp} "`D;iƻNy 'r*FoCP0"ѯzzz{{|o6d .RvxG]@X_{%/k@stZ8"S 1J.R8bKpJ'AXTk@( "Q KO^g62 V TFhc.;Z_=p^%E^h4z}[ N cr-tSZ iIg)ky;.*ich#H|~?>><?|?x|  ?3?3|fdπ͟?3>6~f|l 333gfgf͜ |~?>><?|?x|  ?3?3|fdπ͟?3>6~f|l 333gfgf͜ ih32 (\cvۄ %p$fO QT0 -x-y ] U X5 0|3}b Y ]: 5|7e ]`@ 9;k adA >?n fhE ?Cp ijJ DH#s n!nM IM(v "s%qR LR,y &r(tV PT0y +w-w[ UX5} .z2y ^ Z \:| 4|7}b X `;| UO?&UG'TQ3{C 8keE, )& (A^ysj`SH;- \$ /C85)](u-Z~+ QT0b a'-x-y ]+7&Y}X'U X5 a& >\ZK4  0|3}b ,/)# Y ]:5|7e ]`@9;k adA>?n fhE?Cp ijJDH#s n!nMIM(v "s%qRLR,y &r(tVPT0y +w-w[UX5} .z2y ^ Z \:| 4|7}bX `;|UO?&UG'TQ3{C 8keE, )& (A^ysj`SH;- \$ /C85)](u-Z~+ QT0b a'-x-y ]+7&Y}X'U X5 a& >\ZK4  0|3}b ,/)# Y ]:5|7e ]`@9;k adA>?n fhE?Cp ijJDH#s n!nMIM(v "s%qRLR,y &r(tVPT0y +w-w[UX5} .z2y ^ Z \:| 4|7}bX `;|UO?h8mk ݳ#4Ity Q&0BkûQOs^$6ei)T_?a'dhYxxdW5<Ы|kYQRRSSSTTYj|‚AY(2dS:cS =?]bq\eF -Mdу6f'R ⺍bD,5Dhz9Ƹ4"\.O(o >;l|9l;*R6D+9M^hvXB3pw2H=<L+uq7?F4ʢĩU'zmA6N-Ҙ̠_ iK1Y$ٍ ɤՖh}eU)d ߃ ҙ ދr`_"h z ُ|\jtq!| Vu h${qB^&!o&f=D] T/h :G!it32YfUn%\pY&H]R{Α([$ bfl? =s,I{fvfvyt]wcKqb, kN$]U.`zkUjq =~HH|U xfOgi-Z?@vt?iU\{|~g^Kgs$ku3d|r\_rx*Xr\,|vHz|o H` ejh >5[~ $fU vvkjsh&OwU;?$yQE|_f1e|U_mr-XULtU|i^Vek0]?|ryXeqq tgOJpw!:me_ _t{JboE 3x|k k]ffUEz7m~2R3!yo[mlaYq[ A\-}Ul[UPjn hmk0n.rk$u[ijeHnzRxg!|Qug'aH ^lk3{U)HUnL tmgZsh"J|j,z?p_>xfP)U{xPnwVPJeUsbJhp1]Z@zNpXirkxjfEmx?!i'dZ plgJw|U)U|_)uQ}lc Ie$`ss ;pE0^U 1dMrnahrm$Uf;fU^6&Zb   6Rb}yjZLC4$y~% $1;BMX\ZWVSPONJA7* *R;!w4Z2&Tc/%`M-\R( ;([$ be`8odDb,I{fvfvyt_- ]wcKqb, 38 kN$]U.`zkBk Ujq =~HH|U pvkU% xfOgi-Z?H[ 5uJ@vt?iU\{| > Hoi+ ~g^Kgs$ku Jh  Lt`6 3d|r\_rx{W@`twU7!*Xr\,|vHz|oBB" 5Qps]= H` ejh >B|1 6FazqTC#5[~ $fU vvk,Vp+'=N^uwX@0 jsh&OwU;?H>& #;OZlzxun^I5$$yQE|_f1e|U # *:EQ`ea]YQ>)_mr-XULtU-BWfwdM@- |i^Vek0]/8BNKGA;. ?|ryXeqq  tgOJpw!:me_ _t{JboE 3x|k k]ffUEz7m~2R3!yo[mlaYq[ A\-}Ul[UPjn hmk0n.rk$u[ijeHnzRxg!|Qug'aH ^lk3{U)HUnL tmgZsh"J|j,z?p_>xfP)U{xPnwVPJeUsbJhp1]Z@zNpXirkxjfEmx?!i'dZ plgJw|U)U|_)uQ}lc Ie$`ss ;pE0^U 1dMrnahrm$Uf;fU^6&Zb   6Rb}yjZLC4$y~% $1;BMX\ZWVSPONJA7* *R;!w4Z2&Tc/%`M-\R( ;([$ be`8odDb,I{fvfvyt_- ]wcKqb, 38 kN$]U.`zkBk Ujq =~HH|U pvkU% xfOgi-Z?H[ 5uJ@vt?iU\{| > Hoi+ ~g^Kgs$ku Jh  Lt`6 3d|r\_rx{W@`twU7!*Xr\,|vHz|oBB" 5Qps]= H` ejh >B|1 6FazqTC#5[~ $fU vvk,Vp+'=N^uwX@0 jsh&OwU;?H>& #;OZlzxun^I5$$yQE|_f1e|U # *:EQ`ea]YQ>)_mr-XULtU-BWfwdM@- |i^Vek0]/8BNKGA;. ?|ryXeqq  tgOJpw!:me_ _t{JboE 3x|k k]ffUEz7m~2R3!yo[mlaYq[ A\-}Ul[UPjn hmk0n.rk$u[ijeHnzRxg!|Qug'aH ^lk3{U)HUnL tmgZsh"J|j,z?p_>xfP)U{xPnwVPJeUsbJhp1]Z@zNpXirkxjfEmx?!i'dZ plgJw|U)U|_)uQ}lc Ie$`ss ;pE0^U 1dMrnahrm$Uf;fU^+([OXaiˉttvwzcY=CR $= 0i:cvVxӒsq. (j+{ L Um6Z$ Wʋ 1~貂$Rl- i 8@+jɐF;"R {ּMjvPӔD~ -<,lٹ~]. !Nv70J )ԾfR:!8 uIVo 4wҺkUD2" JL'#8'd(oòxhVJ?1',< pto[(iʾzsme`]ZVPLB+{i3  f(6̝T = S U X)2Y-8wU& .mirj+YՖ8$9!Sm,/.\ )N!`]i > (]0L]  #iy39xU)g#?\} B "N\n5ZubDPk-/AIS^gnur 2(vu]4:a+qoF Y [H7,,# N 0tw>*9dQDL{p02 y?;[VR''yaӓ(ZL1m1 K]m LpH-Mn }<+/q OY&Ss4  `<-lb<+7 &xX ՖDF  T(Qw1"Q.QVor(bd];K!l132 (fGQ4bґCUl+F R ETq4s}*G^@ F$ . $P#^ƇU MHyYo0 _ 9MM6s DZ @*v-(Dɋ& b I xL,mƒ3N߄a`! u 1ݕG$7!g$8sQڛ?|ۄR{<,Vt<` :aYd) a"'52t0|~k[_&##hi&UTtraverso-0.49.4/resources/images/bus-in.xpm000644 001750 001750 00000000451 11163362147 021165 0ustar00remonremon000000 000000 /* XPM */ static char *bus-in[] = { /* columns rows colors chars-per-pixel */ "13 9 3 1", " c black", ". c red", "X c gray100", /* pixels */ "XXXXX ", "XXXXX ...... ", "XXXXX . .... ", "XXXXXX.. .. ", " . ", "XXXXXX.. .. ", "XXXXX . .... ", "XXXXX ...... ", "XXXXX " }; traverso-0.49.4/resources/images/cursorDragNode.xpm000644 001750 001750 00000003667 11163362147 022725 0ustar00remonremon000000 000000 /* XPM */ static char * cursorDragNode_xpm[] = { "32 49 10 1", " c None", ". c #FFFFFF", "+ c #000000", "@ c #303030", "# c #595959", "$ c #B2B2B2", "% c #E6E6E6", "& c #7D7D7D", "* c #999999", "= c #C7C7C7", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " . ", " ... ", " .+. ", " .+. ", " .+. ", " .@. ", " .@@+. ", " .@@+.. ", " .@+@++. ", " .@++++. ", " .+++++++. ", " .+++++++++. ", " .+++++++++++. ", " .+++.......+++.. ", " .+..... ....+#.....$+", " ... ........+%", " .....&$.", " .....+..", " ...*+*..", " ...+++..", " ...*+*..", " ...&=...", " ..%+....", " .$+$....", " ++......"}; traverso-0.49.4/resources/images/cursorFloatOverFade.xpm000644 001750 001750 00000003646 11163362147 023720 0ustar00remonremon000000 000000 /* XPM */ static char *cursorFloatOverFade[] = { /* columns rows colors chars-per-pixel */ "32 49 5 1", " c black", ". c #014401440144", "X c gray19", "o c gray100", "O c None", /* pixels */ "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOoOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOoooOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOo oOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOo oOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOo oOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOoXoOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOoXX oOOOOOOOOOOOOO", "OOOOOOOOOOOOOOoXX ooOOOOOOOOOOOO", "OOOOOOOOOOOOOoX X oOOOOOOOOOOOO", "OOOOOOOOOOOOOoX oOOOOOOOOOOOO", "OOOOOOOOOOOOo oOOOOOOOOOOO", "OOOOOOOOOOOo oOOOOOOOOOO", "OOOOOOOOOOo oOOOOOOOOO", "OOOOOOOOOo ooooooo ooOOOOOOO", "OOOOOOOOo oooooOOOOoooo oooooooo", "OOOOOOOOoooOOOOOOOOOOOoooo o", "OOOOOOOOOOOOOOOOOOOOOOOOoo ooooo", "OOOOOOOOOOOOOOOOOOOOOOOOoo ooooo", "OOOOOOOOOOOOOOOOOOOOOOOOoo ooooo", "OOOOOOOOOOOOOOOOOOOOOOOOoo oo", "OOOOOOOOOOOOOOOOOOOOOOOOoo ooooo", "OOOOOOOOOOOOOOOOOOOOOOOOoo ooooo", "OOOOOOOOOOOOOOOOOOOOOOOOoo ooooo", "OOOOOOOOOOOOOOOOOOOOOOOOoo ooooo", "OOOOOOOOOOOOOOOOOOOOOOOOoooooooo" }; traverso-0.49.4/resources/images/cursorFloatOverClip.xpm000755 001750 001750 00000003615 11163362147 023747 0ustar00remonremon000000 000000 /* XPM */ static char *cursorFloatOverClip[]={ "32 49 5 1", ". c None", "a c #000000", "c c #000040", "b c #303030", "# c #ffffff", "................................", "................................", "................................", "................................", "................................", "................................", "................................", "................................", "................................", "................................", "................................", "................................", "................................", "................................", "................................", "................................", "................................", "................................", "................................", "................................", "................................", "................................", "................................", "................................", "................#...............", "...............###..............", "...............#a#..............", "...............#a#..............", "...............#a#..............", "...............#b#..............", "..............#bba#.............", "..............#bba##............", ".............#babaa#............", ".............#baaaa#............", "............#aaaaaaa#...........", "...........#aaaaaaaaa#..........", "..........#aaaaaaaaaaa#.........", ".........#aaa#######aaa##.......", "........#a#####....####a########", "........###...........##########", "........................####cc##", "........................###c##c#", "........................##c#####", "........................##c#####", "........................##c#####", "........................##c#####", "........................###c##c#", "........................####cc##", "........................########", "........................########"}; traverso-0.49.4/resources/images/cursorZoomHorizontal.xpm000644 001750 001750 00000002357 11163362147 024233 0ustar00remonremon000000 000000 /* XPM */ static char * cursorZoomHorizontal_xpm[] = { "32 32 3 1", " c None", ". c #000000", "+ c #FFFFFF", " ", " ", " ", " ", " ", " ", " ", " ", " ", " .... ", " ..++++.. ", " .++++++. ", " . .++++++++. . ", " . .++++++++. . ", " .+.... .++++++++. ....+. ", ".++++++ .++++++++. ++++++.", " .+.... ..++++++. ....+. ", " . .+..++++.. . ", " . .+.+..... . ", " .+.+. ", " .+.+. ", " ..+. ", " .. ", " ", " ", " ", " ", " ", " ", " ", " ", " "}; traverso-0.49.4/resources/images/soundcard.png000755 001750 001750 00000007450 11163362147 021743 0ustar00remonremon000000 000000 PNG  IHDR00WgAMA7IDATx]luwf{%)Q)Ҳ),*dbcmF$KaQMmUXR)˖hf%")~r?fw>}Xm>?@pws眹 /bxx#_Z+!aYsĉMNN I"ǏFJi\|SN}O@!wABtɟj-4\UtO~4o `YeyLӤ5B|lQ"Ҡ5(]7T麽Zm>jT'B(QJS%@cHZ7 g_fgϟWH$O;v !ahBmi垢Qh4bYj'hq" ڶLs@Սa|BA "bucZ#BR25;;uwwO<5o[M^% e ҥzB V5J<#t[P'7h:q#n`l$G[z׹[.c0PJ{G ħWXTA\tM)07 ܔ`.f]^ZšR-8*b#E5@,;3XJ+Fmi8Bh!!6v#nw|tL3#%[y"VJ%ZfnK4 1U#k6chR wciPꐌ|8|MO6RYkMTnB{m]fo0I#ʯ \kU J),?N!jT&Tj`ߜ@FLI $DiOMw7Xm5+H= 6mrUQJF!@CR"VRH_#C#P.vG! lh$!pU@{D'I^tY fPH*vXƑ5vFG6*u-Fdq]ZFͮa e2 ]5f!$5U!P.]f?Y56\r&jh*?GޫQ'_n+u\ǡZR-U 4!I^M5F<PS6!+jTVO7:H5IBMT$ZHu!]/MW<[!>:pͪg^-p_V.Pνa!) P+\UC@:K(pd _a(L.2=C#N6}5y޽.?8A9Օyb2'&Ɣj4^*(﷘14d2\E)!j!q285ʪvv>F%,qmA'!.Ow;<UԩS,--a#FK& rQƑ֋/Su0,kq]jZ]4~?P9?=ޡp~^Z"akCVD1K|3ݼ ={uD"d2B)tuuqqS|+  z a4=%֧Fq3eϰ+gRz} {gܹsq 8s=ǣ>?{{]f%06z qc5%DB HiCGIijO׿ufgg J)^}U2?qLi_:wki655Rp4fbHesC_fmmzW)2k3cccK\U-,˪B;q3}Qpr/Sr@/Le\zzl6K6%VQ(pYL6# CN>c=_;}'Kd z !0Mhqa++OcCj;ǑG0Lwyt:eYRJ(d``q*T*\|B5y~<ЃSOYXX8u] 5ù /swbܟcJa4e] mۤx?8g F$߼7JRL&eYŦעZB$\p8H)fT*: 4z a$PHbDF2k^8m7E&D@kMiR!d АD+@X!Nե\.N<j5lۦR4m&~K74[HM.}@DD Szԛo|Wԁ #0}{#bno&mS,,Šs0!|^gVY[[sm^mZH˲D"X1+D9L*jIt:뺌þ.k˩tuu188H"h!DX\\dnnY.]46 LNN>䓿g bxhLMM'&&a߾}0dbbyIݻIR={iRWX)%Ta:D:njJRqzX,b7 [ߧ/RI$Jxqpp~.^,c&d!z{{[Fy( 3::zӀ{t:رcǞ!{ؿ?!F 5ЈDf9<ض͉'Μ9%EfҪ|ߟ*Jɶ#tVWWb$ID50qnf2>>TUN>>=>>y~&m<'8g{e5G!!RJ|??wSSS\/L y^8005Bu E\Zٳ~g####t]K}LTPI&A&aǎٳ\.O?k2Fj?ڌ뮻flٲ\.G.cvmܹy <ϞY^^}===2<<|/{n裏!o'Nɓϟ{߽¿([L@6=ddjJT< `B}%~[.6I}]Vؘ~_efIENDB`traverso-0.49.4/resources/images/cursorFloat.xpm000755 001750 001750 00000002356 11163362147 022304 0ustar00remonremon000000 000000 /* XPM */ static char *cursorFloat[]={ "32 31 4 1", ". c None", "a c #000000", "b c #303030", "# c #ffffff", "................................", "................................", "................................", "................................", "................................", "................................", "................................", "................................", "................................", "................................", "................................", "................................", "................................", "................................", "................................", "................................", "................#...............", "...............#a#..............", "...............#a#..............", "...............#a#..............", "...............#a#..............", "..............#aaa#.............", "..............#aaa#.............", ".............#aaaaa#............", ".............#aaaaa#............", "............#aaaaaaa#...........", "...........#aaaaaaaaa#..........", "..........#aaaaaaaaaaa#.........", ".........#aaa#######aaa#........", "........#a####.....####a#.......", "........###...........###.......", "................................"}; traverso-0.49.4/resources/images/helpbg.jpg000644 001750 001750 00000003176 11163362147 021214 0ustar00remonremon000000 000000 JFIF``U-Lead Systems, Inc.    $.' "+"(6(+/1343&8<82<.231  1!!11111111111111111111111111111111111111111111111111  }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzw!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzdd! ?NOH0hOGӚ8[<2x4" NsN`p( 8ȣ,@!Jpb=ҕoOydzsxO֙Pc8vO8$w@n9ǥEPU`})6?JN,֗0P1 @Tq!#o fNO= RU@ րX>@$ɐ8(T|i^i䑝(i>`X{h-j6+"h27mPHMj1@zC7j#'9_SDUU@zzp:V;W y=;Fh= sހF…4x3>FOZ(Sdc=hœݣp Ӌ`n? N (S.:4dp;)$hp(8t4@ 'ތ2q?0= \g#rHz6΍p?zv}.3(>` ccc@ A\W9T㰥}E#:S;FIlF:x$<@ W $c Lf4|i@$/,րpJ7{JN rJRv@vR IǮi3cPŁ8pP@ !*RoOʀΑr;y; F'rۓ#n:U2hPcL8 @ 9s)0} ~ހI{R c&|[|zbXTjT+:BRn4traverso-0.49.4/resources/images/traverso-logo.svg000644 001750 001750 00000030725 11163362147 022575 0ustar00remonremon000000 000000 image/svg+xml traverso-0.49.4/resources/images/soundcardsmall.png000755 001750 001750 00000001462 11163362147 022771 0ustar00remonremon000000 000000 PNG  IHDRagAMA7IDATxOuohcp3[GL$[b\YDO^ D$: :LK۴D[~3?~uDA2&{߹qn>ћ~Ktp8Q|UVlM!d/~go+KKK\J$ݪODGB&QiTz=fGrLxMdEm}!N9>ia[.Dd\GchT&~Mi݄366FVëyO!@ߟkuo[^)lll 2vP((Rk$%gnݾw;w~$soul6!Hx^^^mmm,,,%WWUU6==}}~~77d>uuu___aK[[[xxx` WW<!!bbeeE ixxxddd"FFFuuu ZZYYT2**LL D 777 ]]]%wuuuyyyxZZEE44m aaaLK```iii444)]][[%l++ooN*PPPrrr;66 mmaa2gggwyyyaaa}9MMM|||Y__UUI Tjjjhhh888{{{oo\77(((^^^;egggzzzaabbbi8QQQnnn %%%񜜜#, mmBBBxxxmmm SddAAaaa+dkkkeee(???Q44 **j?\\\lllF--/{{4@LV@ 5??k_acdkffNNdb6PCa99ff`` mK|FF4T22 W6**77FFSSWWSSQQMMJJHHDD99&&{{""V p33UUxxmmZZGG44!! lLL** MMqqssff[[QQGG==3300335588;;==@@BBFFHH<<((55)9=={{WW@@((<))n]]xxOO&&U @##}}mm++22MMmhhiijjkkkllmmnnoout[-H zz,,`- +BYpz>>DDu/AoSS##fE;;EE*[vvaa))LL~``IIugg&]v##]b0DDNP<0SQ; (1L "zn9Wb t7 o$i`xhXH8( %d&_&Z'U(Q)L)H*C+?,>,HS^j(?ߟϟ|~~~~??????߿?ϟ?|~~~~>???ߟ?ϟ|~>~???߿?ϟ???pp?0?0?0????????traverso-0.49.4/resources/images/driver.png000755 001750 001750 00000001365 11163362147 021253 0ustar00remonremon000000 000000 PNG  IHDRa pHYs  d_gAMA|Q cHRMz%u0`:o_FkIDATxb?0222Cy>7_>i*2r1(+2MЄ &,@AB!;YD7`so?=H,2e3@Q @X '` Dx0GYzZj? 02{E-@a50~@2;d|x/X ;w6ZjO~ ?h 9ƛ~| p |f`FQ @X 5ϟ@# ^?'T ad ,=WOR:`#/wA!n@ +)!*9B4@RսK_/>qǗaߙ9 "k yy IZZV[YGyN0?$8  %j}D3Ͽ00/p4ٞϰ ~0|`虃H 7*L?wO^2>{[x3܀W׆qBYKW<}pණNiπ#Rv_@́?_{p2l #`CX>IENDB`traverso-0.49.4/resources/images/player_play.png000755 001750 001750 00000006030 11163362147 022273 0ustar00remonremon000000 000000 PNG  IHDRH-sRGB7MS tiCCPiccxgPi CN% 9' Ef00!+HR\pu (DA,ʺ܌~>ݗۿSvxWN$`C<WfHh;P@#i)^@P^/n @=?Nc 8]qd0rVz L .P!BIB;; )+ 9+SO K@[Яm߯%% f<7=ǍL҄<*#>)]/?p^s1*g {vn:{gQ*@);-C ` )d"PZ@s`3> @2, vPJAP @#hm ep w(x ` X  !$)A.d P(P 톊2_se4 =&9o#$+̂aO8©p6+ _o0~ /"!" DCX#⃄!1َ"H҆ =#P D顬Pn@ڎ*FUN:Q{I G-t,: ]@7;Wѣi; hb1nPL&S9i\ c0X,V`#l"v;}#p8\UZp n/W[}V| ߃/$kB!PIh#\%LDяOI$&^'N?$#)AG:ADzHzC&5v0r:y|^&/.!V#)6"S))ٔ Yʼ8^\CQGKcVSZ]3[UsBeՠu_N>}W1Չөѹ ^^eaոI^/SUoR寧ߥ@ `CS$FFT#<u5WWޱ{k]h#&Liަ{LL?#kYt/um`K3t3YY%ZXͮ\q͔uu5߆iasԆoli`NՎcd7cm`ϡaq%'թiș\E%֥e5m۸;۽}cG'sg3//W7}{bZ.s牯oo~?_Fh6kY.!$qV`F`_%(<9h)),b-Vlh|hw6,()lqM 6hnزFٍI/llt6)'!r1=6j>~ɱs梭ˢgbcbfccU;WǿNpKKXJI<ԞKH>ǥr7oY,/,{p&u2+*ԪJ>UU8Դ]:9t#/ wk98!gtTo`N(6Q'zlER/:;zFCQQ(`#\q]z󹽒ݵ{ƨk.GL a.#_J酰Q^@@u0j7Aj.3" _t2Hʨ( ,Z 4 +% <|wDacG 䭷;ΎCNfh=mG* `}ӭ1.{f0*V%u rB[ 5~ +C˯@kJ^oD򰆽BA5\VcY~<"X#({ldT:Tx|mDZILMkkPCEǍI9wQ+ +ՙy- o[] #ICZ*rW7sI]GP [FIENDB`traverso-0.49.4/resources/images/audiocard.png000755 001750 001750 00000005234 11163362147 021712 0ustar00remonremon000000 000000 PNG  IHDR00WgAMA7 SIDATx[]Wyk}3c{&qb0j+Bh mAEEՠ UܧJy *c-RՊVJT H\TB[c؎3If<3Ϲk}_93gJDF:g>mlc sرy$"T pe?gϞk'Da{щiDQę3g&x≏o~TMOO3;;y%$qr_R-BSʯp _Fmii4Mi4΢Aw|#0^R5U:FC'+^<`AP5QM婀!$ug<Óɓ'xb8111sMxp8ox Β(nD I") G-񮫨PRQ%$b"M`›ݢ͉i+;:q_>|GQ(Q=862Jyp5ވp]_!LBIeH^Ƙ g.V,3vUг}RkKA# ^j4sA "c0)êp$bQ#.̜5fcUYrOiuAuhIQA($r|vh0#S5EC1jQ6oFܭ09q+JE/m7e C=:n@#ՑYkA`JQ"^ IGLy f},s2jS{LJ9ϳd["*= jS =D*̻pPũ#)mb:fQx dP eFkbpX)H|KNꓵ^luۢ^Lc$.!2Kd 82QBaXf0F#pkS 3Mh* u.ZOqj)4'=5!9Lf1;m,#MR$%.tQʼn¯SwC6iN*} irg^ dM>5w\2ΏPc%%$IB$$ѳ]$ꦉu_Y+91f-Lk>^^=³oQE*4g}Nbu?͟BE) ^UC>"%<#HH|Jb.sr$tmƘ9 BsRI(rX_Pe 'TG!R2^_ 20{Kk'.|-5eݽ1n0@߷.^=N cXJr+毳3ܵ^ϡC ֩Opc )(ē,YܳߜeF;$6`BkHG+bg$=E3@8q!N\]2Cв(P+^I4OG*{{JY70& u2 fH)Hz|f, o=cQ3M[F~¾ߠٹywW4C<8T)AK {}V.6GݡJk%O|7b)ƔHZM+_8gB,%\y =eV׹=h NʬAԀA.LEӴz-:~vMM-DE C (#Ā ks9yAH!4BףnZ&JV`LE FWSsvNĥ/  ٠R^ GB)T(Vk+.iwܙGZҧr>&_ ?0Uڃĕ%JJ'HۘcWʄcV` T3ԑ4M!xz0TxGyy[z5Zj]8: E| d'aCjr\0,/3- ;2y_Q;C|Ȣ&hb2|`5!wրC-2r^!sڜ$W|ʽ|Y~-~Bj (D)YO8XvbiP1ݝֺ򐪢+T {{17|Dk`XPk<9.f„ZbvunR'2𾏲]^@YÔ?x/©SPҒ 0֦Q?ۨ.P}>?>•E~=܃ՋO&,aJuu~SD@rC#F 2! :B:0J-|>ER 8.9 {3BкɀH V* r?BeR~&@!Q7 98ǟotr9W%mh"]A<;v.1t"UQ!)` /X ,u'5W7a?P0x}maSz ƨT*c+a JR,s6m)߂o<IENDB`traverso-0.49.4/resources/images/performance.png000755 001750 001750 00000003766 11163362147 022270 0ustar00remonremon000000 000000 PNG  IHDR szzgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxbd /7oe88g_~ex Px Ę @.qZ\ol`*k`%a & | `5>2ǿ1|vă ntLL  ^,ʦz d 7^_!;~l^?t YA lz JA# Ǯ0)`2|ɨ!@LH #8ƵAM02N} 5^ JY&1( @ .>Q@MC_ HB0ldXd ri'#`f2*Csк0{D\4+)b,Yi|̐6)a۩- A|' 9M}e p*ᠬ矟޹ 0y2bq8"7ԍ Pak'jP9Op„CC@AjI`7;>)!sj7X- 6]p G` ss1k0O`0 &Pj$k 6 d@ J rPhdG8e-ΰ9 p0AM4U2  ]WBh=8>FX %APNXaYe\?D4Ȉ2qAKQn#C `s@iAGF&{bu`;f-̷`3ÈAWN/e2bX(lͰi T/Lp''F6~v~QbfgC&$`=rS/}hggFx[ JzA6b+Xbf5+|9CϚNDzU LpO0+&9 @,@dֲ᪃+P,ї^f0Lg]gbA@L,c.̛u2bv8}O $XQ ؒa ?#&^QfoR^Vzh?B!@(;&-?#0#[  :vXO_~K+ Gx#$A `4܎̬,}BY Kz~,pBH, r`&\\\"rnllGΟ? WHs|\?~ 1013C -F P ?3󛁙!i()(/zϱ9 |WL\ ADTnH8h!a~~ ,-**2<"eGw@1q|uϏ? '(@ PA 0e,9 wLTt̲ ͛| =(kAAМr8E 4dpH(oV.X* &o98ܾ}w`0 ]pyAf #9ՅDCCg9< 1bs%< o~dQTRb`񟿀q 88A'P#!wPXJ~LGo=壇:j6Ċ ͬl\zm&e%e6`+++ cHhzQ,,UafaedPPTX(| @ d܄ ++7bڕ_ (3C0g?s(PH-,%%UU.\°| NX7oV|#P@Ax(QSSlTÏ~0Aeff'PGj23;72|=qa0D~̰̙wR]tEh 9XL  J*   A):/A10=19}g |7P얜ê;Fu|y`Z.n@| l:$:AkFzPH Νc}8z@0M<F?o߶@am?yu@@g`&8߼},@_A@PPN}ʠ3e "b   wa ߂[K1q~…w}@+v44:LAE;:(:sڃ1|'+W?{_ڷh o@`Rz*7!_?}fePSWj 'Ob7o&2e~ _0q jR0@8>۾sw䪁R=;'v !) Ղ,TPPΝ;?xP,׀#r y'0*[1b؈2r622[~&P|=P ^ g=z F2Xa_6ׯQ.6&eDvZ$ VR:`O?k"{ |T&2_( Wպ};v<=}`tA} u/Y5hXA=' Puė%!.#WnKIENDB`traverso-0.49.4/resources/images/cursorHoldLr.xpm000755 001750 001750 00000002430 11163362147 022414 0ustar00remonremon000000 000000 /* XPM */ static char *cursorHoldLr[] = { /* columns rows colors chars-per-pixel */ "32 32 3 1", " c black", ". c gray100", "X c None", /* pixels */ "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "XXX XXXXXXXXXXXXXXXXXXXXXXXX XXX", "XX XXXXXXXXXXXXXXXXXXXXXXXXXX XX", "X . . X", " .............................. ", "X . . X", "XX XXXXXXXXXXXXXXXXXXXXXXXXXX XX", "XXX XXXXXXXXXXXXXXXXXXXXXXXX XXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" }; traverso-0.49.4/resources/images/appearance.png000755 001750 001750 00000005441 11163362147 022056 0ustar00remonremon000000 000000 PNG  IHDR00WgAMAܲ IDATx[\Yk}sf>7c]a*IjQBJKHѧJ)y8!FDABi;qubu}c3眙=.<?i޳Zk=ܓ{r7EwرmEzrСϼ߽ٳnϞ=?OƊ1((Ȳ )%Qm<䓟?q>8qΡ&s<'2,l/#<;BI)<)PReY25=xȑW5B$eAqen4mظΒgyYS9i'}iZfpn7no\c0k+>|>c;Łs5= 3XcSy&vj5G~syy@l, p`qg7[- ȱE)S0~ eQY|^Y^^>o#@-@x@#c#Db -Q SO=Nc (aXb͈p]L!Z` #3J?Nq[A) py9{rQA2 :4a7Eb%Y,-ZOM4€\WM= Xk.Xg׹W~Oykjw^Kʎ'RK/_S^W$>+Q@*0F &2Ĕ!Qu|"P)"Mimٱ*+UaOšjjPSFo5xG Yvv0(q.ƚsXm(4 0T%7jy'yqeE/13 _)Mzq(ojF9"e JqS ,g%@1!egί>;pi5HA{EF@gs`-%Iu8(t5.` ;d[z ?fQ2ހn|($ɀfRHV=Gş#lbb[(kH.l0vYW'vrކ`֞%[bÛg= +yzW0ohZ+{j%6{Aa#N1Xq eX^&V13^ v,Ȓ{l%&zYvm\oFZŁu XI*0TT* 2]Pj)dlDkZtXgՎւȡ,)= D+ߥnb`ϒӴM"ʺ>!-S]'LЈB-W7+k+;ospaeP_ߧ|Sڱ07q/Hw[{rOw/?O\F*IENDB`traverso-0.49.4/resources/images/cursorDrag.xpm000755 001750 001750 00000002317 11163362147 022111 0ustar00remonremon000000 000000 /* XPM */ static char *cursorDrag[]={ "32 32 2 1", ". c None", "# c #000000", "................................", "................................", "................................", "................................", "....................###########.", "....................#.........#.", "....................#.........#.", "....................#.........#.", "....................#.........#.", "....................#.........#.", ".................#..###########.", ".................#..............", "..............#..###########....", "..............#.................", "...........#..#.................", "...........#..##########........", ".......#...#....................", ".......#...#########............", ".......#........................", ".......########.................", "................................", "..###########...................", "..#.........#...................", "..#.........#...................", "..#.........#...................", "..#.........#...................", "..#.........#...................", "..#.........#...................", "..###########...................", "................................", "................................", "................................"}; traverso-0.49.4/resources/images/traverso.png000644 001750 001750 00000016116 11163362147 021622 0ustar00remonremon000000 000000 PNG  IHDRd}T;sBIT|dtEXtSoftwarewww.inkscape.org<IDATx{xTս?+ܸB -p !̈c PmQĉO[y}Gs\oHZZo砥Z IHBBkO2g' 3 <ٳ֞f}gRJBqNݥtہHMz7X݁>lVkhE y!B+@=-H OӁׁy^Z oߩ!xe' )N#D.0KvJ;xB; Dy1K.`RN!R0Gi`%RNEƟ/-7p# !B$f727 ߩ b̘eJx} b!.%g襥DC[_FCI(2iXe~5u!b "k7Wf/ǐg+0UBik'Hx[BO#sL1~[˜@ P _[$to$DzЇ79 >& &],!4B& a>$#KBkZ`JB+aɘ-$zHjb@HC2b$ ZB`4iC2$c#6u~Շ&SBO; [MGBTwyĀJd4IF@Κ}LFZm8Ѓ:<(azĠAB arV^NB^41($7ڛ=G2Ox# Pv˥_NBLŻ?D94a8)??o;~ L;3.~D Nh/4RnUk?;ѷ ͐^| o{qMGXR߮&DIr~)})-"G}))pe}hk˳ ͐[HY80wt z?-R1!*/)yT&HM_fc@uR;ʢꟙs11|h"oZpOBr}Hy/=nG bnI-b6F4 QYr!TN?Nla/~:ST O"!7)ˑc=WrƌM~WJgGVB?|p?xT@%H "؇kjz:G1}ZZB;Pk?u:k8J{eWO6n ?L+6?` ~ٳ駊oԗ8 Lq% ط'a?@-:Hy ⺬?_u!S){b& HbҮT!&ȱ PˆEkwG#} 1~e&"3|ӨfXV=O۔gX%"5\5k} J>M&/3g'Q_@4_`D9Ө/H`[!&)C"}ڹ@Av*!Dpٍ^11oW6ނo-\rŊ_Q6=*jBfffS￿.f`tkQKlOl]Daܸ~DB_JI"##̔7z q/#gHR^ރU23&1HY%H *_W2!/vE *^ ,[[jPeevv6555_4ső3]v]'x.$#8. Pr,6_+iTTTO>R7ARRGn2eou'.;?^xΞU:;X,gyHuX,hnnn mijj*),,[⺒[Bz#Q iksWoQkvGV_)Ƞ#]Gtt4 .={úÁccjU=oW!ҝ9nP?^C`Bx Vƒ"6]+2t.ϧ“su+pOͿtz]]w:SA?! 6"i>|͛7CuӧOg999_ = GJ `nD8+ݱl򗐑j#*pɓ'3`nСCo v+[Ι3g>[ڜ᫯VK^={5){QI*z }=vTذACsP_by,7edd\\\lAZѨQHOOmmmzݤVoώq gBEʃ_r/B| 0{YΆQ&f \w|36eF={(Q nl6;R1Vnn.UUU۶m;RA0PǴiӘ4iROOOQ: jfjG}TX\=Z >\XTh!P4 ׃H Eff&}R`nȑ#nk!,l=!|1J+^` }}J?(Y͈wށ(p+WϺ:E_U\9VV@#aJXKuu4s3w\w^ Xl6:;;18neLfCo[JY܈Gwvsaj"ŞAem@jСCHZRRRܒ̨Q:N |}PWaW)+5bVV|Ǐ8,L̘ 11gljp:{Ư1cXNgggo0hX,w^w=o٨}{;ӿ|`TVpYn[ &2uH)'L2!AʰK=`z;S[nA},Б-ObccO?SOv·Yy)#*g*lYU]]jy=aOpAQ\\)))F97QnB4jjjZTTԀ{KT, ߅+e 4o jksfb_qqq^w̜9Ƈt_ %??_644kp Jr%C!e=J|3%SQ:.%)[wX,rss/7&ڴiә.`͒%KjZ~{J׾d?M s'7E Zq2Q$O82F{uQ ӫ٭ZJJJ<c,Y?Xehll4ˌQzh9!xS8NUUǎB\;//g}K:1uTN7n\ F/1c "jR[[Rbw ݗ*|(DNCEPE6O6nئn]p!Rʮ2ŲedXX?\¬0߅ ޛy"(=z4K.x0Q[}Z! ĉU<{Z52ُsN\0!ksrr9^ZZ_'N$)) Z:uJ+٤+\Cp"L[xx@j{֥. u޼yDEE?f(`P7\ķvX,1h C%T+DNuuˮt 3y= 3M (,,t3 je˖tjǎzϝ#..yP\B!Orr2]]]wȕVhAVxw=H)&1daĈ'D]͎G 9fϞMlllooo^7 22܊Hfc&rrrhhhxX_)v~TVVRO;9ENfaff&m%%%FOzs;tލhAǏ/58*mZ>FAf]BCM8.4ejr72zpV 6½A$* |*̝QXݪHJJ"..NW_,ͥ(xz s=jWF!( rrrB<`fK\ꢀ333ؼy3 bmY5b*o˖-1qƑƉ' nSYYᚠ40zj1V1hS/((ċ/Mf"11QFEEwhfs=DcܹL0AJ) M!!!aTUUm!j{&A-/܉ABu˖-P`ŋζR1cưtRN:s<aƨ\r=AlXd MMMF(\ LӜPo޽O7Bͥq֭ooV؂~*; BLVkvm۶ #119sب[PeZ=@ ,s@zl=pzBB!DDAA*ckᣇwڵߥNw,Zӧ?df15!]/^LhhhOxxC;vQ]e灼wqU 5 s'!p![b &ݪ^gM8,7Mi ~GR4i$."ZZZt]<Ç+zfoWC !P[ݾ}іxE_|1IKmmi6#Â%`XӷYfc{W]e˖q:77Yfgo1%!NC%\B[[[WiiWpİxb?WٵcJ!ٵ&3,܉$%bv;pJLrr׮]8̙äIdWW@9f)?8JHQRR񲳳pЈ=ꦬ !e_YY&1!2 ] r۶mU< رcĉ:Pk+1!@Qtt4iii466Yݻ>ژFm+ז۷a Wp沲2 SLaogBneV0ٝa]ADPUU6B[{?5#55n#p!}1 !A[nVEUU v!x]o؇.Ì!M6i&]Ufgg|^oHHHH 99'Nhdʂ}!)a1,&B'O&))fxrkJM۹s&ۀ/܍+ޱcfE)))Zw[xxxXNNO\`juf/PO)Æ X)0:77ZK](6++6&0pF'U67ܬ266TZL47wYq)`5R:z|pBP8o;!PQ#oٵk>ÑDBBF9A=.ω=@R2hp!$''/ڌШ<>iK5ݻwxEþ C0Yfm/ݱcnr 詮xbZttHOOرcCgQO)⯘\uV_*`o݋^뮻W,aJ"U?UoU x"')6 sg2cH&xawZ9cI<.NܨTӄM+,`G! r G~;9 )+pWZaN,? .aڷ}M0xiQ|^Do?%#tx7zcu Fl_|@ @G,8%H?3e-B T&F X[܁7!`#X ] pTZ@+8:yp\]0/w[,_ @QFt6x#H4G#H9R"H?r sEC1Q(K+*APUTj5&:h :DэvUz 00,dc01mK!$f`uVXol6 Ğ^cqD pr\37-x 7ߊ/7wS%E" VU8 HT!}qĝ iuJ&9H}K7d2YlK%WOhbzbnb\bbbb(x:ŎE)ܡ̉5#ķW_IJxK$II4KܐbT'*G=FB!4UCMk]M1tݍO/LKR%%%HVK^0Í(fa2>J)HIEIjZ.n(ÔqI/)D%-+){D]R#W wF<,-'-L~@~AAQE!YRœ"CV1^LGqVdTtQSiLdV0ʮuʃK*,\6'Ujjj꼚ZZ#u:[=VzK#HcF Kb5ɚ6)0ZlZwamXj;:NaUUxWtt3t[t'zzzzC101H4h0xlH5t756HۈcTmt5yV612>bfeǤ䳩)ߴtL,ܬlMg;ϛ0H8c񗥮ee֚5 k&T"Lpezg\Fi;-xSv .9".NT**1-.&..\Ѯ]8nMnf)>b|}|}۴y;{b Ǡ A~[!!q!]ЅN 3 ڰeÍ7^Dl8:<(9SwD}B[dM<ǁsk-FYEFMG[EFX-s{_p"a91(- tG%6+n޲y(Y'9?Ybr0eoLR7vхt'233gf"e`ֽ[g9ٽ99r&mm޻CuGގ.;O"Ju; 4y y;&p%_,?rO폨~ܻzo/܂兟8E72}M`Jx%m,(*sר/?9qyC`CqF'x''N55557--NVֺ6F[ip:_=q,lִ :󝱝sz-y$/zz/f]\|irM_7xk׮_nu nov21`2~v`;]wv|޵no }06&x}00GG<RTiZ L&'{x3?>M='?/Vn19?<{S/_.)g+We|k忋ȼ9mwI ˼?cOO>w2,r \@"D. r \@"]a!+˱1 @eP4zTXtauthorx JLM]IDAT(uQMKQ=y`J%!hH{!DQ-jբ]$- $3Bq{4Ӿ.ys;gDqR]dud, @A4!FԼ;nѭ&kFpN-Y^L\G`i"B$'M= IF+ @k  Y"(r?#(3AG Sx3i[6 C`$c V{pf, it means "press 'K' key on the keyboard" (only press it, don't hold it!), pretty much as if you would've clicked a mousebutton). Similarly, [K] means hold it,<> means double-press the key and means press two keys at the same time. Examples : - press the J [J] - hold the J, <> - double-press the J, - press H and J at the same time. Now, imagine that you are playing a very sophisticated video-game, and enjoy the power of Traverso :-) ********************************************************************* TRY THIS : ========== - Open the project manager, where you can import audio, create songs, and so on. - ( It is not hold CTRL and press S!! It really means, press CTRL and S at the same time ) - Save current project. - Play/Stop. If you have armed any track ( by in the track panel), it will record the input over that track too. [Z] - ( Hold Z and move the mouse ) - Magic Zoom Tool (the best of all known audio applications, including those from Windoze and Mac(rap). - "touch" the track. By "touching" a track, you set it as the active one, and also you set the working position (from where play will start, for example). [TAB] - The shuttle tool. Hold TAB and move the mouse left/right <> - Exits Traverso ********************************************************************* READ THE FULL Traverso Contextual MAP SECTION IN THIS GUIDE BELOW FOR MORE ADVANCED ACTIONS ********************************************************************* *** NOTE: some parts of this help-file haven't been updated in a while, as traverso no has a much better PDF-manual. *** WELCOME TO Traverso! ================== Hello! By now you have already started Traverso, found the layout very cool, but couldn't do much by clicking around, so you decided to resort to the Help Reference the program gave you. You also were about to give up using the program (and click on the little X button that your favorite window manager gives you to stop programs). Don't worry! This quick help guide (which in the future will probably turn into a Quick Reference Guide) is here to rescue you, explaining what Traverso is and how it works. Before you try to play around the project, we suggest you to read the parts about the Traverso Contextual Concept, and the Sections of the Interface. Everything afterwords can be used as reference, and are a small insight of what is to come. (Hey! Its still under development) WHAT IS Traverso ? ================ Traverso is A Free Professional Audio Tools for GNU/Linux. It aims to be the most pratical and one of the most powerful audio tools for GNU/Linux. Traverso *does not want to imitate Protools (tm)*, and this is because Protools is not the "gold at the end of the rainbow" of digital audio. Jog Mouse Board (Traverso Contextual ) CONCEPT ============================= Traverso user interface is built based on the Jog Mouse Board Concept. Although Protools is such a powerful suite, its interface is designed around traditional interface concept (mouse, icons, buttons, menus, and so on), which forces you do to toggle many flags on and off, move the mouse back and forth in the screen and generally, you end up with a sharp wrist pain. We think that using only a 1-button device when you have a 101-keys one right in front of you, is kind of a waste. Althought the traditional kind of interface is interesting for Graphics, Word, Vector and other types of editing programs, experience shows that for audio, unfortunately, there are too many different types of editing for only type of action. Bottom line is that the traditional interface, for audio editing, is quite clumsy, and ends up slowing everything down. This is extremely undesirable in the professional environment, where the studio hour can be expensive. It also makes the editing process burocratic and boring for the engeneer! Traverso Contextual (Jog Mouse Board) is a concept and a engine that offer a new way to edit audio. The user simply does not have to click lots of icons and menus anymore to perform an action. He has to perform a Traverso Contextual action that consists, in most cases, of a key-press while pointing or moving the mouse. The idea of Traverso Contextual is to speed up the audio production and avoid wrist problems. Using the Traverso Contextual Concept as the guiding principal of the project, Traverso is designed for practibility, flexibility, reliability and editing speed. The three project guides are derived from the Traverso Contextual Concept: THE INTERFACE ============= The interface has to be simple and direct, because the more visual information you have in the screen, the longer your action will take, even if you just want to open a file. So Traverso Interface is as clean as possible. The mouse as a clicking device is almost abolished. Everything can be done with the Keyboard, speeding up the recording, editing, and mixing processes. Traverso supposes that if you are a professional, you'll be using the same software most of your time, so no problem if you have to learn a more complex combination of keys (compared to a simple icon, or a pop-up menu), because they get automated in few days. Tests show that a regular person learns the main group of actions (combination of keys and mouse movements) in less than a week. EDITION ======= Performing a CD project usually involves the same steps. Traverso edition concepts are based in the professional experience. For example, you'll almost always have to correct DC before applying filters. Applying DC correction is a static, one-step, twice-forbidden, action. It makes no sense to have a filter history of DC correction. But makes sense to have independent filter histories for EQ and Chorus, for example, just because it does not matter which comes first. Another important point in Traverso edition concepts is that you can put every filter you want in the audio, test it, and if you like it, you render it. So all the possible filters resides "virtually" in the audio, until you render it. This makes Traverso to be considered an audio tool of "real time" effects, since you can turn "auto render" on, in fast machines. PROJECT ASSISTMENT ================== Traverso soon will also include Project Management. Generally multitrack audio tools only allow you to work with one song at a time. Traverso will allow you to manage the songs, their titles, how long they are, which project they belong to, at what phase in the production process they are in, and even burn a CD in the order you ask it to. This is possible because we take advante of the many great GNU\Linux applications that take care of specific actions such as those. Thus Traverso only has to manage files, and issue the correct commands, simplifying, as much as possible, the task of actually recording and mixing your own CD. SECTIONS OF THE INTERFACE ========================= This is where we begin explaining what is what in the Traverso Interface. If you look at the Traverso window you'll notice that there are 6 distinct areas. 1. LCD DISPLAY - This area is at the very top. Its is greenish-gray and (duh!) it looks like an LCD Display. This area tells you which Traverso Contextual Actions are being understood by the Traverso Contextual Engine (or in plain english, which Action is being executed). 2. INFO AREA - Next to the LCD DISPLAY, we have the INFO AREA. It tells you which Song is currently active and the Project you're currently working on. It also gives you information about the used rate and bitdepth and last of all it tells you what the Horizontal Zoom (HZ) ratio is. 3. BUS MONITOR AREA - This is the area next to the INFO AREA. It presents the LEVEL METERS of your sound card(s) buses who are available on the system. Whenever something is being played, watch the meters. The BUS MONITOR can be detached and made into a separate window. 4. SONG AREA. This is kind of obvious. Here is where Songs are displayed. If you want to switch between songs , type 1, 2, 3, or n, say, and then type 'S'. 5. TRACK PANEL AREA (TPA) - This is the greenish area on the left side of the interface. It displays many things. The Track number and name is at the top, followed by the GAIN (G) and PAN (P) METERS. On the top of each box are SOLO, MUTE and RECORD LEDS. They tell you at which state the track is on. On the bottom there is a IN:0 OUT:0. This tells you that the input card number is. This will be explained later. 6. MULTI TRACK AREA (MTA) - This is the dark-gray area, where everything actually happens. The line that follows the mouse is the FLOAT CURSOR. Also, the WORK CURSOR is the red-dashed line that appears when you touch a clip (Using the LEFT_SHIFT key). Also notice that whenever you record, a CLIP appears. Each take has a logo which tells you if it is a stereo or mono take, followed by two numbers. The first one is the sample-rate followed by its resolution. Next is the source of the take. SRC is an imported audio file, while CAP is captured audio. Lastly comes the name of the CLIP which depends greatly on which source it came from. Needless to say, in the future you will be able to rename takes, as well as tracks. Don't forget that this will also change in the future. Traverso Contextual ACTIONS MAP for V 0.20.1 ============================================== As you might know, Traverso is based on Traverso Contextual engine, that lets you make everything by using the keyboard and the mouse at the same time, without a single click. For convention, we created a "action representation standard" , that makes it easier to understand the Traverso operation. Where you find : - press the "K" key once and fast ( a simple keypress ) - double press two keys, fast and together [K] - hold the "K" key [KK] - hold two keys together <> - double press one key (fast, like a double click) <> - double press two keys, fast and together >K>K - press one key and then other key fast and sequentially n.. - type one or a collection of numbers and finally press the key once and fast Following actions can be placed behind the actions mentioned above, for example [K] and UD becomes: [K]UD which means hold the "K" key and move mouse UP/DOWN: UDLR - move the mouse UP/DOWN/LEFT/RIGHT UD - move the mouse UP/DOWN LR - move the mouse LEFT/RIGHT Following actions tells as where the mouse has to be to perform a specific action. For example ^T and [K] becomes: ^T[K] which means point to a Track and hold the "K" key. This can be extended to ^T[K]UD which means: point to a Track, hold the "K" key and move the mouse UP/DOWN: ^X - point (just point!) to something (generalization for didatic purposes) ^C - Point to a clip ^T - Point to a track (can be the track panel or track area) ^TP - Point to a track panel ^TA - point to a track area There are much more kinds of actions you can perform, but they are for advanced users. You probably will need , [K] and <> most of time. Now lets play a little with Traverso ! BASIC COMMANDS ================= Help : Just Press H ( Oops.. you might already know it, otherwise you wont be reading this ... :-) Open/Import Audio (Project Manager) : Press P and M together . It means ProjectManager (duh). This action will change in future releases. Play/Stop : Just Press Space bar, as most of audio editors do. Touch : This is a simple way to "click" on the tracks, so specify a new point of operation (the WORK CURSOR will be set at your last touched position). When you import audio, for example, the new audio will be placed from the last "touched" point, into the latest "touched" track. You may also touch a whole Track: ^# + . nTouch : n.. This way you can activate tracks using the keyboard ONLY. It's based on a engine called 'Number Collector'. So press the Track number (n..) you want to be touched and confirm this with . For example: 2 will touch track 2. 12345 will touch track 12345 ;-) Go to begin : or This will take your WORK CURSOR right to the begining of your touched track. ================================================================================ All other actions are grouped within their context to maintain readebility. So all actions which apply to a CLIP are grouped together, etc. etc. ================================================================================ ======================================== GENERAL ACTIONS ======================================== About : Some information will be displayed on the LCD about Traverso. Cancel : You will find no cancel button using Traverso, because you can cancel every window by . In some dialog windows, this is not implemented yet. If that is the case, just use the close button at the top of your window. Editing Modes : This is the first implementation of Editing modes. Currently, there are 2 modes available. Normal Mode : This is the general sound editing and recording mode. It is in this mode where all of the actions above occur, and by far the most stable mode. Track Curves : This mode will allow the editing of Filters. Filters can be added and edited by changing their "Curves". Currently there are not many working filters implemented yet. But hey!, its only version 0.20.1! Global Properties Dialog : This will take you to a dialog which lets you change a couple of Traverso's behaviours. This is also still a work in process, althought all of the options in the dialog are already functional. LOCK/UNLOCK EVERYTHING : When LOCKED, no keyboard actions will be handled. You have to first UNLOCK before you can go on working with Traverso Quit Traverso : <> Double-press ESC to exit Traverso. Record : This start a recording in the "ARMED" track(s) at the actual position (last 'touched' position == Work Cursor). To stop recording press again . Render Song : <> Double press ENTER . Rendering is the process of applying all of the filters and editings into one sound document. In the future you will be able to render all songs with just one command. When you RENDER SONG, a dialog will open to ask you the ouput file name. If you specify a .praf, the whole project will be rendered to a Praf file (Traverso's Native Format). If you specify a .wav file, the whole project will be rendered to a Wav file. Save Song : Save the current active Song. Song Properties : Shows a Dialog with the properties of the Song. It gives you the ability to change all kind of settings. Use Song : n.. Type in a number and press "S". Now the selected Song will show up in the Song Area if it exist. TOGGLE SNAP ON/OFF : Switches the "SNAP" feature on or off. UNDO : REDO : ======================================== NAVIGATION ======================================== SCROLL : , , , Use the arrows to scroll the TracksArea Up/Down/Left/Right SHUTTLE : ^TALR The shuttle is an action that simulates the Jog-Shuttle ring controller found in many VCR's. The more you roll it to left, the faster the scroll is done to the left. The more you roll it to the right, the faster you scroll it to the right. TOUCH AND CENTER : "TOUCH" the Track under the mouse pointer. This sets the Track active AND the work cursor will be centered! VERTICAL SCROLL : [UARR DARR]UD Trivial isn't it ;-) WORK ON NEXT EDGE : >W>E Moves the working cursor to the nearest next edge. WORK ON PREVIOUS EDGE : >W>Q Moves the working cursor to the nearest previous edge. ======================================== TRACK ACTIONS ======================================== Add Track : <> Add a Track to the current active Song Delete Track : Delete active Track from current active Song Gain of Track: [G]UD Don't Forget to Touch the track first! Watch the GAIN METER on the TPA! Mute/Unmute a Track : ^TP This action will MUTE a track. Notice that the MUTE LED will light up. The whole track will be MUTED, so before you go on complaining that Traverso suddenly stopped playing your track, be sure to check if the MUTE flag is not on. Pan of Track: [P]LR Don't Forget to Touch the track first! Watch the PAN METER on the TPA! Set/Unset a Track recordable ("ARMED"): ^T This action will SET THE TRACK RECORDABLE. It records on the bus(es) you see in the TPA. You can change the buses with ^T[BV] = select BUS IN or ^T[BN] = select BUS OUT Solo/Unsolo a Track : ^TP This will set SOLO. Notice that the SOLO LED will light up. You HAVE to point to the TPA for it to work! Select BUS In : ^T[BN] Select BUS Out : ^T[BV] This allows you to select which BUS is used to play or record. When using [BN] or [BV] a menu shows up with the available (valid) buses on your system. Point the mouse to the BUS you want to use, and release the keys. Then that BUS will be used for the "TOUCHED" Track. ======================================== CLIP ACTIONS ======================================== Copy Clip : ^C[C]LRUD Same procedure as 'Move', but this action will make a copy of the CLIP. Drag Clip : ^C[D]LRUD Point the mouse to the CLIP you want to drag, Hold "D" , and move the mouse. After finding a good new place for the clip, release "D" to drop the clip at this position. Watch out! You can delete CLIPS by dragging them outside the MULTITRACK AREA! Delete a Clip : <> This is cool . Double-press both X and C at the same time to delete a selected CLIP . This is a "hard" action, made like this exactly to prevent acidental deletes. To delete a track in this fashing, it has to be SELECTED! You can also delete a CLIP by dragging it outside the Multitrack Area. Fade In : ^C[FG]LR Fade Out : ^C[GH]LR Fade Both : ^C[FH]LR Gain (this is the Clip Gain, not Track Gain!!) : ^C[G]UD Reset Gain : ^C<> Reset Fade In : ^C<> Reset Fade Out : ^C<> Reset Both Fades : ^C<> Modify/Move Clip edges : You have 4 ways to do that. All them uses [E] (Edge) ^C[E]LR : point to the CLIP, near the Edge you want to move , hold [E] and move the mouse left/right ^C[ER]LR : point to the CLIP you want to move the right Edge , hold [ER] and move the mouse left/right ^C[EW]LR : point to the CLIP you want to move the left Edge , hold [EW] and move the mouse left/right ^C[WR]LR : point to the CLIP you want to move the both left and right edge , hold [WR] and move the mouse left/right Mute/Unmute a Clip : ^C This action will MUTE a clip. Notice that the muted clip will change colors! MUTE will only mute that specific take. Select a Clip : ^C ********** THIS IS NOT WORKING. Sorry, but while working on the 0.20.0 release we discovered some problems with this action. It is being worked on, the Traverso Contextual Engine will have Contextive Actions in release 0.30.0 which will solve this problem. Until then use ^C (add CLIP to selection) to select a clip. Notive that you have to deselect it manually if you want to select another clip. Our apologies for this shortcoming!********* Point to the clip you want to select and press . Notice that you can select Clips that are not on the touched track! Selecting is NOT the same thing as touching BTW. Select/De-Select multiple Clips : ^C ^C Same as select: just point to a clip and hit one of the jmb-cuts to add or remove a clip from the selection. Select ALL Clips : <> DeSelect ALL Clips : <> Select->Invert selection : Split Clip : ^C This ^! means that you have to point a specific element in the interface. In this case, the clip you want to split. Point to then split it with ======================================== PLAYBACK/RECORD (GO) ======================================== Go / Stop : CAPTURE FROM BOTH CHANNELS : CAPTURE ONLY FROM LEFT CHANNEL : CAPTURE ONLY FROM RIGHT CHANNEL : ======================================== ZOOM ACTIONS ======================================== Horizontal Zoom : [Z]LR This is cool! You hold the Z and move the mouse left and right. The zooming will happen based on you mouse moves. Try it! You can also try for zoom in and for zoom out. Vertical Zoom : [Z]UD Hold the Z and move the mouse up and down. The zooming will happen based on you mouse moves. You can also try and . Horizontal Zoom In : Zoom in horizontally Horizontal Zoom Out : Zoom out horizontally Vertical Zoom In : Zoom in vertically Vertical Zoom Out : Zoom out vertically ======================================== BUSMONITOR ACTIONS ======================================== DOCK/UNDOCK BUSMONITOR : SHOW ONLY IN BUSES : SHOW ONLY OUT BUSES : SHOW BOTH IN/OUT BUSES : ======================================== CURVES AND FILTER CONTROLLERS ======================================== ============================================================================ FOLLOWING ACTION ARE WORKING, but you may experience some (small) problems with certain actions, as it is not much tested and a work in progress.... ============================================================================ Add Node : This will add a node to the filter curve. By adding node you can edit how the filter controller is applied to your track. Simply point to the track, and press "N". Move Node : [ND] You can edit your added nodes by pointing to it and moving it around with the "ND" key. Currently there is no way to remove nodes. Node Setup : <> Currently not working. Add Filter Controller : ^T[FG] This action will add a Filter to your selected track. Select from the list that is presented. Not all filter have been implemented yet. Remove Filter Controller : <> This action will remove the current active filter controller. The active filter controller is the "RED" one ;-) Select Filter Controller : [F]LR This will select the filter controller for editing when you have more than one Filter Controller. Setup a Filter : <> These options are currently not enabled, although their key sequence is working. ======================================== REGIONS ======================================== Create a Region : [R]LR Delete Region : ^R<> (Not working right now :-( ) GO (REGIONS) : GO (LOOP REGIONS) : <> ======================================== CROP ======================================== In Crop : ^C[X]LR ================================================================================ ================================================================================ ACTIONS STILL IN EXPERIMENTAL FASE ================================ The following actions are still in experimental fase. Which means that: 1. They are very buggy. 2. They could be disabled in future versions 3. They could be reinplemented at any moment. 4. They could damage your sound-wave. 5. They might not work! So try them out with ***** CAUTION! ***** NO ITEMS... ACTIONS TYPES FOR ADVANCED USERS ================================ These actions are being implemented, so no important feature are based on those kind of actions yet Actions types >K>L , press K and then L very fast (dont hold the K key, be a piano player !) >KL>N , press K and L together and then M very fast (dont hold the fist two keys, be a piano player !) <[K]> , press K and then HOLD it (a double press, but the second press remains hold) <[KL]> , press K and L together and then HOLD them (a double press, but the second press remains hold) well you got it.. you can also try <> >KL>MN> >K[L] >KL[M] >K[LM] >KL[MN] traverso-0.49.4/resources/freedesktop/000755 001750 001750 00000000000 11163362200 020276 5ustar00remonremon000000 000000 traverso-0.49.4/resources/freedesktop/icons/000755 001750 001750 00000000000 11163362200 021411 5ustar00remonremon000000 000000 traverso-0.49.4/resources/freedesktop/icons/48x48/000755 001750 001750 00000000000 11163362200 022210 5ustar00remonremon000000 000000 traverso-0.49.4/resources/freedesktop/icons/48x48/mimetypes/000755 001750 001750 00000000000 11163362200 024224 5ustar00remonremon000000 000000 traverso-0.49.4/resources/freedesktop/icons/48x48/mimetypes/gnome-mime-application-x-traverso.png000644 001750 001750 00000005122 11163362147 033407 0ustar00remonremon000000 000000 PNG  IHDR00WbKGDtIME-6 IDAThŘipTU!Cb&C J*"U2.CYXeYGQq)A,4TV $B;I/ow^ws:RJ4auމ%7w`Xv_ɤ с>611Kys0l#b|=@!"HO$Y5Lj:~xkh~!B~ů&Ju8*p(W.vDF&$`\5ku}#sQyw5`9R2BPhʕMP^|ѧxW^8gBOEEpJg0]CYʗYYh|8|NE&%ymZ#y!D ǠS(zqhjaܸƘ_{ ))>!/qCю8p+*EEQW`~ xdw7ںuk'AE D#z7?{6c40e ϟ4boځA]OɄm(J:F͆˖-pb<~*{_ " +R|w܁=孷`$Xºf HOGۣ ]]+WP .đ#p!ڵ!Ϣ X6oF|1̜  ƍÔN'8׮Agp+p}3{~9xEE}=$%An.bMC88 Պ~ee{'"4 {TEECX0Q{4`tLsBZ렪~˅сp K!?IQy^>3g [y9ƍ#a CYƒnʮnf\21cm2!<ڱg@-/( fi˅vzQUMF³e gnڄip𠯲v"9 JCtՓL@S{,y~<k Nc(+]ЀRS܌hkCtvbry?'7ߋd4<oi$dlh˗Cz:PL&ɓ1&OL !HLctBcLSl\dQ?,Yb TΊsP>)4lFN׉!?TDz9Bϝf `xL9s7%:$ffg],Tm[0[{_~kkk+?|߄LMUl0Lbw6br}긭4 r /^'Wt6,D[$/p-(ӧ#5 Pڠ-Db7)&/}!U'W%SW89RsWJeꤪ"XFzj's{b Uݩ3& ,xbI.+3vK%#)edΜ9CCCC㋓nf+$b%UsFL}}=MMMJKK#J`dGen!G^fV^7{),Ӌ2:ft{J`( _1w]6aF;ǜ]Z+JȨ_tiF@Nt4_uPigwU+ {8|DRKWQpyyym{nx9$fR љʞ dvxǮ?t][ooNPkpM+%;!wr:z1W!hiiaʔ)~k5&0kg0~r6wLL`u܋VY\)%.]bڴim)))6`0g@}'M塢]na=z$U9PyVj͈#t??iMIENDB`traverso-0.49.4/resources/freedesktop/icons/48x48/apps/000755 001750 001750 00000000000 11163362200 023153 5ustar00remonremon000000 000000 traverso-0.49.4/resources/freedesktop/icons/48x48/apps/traverso.png000644 001750 001750 00000005176 11163362147 025551 0ustar00remonremon000000 000000 PNG  IHDR00WbKGDtIME+ 76xU IDAThřkPg]X@AAPEQEhkLH0%&U1餩\:|hڴfƤ3LMbxɨjb4iF5Y.DJPgٝ9?9yw.@"##*pB`C J฀jF !o8Լ8}Lj^} $ 5 04 [, | lRn`(Szg0nbf"\2xM`M)C`U|&?JPHH d0 ,YkA: c({\|Ͳhȼy"`LC$06w%:Zdf+n>V`+%/,"{y(lF`O 3kh;wSj FP@X R >OWǼm XT>PUw8`3/BwwP/;7L>|c+h D Ms P~l"8ŐMM]]Gסtܯwa3!ի@uuQl5g Q7FVpΚv51>q^oa+8!At4TWO0!2D&T e`D)hB"1]SޫOrMcjCUrYh0Q L&p D3orG2t4(vBZRF=:Otޞ2|}$lzsY<>XQ?w LrvpT,"#4v@[`//KP\>@i*+WPY9Nf3aa;1~2҂*{x !v[ E/]шK;))Fg` 1g <1MMيpj1x_8Qn :fzƎSd-haTbk14jl$FV񺥢v|fn߼==tD4E3^+LqiLBE&;a{)2w.l $B)%4'Ɂ.]l=X%=l3.{!R%>w]LќǁhNV.'g:f[*HɘL Xpa8iiPZ pTA<#D[:UNU8XϮ00`[Y͸+!;.\\L<2әU9+J#3|pCr;s߱$^N1a$,4:O'TρsrÚѣDkOuqSΧGZX݌Th\cNJCS; {WQ)7ykGBCIeSؖ@JVH=Hl}8:$@߬[݃9y Z "x*Ha0HJ6Q0ht]_ OwylM;= b֔::6a5~%Ę1{ l-@DBR+ '_}!DyPRi#)=Iu+;1W'v{!\*< MvSx[-l9ZW#uɤ-W 4f+8t'T@=^j'$GF:i1N )RX6ae%6mz` Y׎\_2=|cή?md1^L?6P֣IENDB`traverso-0.49.4/resources/freedesktop/icons/24x24/000755 001750 001750 00000000000 11163362200 022174 5ustar00remonremon000000 000000 traverso-0.49.4/resources/freedesktop/icons/24x24/mimetypes/000755 001750 001750 00000000000 11163362200 024210 5ustar00remonremon000000 000000 traverso-0.49.4/resources/freedesktop/icons/24x24/mimetypes/gnome-mime-application-x-traverso.png000644 001750 001750 00000002032 11163362147 033370 0ustar00remonremon000000 000000 PNG  IHDRw=bKGDtIME-6IDATHOg?ﻳ;,UQ. 5Mr0Đz(ƛ^ͤz1*rh44mH)-Z4tU,/vvf޷aaa}0|}333cXPJ>hj6/3lDwbX[] ZkRVZ WVWoFV ڬmJ)RU j T 1[ ݹB{- r`ݍ;2z5z{ [)%p(zxuilm|F+ɓ^Q4@.ׇq6u|]vSZ<7@\Awua]Vgj4pbl #t$ꠟ>d>J}Ϳ kիщWH&''Ϟ&X  y"+gμhud˸CCP.CtU!~ƟI%(!l0jIoaD\nmE;ȃaw 22MEEg-mZ*H)BpΝ#p2T<ڳ#p96/\A%_PJaY7B8|AxJ@&~?/XTDmݱc6uB !|P58ঽˇ7)t~ Njyg> 0PKfb@"bD =9jZUƌٹo^R:8@:~;N׎ReM|_NxmB077>VիB%KDMf%,+>?? =~c@?&ؽf>Z%xz|>?X+)4OT୐E+XeY*1˩4ZRJrv+U>DwwS,U{{ie4iI K0 ɤ?0Bg}ƿ@GdIENDB`traverso-0.49.4/resources/freedesktop/icons/24x24/apps/000755 001750 001750 00000000000 11163362200 023137 5ustar00remonremon000000 000000 traverso-0.49.4/resources/freedesktop/icons/24x24/apps/traverso.png000644 001750 001750 00000002005 11163362147 025521 0ustar00remonremon000000 000000 PNG  IHDRw=bKGDtIME+?)IDATHKLU;3 )T6eӤi$ҺS&qFƅciHc6b_ *:`2?y0OfqӚɐBIsl|Tt  /E* 8/p: 8 GF^Rl^؝+\ XhͪEཛྷ / KYy)&64e@P]{Yik, t m*#ٍu F)*Foov;LO//'HHh po*颵rx "՘LDD"[z$7߈GRC9JY` &'(]aYh2.;Riwmaρ~z~sIENDB`traverso-0.49.4/resources/freedesktop/icons/128x128/000755 001750 001750 00000000000 11163362200 022346 5ustar00remonremon000000 000000 traverso-0.49.4/resources/freedesktop/icons/128x128/mimetypes/000755 001750 001750 00000000000 11163362200 024362 5ustar00remonremon000000 000000 traverso-0.49.4/resources/freedesktop/icons/128x128/mimetypes/gnome-mime-application-x-traverso.png000644 001750 001750 00000022476 11163362147 033560 0ustar00remonremon000000 000000 PNG  IHDR>abKGDtIME-6 IDATxytTǝ?vVV 0!@BIv0ؓI'clIq{&'y83N;$8q Ỳ.u]Q[tZ 9}޺u߯~۪Z!^{ !|L U0B^ Z,ڈY^ {ŻYC(>>~NJJ>}}B Uk꾱n; uuuϯ"c@1b-33oG(w#D:jcE Is?c^_"ڲXӧO`PC]\Kt7bկX#Ҿd[k8#Rܐ pkbqAHZ!?~D[ ߕuכ%FOapqKLX#BaXXeW7 DBFvxGOaXທ:Hz cߔ:=`ʺ7 \OZD" ڸ)$@wXjr3ވ?"eS|M1uWٻw8HJB 1n4~u,ߙbb[n\_9^efAKK뢴w,ƕ꘦vX7V~"WWˢ1@}Y,?կ/[HJ oSG,ẚb2@яP ys,_zܢ_Q ( X,=9np1@GӉel7 yslI|5S`qn v;@Y2d]GgpϞdGBttb>5kBo~{eD׳BayΉm*~(=7 ,g,_m"~OQGMQ/;{4RtkNL=1cցBiZJ`_;uJE{q-=|?]AHi !0+m6JJЗ.E$&~䓨v44x/{m66`ff^@ߍ)ʦMO<ͬ,K!99,n(X?R II/]ځr+ QRS1V.ku:l?IGsbNx>w%xVBHģ[߂ %~VV:vٳ=7yC  mm_:?z\%kʚgP2dW~񋰺-C D ts|Q㥗UU]f N| "3端"c׭P C^7~kYr挷+_fϩYTԭBdp>0@hh@(*˜;7*~ ނ)S!4'OF{膀OwG Ũ?1|y1z EO33߅ky\? T[un\W@Y׃_Xx1x_q_]uFyO<wC[ M>snu5g_̥K?AvgEL>~3#eSQ+\t  w? ogLpiQ'ԩ ǎ=\5M_iQ;b^P/FٲeѢ?JOǘ7t++h}ᅠ bߏWv{/>ۗfߎB=yҿ} 9%H`P. I^~ we UoQؿSOAZI,( ᮻX>oq8u&ڊRSv4,+x sr`^y QV2*+[' `ry矇Kaz,۷cپ]^201`fz:fJ p19; 4 %Gt Y9wo~oa={ Iߗ] `wmw8/ /ߗ5 >X~S֡C6"9{(JSD =D|ҰF[oy<(ȈIG~&\vYx(P] w nCbTTHb> 'NHF~Յ_i~Yűo} ѷo{P6o+71a{/,~ݻeVu0~<~ #Fȏ/4M1MMrJin`K)?mmwG{l;5u]8y$"f* 7DqϫFIQ 21v,Dzf ?!uvl*ȀtfhNvMR_//_%N`ɒ'})fTڡ~,AQ0f1!˖a[ C%&C޲Ͼ"p1J{jٳ{1O(M3.]oMCu9\NJxjӊł8SOQĆ(F9|tsᐟ-V)zF#o"ԅk4̭|!CP׮ŸnQQZZPQ\#Jio4Z101?a~u QhώgQA9s r+e;ֶnlrr1;Z[%@T9pOsr ) W1z 1x0bA : >Saȗ.)5RMMMMMr) ?fJ"YiV)z%F=Qm9(e#8OmWM68i *c亵d@d߾~R%ݶUlYyy7Q,(*[< U}u^N#Gp"ŋXU3#=!L)/^nM_+Px(1y21QW-!$l-|H6L] /qq(}Ϣk?>lژ1KKi9r\d s-kR${ H`tV v'f,L+z+pwVQ6y{)į8ލG:0rɗx?o%K\Yfe%fI\ջw}B~#U`=[Svi|g '>O[_ d(.mI&Q.#&?N|G~~+inu麎먪ffy_R4f_'e}`}a=zT~,2=Z姮ufT WUPFdgcdeAN"=C?܉. c&p K#/#s1i$5X!{%եobT<_~w*Ey˭IĭL*.h1Nd&ÁbjbZ=+3??Duojƍӯ L_|2߭|'UM E2yLm.pG&3jJy}7ny7`]ZԩS)/Xu 7PW| !@ ~kƎCWXvƺn:.G{O8} SCisuax)**`zVХdU?_UTNd[Z f'qc9 xEϩcaJqxذX0JJ0JJ?GijBݳˮ]XvFݿ/Bg]OP:\@ r aڹP̊.33YAH_J:yI04<„ ?r-I.~M?o`)ܛR ~Q=G0i5E߾UUUU36>C=vLfϞ?r jMoz/w|\{rp0a"G/mn 5^lL M 2@$,"ɓ'3>g;ίVQUR*q;=SM zʠk ; īuvNW+Q^^NQJG?}YF*<do4:(+q~!45vBnRs1ǦUw?eTL-c񮀑e(u+j=o+QL2gi)9MŘ2%Bu;5D^k3f y .cڥ`nUOxp |pR‰y񧇠}p=^?JI{v7+FG)>njieϩrG':`^0}-.cV%/# # 3?_*nOgb"CuvK)EqE>@9/\s^ĸx0m4&]8`pGu5[<&ro[.g~}-=bȞOG)kq兌˃CO ]]CTK i(aPy0zfohl{ڙS:ޥq 35^qyF_~_MFFV [Ϝ %a8ߘ|-wRc}t?'N$?g-iWIb7wq8Qge Gr[}}FwoIwKpgtT05]gqGee8Sg0`riX0[a Auu5k<MsGue{=_}v>ZeovOޟ1kVqb[: nlCs,*KWa?⩳$ o'wg>e LFajOi4<}74vH* >9{ Ƴ\ 7?l>LBI6Ҵ+zy'߿MMedfμqPwh ԺԶv+_)k">塥":Pp477#eUO> &y2S%'+<;rڵx㉏q3^ D*mTfôeU|SgJ&]1ڜ^/Cw!ohhhQe<_Gi8y]TVVRVCƒ %K5kՄgwX/X nyj￿$rzdSo!2qKU&p~K#gt0,ekw4m!- R?xyC3SN g)rn«e4pҸRb1׻u]gҥ466%Mj @ƋƴiӘ0f 39} 4P\r+w~h6zSRδh|5MX|ÿHQ f~zM]1u]wމ)fgxMR܂pHI;yck+UUUL?vP6m2㋏{Bёa">܄@㧱7WO0BX=o&b_qۙfscM~?p1od h5g.6~_3UU)xAĺJވM`_C|0ذa顈%^7?Q:MEE!cCԙ 1dD2Aomo7nKEhR7a__Aqq1#6#NU^xJ*vbTzN¶VULd|I@ ~scǢ/Z$]mڴΈ,↗~zVh5^s$H~~3}h.>LPHu_h`¾^(-oǘ?}j˗|͛7w6ۀ#EMŃ>[9j2Jb"ħo9s=8Sڻ_xzgGcIK?f?оM6Ư|Iϟ:[n%##>cƌ@s*s( @;a N>K`OV}7|#nǖo$sO8NA{-6Kl۶A $7wތ[HLNNf~eƍcǎ>}]%J\ʀ+a (EUMBUUFv}0xq8-wuI] Z[ۯ_ኢ{l~p:hԷ---?Ҳ?gΜ9sl} DHhmm}ĉ[O8q5sCA=`e_z5WIENDB`traverso-0.49.4/resources/freedesktop/icons/128x128/apps/000755 001750 001750 00000000000 11163362200 023311 5ustar00remonremon000000 000000 traverso-0.49.4/resources/freedesktop/icons/128x128/apps/traverso.png000644 001750 001750 00000023536 11163362147 025707 0ustar00remonremon000000 000000 PNG  IHDR>abKGDtIME+ 76xU IDATxyxTy?wv $! I!(vb\?N48>n~ִM\e`{Aj{7G! G^v? DP`{A}X>wA@ýw]V{}NP>7:MV@ E8 xׅ~G?_/D5lY^#Cp}CA`pB7zy/  Kz)*sង^!^v𗡐ងl;C@ud92ܓ0D"{{E&,2RFJ{!!Uټb `{/:!',-";)=IkD>r5ksr*99fBLLO5Y*99x x8r`F#?ܯ dɈJ51P P/"}w6{4y o&A '0Px_nKD\#kE&*pLa} O<>|q] {J.p7&hƹx;<7[(uqNrb Wsƍ Ker{(_9Ks{ܳ{Ug{1e |0&}s3K0T;!QLρ -WGT`srE" /x3&,/|{)-éSp" )5@=RH3(?#GjF c,_zsfJ qC*•+p횴mmBggEU`ݠ`z،  f:eKK9sH֛W9R稪Tvy/wᐯ}im/ |oOG _.W kNΖ) t1 Lm4nMMIKR_/!-oC93vCW  (rC>8cL._Hkhe-x *y?j,׉%Kwʷҗ+rG ֮m('N%ڦ!<\3^~~λh~Y"R,_FtFQ2@:\#'-lo] h@Q r! C<(*:y(篡iYZDGCG Y l;vҥMbODQƣ;]ODQ,NŠv7Yi2תxZevYχ+ aٓѧe;v _CPR׀RߌrmpǍ`fO;)) n{Fn+Og>5Z!,I":ڊ#X24e$X,"[l*.\q0*#Um4>91.ጣ/u&MγesG4 m'm`/^8Xf'Bnie 6?sO}_8{黤Ά1cy["1η #7;O,_9ILG~щRӉR@D/4:X[iױlTN[3-xņvOaVlr/i:t>o8~_yp^4dM')@Ro/c_؊[$co~-EV )w'X(DD<˕Yˍ.,7@OVps*siI=STTѦB Wt\*+7 m<P]]ԜP@7&ݰj?L< m$o@j-dg΄'x@~n9}'2~7}.#Fޝl`$BOvmhJPl3 h^d݁VʈIt ǖl8fLμStlt9rO],a=䙢@b8ClVj$_KK RFzj,~\Jţrbdq==,NQQ@+f@؏#ig'uYt\(Teb>JgxmB?|0s Hg:_|QzWp3/o oPhVm`'"ZWQ&.'|jMrT5@p:5&MDJ)؏`vE*ȼ}Ib܈w'1.]Nhgӂ_s#)]InW0EDyPVGbQ1xqEF BL! Zݳh!P\$ ⱯU3c8/Zл.4ӦM#.*i:i% << K44(.ȃ@Cѕ`+aN!w7hWdϙ#]EEutR!ɯ!U% qh q< (<&'JGqy-QHNN 9^s@/'y6҂8j@vm3l8s!9(#4~6cNֺ[G6s#hi $`'Dql0c\.Ѯ]2,Z@gb(A!97~^dO z8p@68[0y<"}'O`}c ߁0^Wqx gEp͊ט9ب3$evдbS]4^j6 *Iܥt@[cyfbr!/b8,^GR£v:hZًD=zt@ЪF < Qa20k AMeѺK=)L.L;1WWW3$7`LN^gᡇɈ߈%ľyEmU?qGk(҅kE*[_0r7НzbiAmBh'^gSƏZe~ܼ  c5R VUEUɿxŁyAaQl1:U`~h1j}L,pWWQa rEOWܵ `_pft]~ #F`"s?~UUS6W[a())!1 1N>w3<\2A5!qW*978tS65ߙ+0?4Q_O{AGke.Ckհ.M:~&L@fF8Snȵ:N#^,mnq7ܕ 1i(W*m]rٳg}ĴvgM6Z̝;LOGZTet8vQLO7{w!qoFmߒ퐙 Yϼl~?1M\w#*PEnAhg<񾴯嵧(**")qq$_©V4yN]CCn2vZo=HDT}珻FiELL,GhlK?-$.iB>?]{.S|)CҽB>'f׽3희[چ|IAܩ޳gϦS~0-\WXZ=$~l=  DJCfQ>CѝghlSyLBtgŶH.*,ih"jI6O9tA]_'ޗT I&ɸ|̿lpp89]k`'S(BCԧjYaJ_ŰW!D2j?=5kwњZ"<CT^. nfهMgXm\A۶&,L&{?d^}W`%xq9s:sK<;X-/f"1ɹ8{ld[V&3Z[e=/^Wdb+@-ڥ+u*b?""BYd2KHKK#?,KkL2飺qxyô)>K!߃na+"ܚU{X¨d~d5'[N:@#ENX 7/0fg֚ySs?B=J?+Z/[ѾB{1c 8?ʔ%c;̛7e;L~= ]A vdӧڇ\|}u7j OGx~śTΝKlIR̼3gص\nfЦZ??7@ U{fܸLOʍG)++#>Im8/B ?21M.CS : K?.Ɛza*;U݂w`wJެ-rN1nyvT]t+l+sWcu~HVRFw,ݫ/v `~?iwKw㜽܈f#hVOT|Ɍ3HNj&'մ[""d`yvS5/ͨ<N APe~~VRSS>}*%s4ִx&9:nK:~%%%$~FJv,q&_EӇ߇ <_{;NaHNDxjZ,L&Mʡx9Ϸ8c>qIDAT=bA~O;d? +BD+om!<@/$?7!̳I./;.*P_Α l6c25 xe;̘1팞Q? }|D BFn>i蹵Un4j~***HGL|;<,xO/lӿm6S.UZ|/f /_gzO GV^j/ vVic$m 2R3szaFIgcHܤ?Ku3^}Pߔ·>bڴiH&o9Mš^ XV?[Nɧ?=,ͯۈ/mRFCC^S~*>l6'|6 -s,tCrȞjd;DFFQVVƼލ!|Iyy_]KzbO _a@7NAgUW`7rK_!ycnw{dWB1Gu{xȣhJGoN !EQL ={MۏJZ7ePr1Lc>2k8" EڔAF)=tpA]7)w\SL]d6 ߢm0i$4ge^ aW${ P0ŐVSxeJJJHN:Gjz=+SL,pk (ۃt pg,t˼}'`U!D(_5 [Z: C{}|]t aH1ce=O'?р'oM- +~xywOc4&NHNN ORd}WlJk.µ8Z<S'>$o"*FGoǎ޻2W?1dC9x >DE(,,dT`z.ЄL.ktuLJp`dXN(J% ƣqBh/]N.+]Z?ˤ N5N~#c5YPk^KjJ#YZ2|oqziP}}#D"*.Dd D9Kt^h[~&GˆC>~h}}U6/ڻ;6f5ϯUq(~~G)cNjSTJQV^ssXvUZEk}ND }[TNEeJB|N}J7zzƔRGQ?CUI(iIENDB`traverso-0.49.4/resources/freedesktop/icons/16x16/apps/000755 001750 001750 00000000000 11163362200 023141 5ustar00remonremon000000 000000 traverso-0.49.4/resources/freedesktop/icons/16x16/apps/traverso.png000644 001750 001750 00000001134 11163362147 025525 0ustar00remonremon000000 000000 PNG  IHDRabKGDtIME+?)IDAT8Kq?wfsNZh,XaW]HY VnqBI,us_os{Yb5sps 0(lTNOs@R Rd&pX`IΕB0F:-|H N}f]|s[jAJj#LBZ6ྂ9.>CO"Q V_: +˳ =-v>KLQqnon C)R7Ϝ;37c؛ %7J{MrcrT6vR]Tߩ Ud:9>tS >fM}Rą?Bl@WSQ*γ,ůoV41= yږ+X8de'Lߨ[ZmJUac=IENDB`traverso-0.49.4/resources/freedesktop/icons/64x64/000755 001750 001750 00000000000 11163362200 022204 5ustar00remonremon000000 000000 traverso-0.49.4/resources/freedesktop/icons/64x64/mimetypes/000755 001750 001750 00000000000 11163362200 024220 5ustar00remonremon000000 000000 traverso-0.49.4/resources/freedesktop/icons/64x64/mimetypes/gnome-mime-application-x-traverso.png000644 001750 001750 00000007453 11163362147 033414 0ustar00remonremon000000 000000 PNG  IHDR@@iqbKGDtIME-6IDATxݚ{tTս?Lf&! !$BBA%I]B)"d5T KuAZ]]ZcY*b @H`x,B 5̜sd03@BwY3g};wfZ z{Rn'ܜD&G+7Ϝ9sF'`Ν:id}^ 垶]KdRU@0 =yV%GpcoJGb*^oznnPyD"T_+ݕ#A;* GѧOwiZ&`+[`œyl͛=}173`Z QR8rF@9VySU5dTzѭPR]ʕhׇZiZe'+^M+V_O0]/UP{^7@XueJ7hӗ/G}E"X6=!BF@_*CBJy v/TW# l[;W_5<}] ?ts/о.)ay liiҰ-7Ϋ>tYRJ5kFɄy3rаL)*´y3dgqU|e'{ x}ku\O? \0AZ̘cdCl_^dC/y=>Z{ O?E /u1W ~Zb ԗ^ Y;[Ȁcuٲ2 =, 6^4}('Oԩƍ*yNJ}A~}gA_8sǏ?|;9X{q>Gvm$ԛNq1r$;t~wV5X0|8|3b>_SRȤ$dThjB46"QjkQG b^hhlUڿMfeٸ˪U'a,((ˡ .]RhnÈ+;<˗H/ /*h6l};/5 ) RR:r0FKaz X6ZffP2/ A0t(8a!ZZmmvۍzV͆~e:%!B<(:w \=&hez-K N!EH!%5wn7HJ}=Jc#Q^/DG#bfdM4W$yb" JL;HNō'IgNv~B ?1/\a梢 O ccg$3gyy04 q˱+B88ijZ`ys=$D1>3q b E0`@`0>)!M-[ + yeL跎A2£Ⱦc(#ڼpqC*LVۆSƀv;HgP mEkk+', ヒlhUAXp!cffbYӦM(@]]d2!U'ҮǶ;Bsz^ rq k%wz0U; ҂fIinf3`2Pdb B /޽0S&Lm326Kb`dr2 >-`6Ҥ"M e0 qG+gUv]1hq!Gj*w @kEAQP3* wC_ '26i*46"uuPViבπr6w%ģ8R2nfKvp b:ʅR1Nb"ݞ r0I|lJI8Y %O}f(dL 2+ ݏftOz[_*29د1NN@C5*"YBɄ:DWZ8M%#Əd\t1dHsLbRjFg%#GBu5vHoW\FT]lL40?ka@thkt(+C͙`6숂* LLrHsr.[ zh PdρR<.'%LN:썜5#8?ÇvPy{L&н pӮ֬Sa,g!ኃY5ϵk.p[!|{<0[HOk90i2ٳ{챀pdBoL;5LU}[ɓ?~RS=ڕ{졮т߯?ZJFzâ&bZQ,@$XTTDRRKgVy%(JG]=5i*ÖTO9|xv3&^3ȚF_s_:u3/L#SM> _!9՗61Q9|2fc܇^<;/cǎ1k֬K6*bYzY&m7T]hV>=t)65Yxj ԣl:?D;QʍgA]9zO!H^׮t쿧99aOtpi$s28T`?5ZZ;ǏS yn/U'f g&w /l!܍mw# 32΃brss}|*#y5eP& 8Ə3NZάFmʤ0OECmFS0pOr`4ǒ4j*Ͽ8Zy>\=1}Ghʍ?L w x.W`@dՍR~n1 >gkl,ަ51_د`C__" իǭcH+Vtw48h @80wb `4 @ ѣdg0e |;oݬ<χbZn[Hvwk jaJ`toJdn~ ĠL0iDGEjj<ho3@k+44tGg |N=% 8 7bdΞn ÆAL dm6xvnY߸a}=SO `hKO~bcءlQj8Jш8P*tJTTڴy!NUW&G].E4߆^fzjOp@RX%C:wyr<_$}"Xo2@D]]uu= 7Y9q`ktG^{5*gBu<Ӑ1EZ 1ƚ iאXXVޫϏ)(p X;$ +;" aD}ݍͩp(&mZ >).Cg3idFDH - k ځ3`\gHuyլTx\vU&3(p̜NCW`)ְ_wCX5DKxEqϚ"Hhkk%/^}RiP6,>9x* Srqb8yck_]o`*bhy?0Ig!jd:S `)X48L? ""̯m7=#4%^0ܾC"͎X< `] {H2 !(,\}ϗ;jS+o4䵌c̋x`YxdLba _u? /^?~'zDdny_ w džD*04vgâE) Pg`kek`"`e.Ys" p 77R [vI!B-Ǩt+@(._ǏUSUd3Kkl<˖'R2[V6zUҗ n7MT "׵vg]gp픍W; hh˭X03?B$˖cW){K?x,)LUbPZNk4'aْTo ;C:ƍLQ_t'4 LWwrx|:5YdC&L_<&g(Wt՗w}0"bSJ-'>ex'Xp-V |!ed F3D Xϼyɯs::C?dz(`%>>oe#3Hai8_Ӱ_xJ|*+v)h[Ji@ǚ/F[K3'rYtbykWBNYEM#=%ODAA>CC PJ=e34܈ҙ:m;` [3ԷMQQ1`Hnvu+z* XOv! R_ '0b4䤠AN?y f1Qa_t&&znS<_yWp2%3*a^RF9ֹ/]sQZJn̛u!\^`rbfJRz-D[ߚz4 |5y+2'2"2x8| i_ ;N+]In)Ȱ*>s~# UJ:&?#(ƬmGn~e N(pM`hW!]_g',Z?o@p·<5N;%UM8#R11OɆSaCW6;fφ={`>vW__z_t7[c'McV.gӄX^`%.t^_JD+_*,kȌ)uq*"sh§`G? &\[.Tﰿ#`iA֭a歬*̝Ll϶fBiBDdg;t-ͷ8SՉ`sUK᪇zp:3=%OD%K`";_ PJJ){6z^}sia+׳.TIqW|eK4*,`):m|)c͚5c6o"VgwkC" n]K{1}&IENDB`traverso-0.49.4/resources/freedesktop/icons/scalable/000755 001750 001750 00000000000 11163362200 023157 5ustar00remonremon000000 000000 traverso-0.49.4/resources/freedesktop/icons/scalable/mimetypes/000755 001750 001750 00000000000 11163362200 025173 5ustar00remonremon000000 000000 traverso-0.49.4/resources/freedesktop/icons/scalable/mimetypes/gnome-mime-application-x-traverso.svg000644 001750 001750 00000045074 11163362147 034403 0ustar00remonremon000000 000000 image/svg+xml traverso-0.49.4/resources/freedesktop/icons/scalable/apps/000755 001750 001750 00000000000 11163362200 024122 5ustar00remonremon000000 000000 traverso-0.49.4/resources/freedesktop/icons/scalable/apps/traverso.svg000644 001750 001750 00000032052 11163362147 026524 0ustar00remonremon000000 000000 image/svg+xml traverso-0.49.4/resources/README000644 001750 001750 00000001362 11163362147 016657 0ustar00remonremon000000 000000 /* Copyright (C) 2005-2006 Remon Sijrier These files are part of Traverso Traverso is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */traverso-0.49.4/resources/traverso.qrc000755 001750 001750 00000011455 11427753210 020360 0ustar00remonremon000000 000000 images/cursorDrag.xpm images/cursorDragNode.xpm images/cursorFloatOverClip.xpm images/cursorFloatOverPlugin.xpm images/cursorFloatOverFade.xpm images/cursorFloatOverTrack.xpm images/cursorFloat.xpm images/cursorZoom.xpm images/cursorZoomHorizontal.xpm images/cursorZoomVertical.xpm images/cursorHoldLrud.xpm images/cursorHoldLr.xpm images/cursorHoldUd.xpm images/cursorGain.xpm images/lock.png images/traverso.xpm images/windowicon.xpm keymap.xml fadeshapes.xml themes/default/traversotheme.xml themes/ubuntu/traversotheme.xml themes/medium-contrast/traversotheme.xml themes/system-palette/traversotheme.xml images/bus-in.xpm images/bus-out.xpm images/soundcard.png images/keyboard.png images/cpu.png images/soundcardsmall.png images/harddrivesmall.png images/harddrive.png images/audiosettings.png images/driver.png images/memory.png images/appearance.png images/performance.png images/icons/media-playback-start.png images/icons/media-playback-stop.png images/icons/media-skip-backward.png images/icons/media-skip-forward.png images/icons/media-seek-backward.png images/icons/media-seek-forward.png images/icons/media-record.png images/icons/32X32/projects.png images/icons/32X32/sheets.png images/icons/32X32/audiosources.png images/icons/application-exit.png images/icons/edit-undo.png images/icons/edit-redo.png images/icons/16x16/redled.png images/icons/16x16/reload.png images/icons/16x16/redledinactive.png images/icons/project-open.png images/icons/document-new.png images/icons/document-open.png images/icons/document-save.png images/icons/document-export.png images/icons/document-import.png images/icons/archive-extract.png images/icons/tools-media-optical-burn.png images/icons/tab-new-background.png images/icons/traverso-import-audio.png images/icons/document-import.png images/icons/traverso-snap.png images/icons/view-media-equalizer.png images/icons/system-switch-user.png images/icons/arrow-up.png images/icons/arrow-down.png images/icons/list-add.png images/icons/list-remove.png translations/traverso_nl.qm translations/traverso_de.qm translations/traverso_fr.qm translations/traverso_bg.qm translations/traverso_cs.qm translations/traverso_es.qm projectconversion/2_to_3.html traverso-0.49.4/resources/translations/000755 001750 001750 00000000000 11427753454 020526 5ustar00remonremon000000 000000 traverso-0.49.4/resources/translations/traverso_fr.ts000644 001750 001750 00001001366 11430303020 023407 0ustar00remonremon000000 000000 AddRemoveClip Remove Clip Supprimer la région Remove Selected Clips Supprimer la région sélectionnée AlsaDevicesPage Form Formulaire ALSA Device Périphérique ALSA <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Device:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The real or virtual ALSA device to be used.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A real device is the audiocard installed in your system.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A virtual device is one created in the .asoundrc file, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">often located in your home folder.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If unsure, use either the default device, this will use the audiodevice </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">configured by your distribution, or the device that names your audio card.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">In the latter case, please make sure no application uses the audiocard, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">else the driver won't be able to initialize!</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">For more info see chapter 3.1: "The Driver Backend" of the User Manual</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Périphérique :</span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Le périphérique ALSA matériel ou virtuel à être utilisé.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Le périphérique matériel est la carte son installée sur votre ordinateur.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Un périphérique virtuel est celui créé dans le fichier .asoundrc, </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Souvent situé dans votre dossier personnel.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Si vous n'êtes pas sûr, utilisez soit le périphérique par défaut, qui va utiliser le périphérique son </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">configuré par votre distribution, ou le périphérique portant le nom de votre carte son.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Dans le dernier cas, vérifiez qu'aucun programme n'utilise votre carte son, </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">sinon le pilote ne pourra pas s'initialiser!</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Pour plus d'informations, consultez le chapitre 3.1: "The Driver Backend" du manuel d'utilisateur</p></body></html> Device Périphérique <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Number of Periods:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Audio is managed in small chunks called periods. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This value determines how many of these chunks are </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">to be used by the driver of the audiocard.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The default should work just fine, and gives optimal latency behavior.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">However, some (buggy) alsa drivers don't work correctly </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">with the default of 2, if you experience very choppy audio, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">please try to use 3 periods.</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Nombre de Périodes :</span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Audio is managed in small chunks called periods. </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This value determines how many of these chunks are </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">to be used by the driver of the audiocard.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The default should work just fine, and gives optimal latency behavior.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">However, some (buggy) alsa drivers don't work correctly </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">with the default of 2, if you experience very choppy audio, </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">please try to use 3 periods.</p></body></html> Nr. of periods Nb. de périodes 2 2 3 3 <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Dither is used to make the audio cleaner. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The best way to describe it is to imagine a painting with many dots. If you view it up close you can see each dot and the image is not very clear. If you view it from far away the image becomes clearer because your eyes/brain dither the dots to smooth out the image. It is a murky subject and obviously a very personal choice as to what dither is the best. For most people it is just plain magic. Anyone running at 16bit who cares about quality or has CPU cycles to spare should run with dither. Triangular is probably the best compromise of quality vs cpu cost (its very fast), but shaped is the best</p></body></html> Dither None Sans Shaped Rectangular Rectangulaire Triangular Triangulaire AlsaDriver ALSA Driver: The playback device %1 is already in use. Please stop the application using it and run Traverso again Pilote ALSA : le périphérique de lecture %1 est déjà utilisé. Arrétez le programme l'utilisant et redémarrez Traverso ALSA Driver: You do not have permission to open the audio device %1 for playback Pilote ALSA : Vous n'avez pas les droits d'ouvrir le périphérique audio %1 en lecture snd_pcm_open(playback_handle, ..) failed with unknown error type Echec de snd_pcm_open(playback_handle, ..) dû à une erreur inconnue ALSA Driver: The capture device %1 is already in use. Please stop the application using it and run Traverso again Pilote ALSA : Le périphérique d'enregistrement %1 est déjà utilisé. Arétez le programme l'utilisant et redémarrez Traverso ALSA Driver: You do not have permission to open the audio device %1 for capture Pilote ALSA : Vous n'avez pas les droits pour ouvrir le périphérique d'enregistrement %1 ALSA Driver: snd_pcm_open(capture_handle, ...) failed with unknown error type Pilote ALSA : échec de snd_pcm_open(playback_handle, ..) dû à une erreur inconnue ALSA Driver: Cannot open PCM device %1 for playback. Falling back to capture-only mode Pilote ALSA : impossible d'ouvrir le périphérique PCM de lecture %1. Retour au mode enregistrement uniquement ALSA: Cannot open PCM device %1 for capture. Falling back to playback-only mode ALSA : impossible d'ouvrir le périphérique PCM d'enregistrement %1. Retour au mode lecture uniquement ALSA Driver: Unable to configure hardware, is it in use by another application? Pilote ALSA : Impossible de configurer le matériel, est-il utilisé par un autre programme ? AppearenceConfigPage Icons only Icones seulement Text only Texte seulement Text beside Icons Texte à c^oté des icones Text below Icons Texte sous les icones Default Language Select default project dir Form Formulaire Theme Theme selector Sélecteur de thème Path to theme files Chemin jusqu'aux fichiers de thème Available themes Thèmes disponibles Adjust theme color Définir la couleur du thème Theme Options Options du thème Paint audio rectified <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Painting the waveform with an outline is more detailed, but requires more cpu.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If you experience slowness when painting many clips, or during animated scroll, unselect this option!</p></body></html> Paint audio with outline Afficher l'audio avec un contour Paint stereo audio as mono audio Afficher l'audio stéréo comme de l'audio mono Draw lines at 0 and -6 dB Tracer des lignes à 0 et -6 dB Style Options Options de style Select style Sélectionner un style Use selected style's palette Utilise la palette du style sélectionné Toolbars Barres d'outils Icon size Taille des icones Button style Style des boutons Transport Console size Language Interface Language Changing the language of the Interface will take effect after restarting Traverso! ArmTracks Arm Tracks Armer les pistes AudioClip Unable to Record to Track Impossible d'enregistrer sur la piste AudioDevice doesn't have this Capture Bus: %1 (Track %2) Le périphérique audio n'a pas ce bus d'enregistrement : %1 (Piste %2) Toggle Mute Muet Toggle Lock Remove Fades Supprime les fondus Normalization Normalisation Set Normalization level: Régler le niveau de normalisation : AudioClip: Normalize AudioClipEditDialog Dialog Dialogue Clip Parameters Paramètres du clip External Processing Traitement externe hh:mm:ss.sss hh:mm:ss:sss TextLabel Etiquette de texte End Fin Length Longueur Track start Début de la piste Gain Gain Name Nom Fades Fondus Fade In Fondu en ouverture Mode Mode Bending Strength &Linear &Linéaire &Default &Par &défaut Fade Out Fondu en fermeture Source AudioClipExternalProcessing Clip: External Processing Clip : traitement externe AudioClipManager Selection: Add Clip Sélection : ajouter un clip Selection: Remove Clip Sélection : supprimer un clip Selection: Invert Sélection : inverser AudioClipView Click to reset AudioFile ! Cliquez pour réinitialiser le fichier audio ! Reset Audio File for Clip: %1 Réinitialiser le fichier audio pour le clip : %1 All files (*);;Audio files (*.wav *.flac) Tous les fichiers (*);;Fichiers audio (*.wav *.flac) No file selected! Aucun fichier sélectionné ! Succesfully set AudioClip file to %1 AudioDevice No Driver Loaded Aucun pilote chargé Audiodevice: Failed to create the Jack Driver Périphérique audio : échec lors de la création du pilote Jack Audiodevice: Failed to create the ALSA Driver Périphérique audio : échec lors de la création du pilote ALSA Audiodevice: Failed to create the PortAudio Driver Périphérique audio : échec lors de la création du pilote PortAudio No Device Configured Aucun périphérique configuré The Jack server has been shutdown! Le serveur Jack a été fermé ! AudioDevice:: Buffer underrun 'Storm' detected, switching to Null Driver AudioDevice:: For trouble shooting this problem, please see Chapter 11 from the user manual! Périphérique audio : pour résoude ce problème, lisez le chapître 11 du manuel d'utilisateur ! Audiodevice: Failed to create the PulseAudio Driver Périphérique audio : impossible de créer le pilote PulseAudio Audiodevice: Failed to create the CoreAudio Driver AudioDeviceThread Unable to set Audiodevice Thread to realtime priority!!!This most likely results in unreliable playback/capture and lots of buffer underruns (== sound drops).In the worst case the program can even malfunction!Please make sure you run this program with realtime privileges!!! AudioDriverConfigPage System default Par défaut du système Form Formulaire Driver Selection Sélection du pilote Driver: Pilote : Configure driver Configurer le pilote <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Duplex mode:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Defines if both the Playback and Capture buses </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">of your soundcard are to be used, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">or only the Playback or Capture bus(es).</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Mode duplex:</span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Defini si les bus de lecture et d'enregistrement </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">de votre carte son doivent être utilisés en même temps, </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ou seulement le bus de lecture ou d'enregistrement.</p></body></html> Duplex mode Mode duplex Full Full Playback Lecture Capture Capture <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Sample rate:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The sample rate used by the audio card.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">New projects will use this samplerate as </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">the project's sample rate on creation.</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Sample rate:</span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">La fréquence d'échantillonage utilisée par votre carte son.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Les nouveaux projets utiliseront celle-ci </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">en temps que fréquence d'échantillonage du projet à la création.</p></body></html> Sample rate Fréquence d'échantillonage 22050 22050 32000 32000 44100 44100 48000 48000 88200 88200 96000 96000 <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Buffer latency:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The latency introduced by the size of the audio buffers.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Some people need low latencies, if you don't need it, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">or don't know what it means, please leave the default setting!</p></body></html> Buffer latency (ms) Restart Driver Redémarrer le pilote Jack Jack Enable Jack transport control Activer le contrôle du transport Jack AudioSourcesManagerWidget Form Formulaire Remove sources Supprimer les sources Remove source Supprimer la source Remove all sources Supprimer toutes les sources Remove unused sources Supprimer les sources inutilisées AudioSources Sources audio BehaviorConfigPage Form Formulaire Project Settings Options du projet On close: A la fermeture : Save Sauvegarder Ask Demander Don't save Ne pas sauvegarder Load last used project at startup Charger le dernier projet au lancement New Sheet Settings Préférences du nouvel espace de travail Audio Clip Settings Configuration du clip audio Lock Audio Clips by default Vérouiller les clips audio par défaut Playback Settings Configuration de lecture <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Keep the play cursor in view while playing or recording.</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Garde le curseur de lecture en vue lors de la lecture ou de l'enregistrement .</p></body></html> Scroll playback Jump Sauter Stay Centered Rester centré Animated Animé Continuously adjust audio while dragging Number of tracks Nombre de pistes BusSelectorDialog Bus Selector Sélecteur de bus Track Piste Capture Buses Bus d'enregistrement Channels Canaux Both Les deux Left Gauche Right Droite Playback Buses Bus de lecture CDWritingDialog CD Writing Gravure CD General Options Options générales Write current Sheet Ecrire l'espace de travail Write all Sheets Ecrire tous les espaces de travail Calculate and apply normalization Calculer et appliquer la normalisation Export wav and toc files only (don't write CD) Exporte seulement les wav et la TOC (ne grave pas le CD) Burning Device Périphérique de gravure Number of copies Nombe de copies Simulate Simulation Speed Vitesse auto auto 1x 1x 2x 2x 4x 4x 8x 8x 12x 12x 16x 16x 20x 20x 24x 24x 28x 28x 32x 32x 36x 36x 40x 40x 44x 44x 48x 48x Status Statut Information Information Start Writing Démarrer la gravure Abort Abandonner Close Fermer ClipSelection Selection: Remove Clip Sélection : supprimer le clip Selection: Add Clip Sélection : ajouter un clip Select Clip Sélectionner un clip ClipsViewPort Import %n audiofile(s) Crop AudioClip: Magnetic Cut Curve There is allready a node at this exact position, not adding a new node Il y a déjà un noeud à cet endroit exact. Pas de nouveau noeud ajouté Add CurveNode Ajouter un noeud Remove CurveNode Supprimer un noeud CurveView Drag Node Déplacer le noeud Clear Nodes Supprimer tous les noeuds Dialog Dialog Dialogue OK OK Cancel Annuler DigitalClock Digital Clock Horloge numérique DriverInfo Change Audio Device settings Modifie la configuration du périphérique audio ExportDialog Export Exporter General Options Options générales Export current Sheet Exporter l'espace de travail Export all Sheets Exporter toutes les feuilles Export directory Exporter le dossier Export status Statut de l'exportation - - Abort Export Annuler l'exportation Start Export Démarrer l'exportation Close Fermer ExportFormatOptionsWidget Best Meilleur High Haut Medium Moyen Fast Rapide Bitrate Fréquence d'échantillonage Average Bitrate Fréquence d'échantillonage moyenne Maximum Bitrate Fréquence d'échantillonage maximum Export Format Options Options du format d'exportation Format Options Options du format Encoding Encodage File Type Type de fichier Channels Canaux Normalize Audio Normaliser l'audio Bitdepth Profondeur d'échantillonage WavPack options (lossless compression) Options WavPack (compression sans perte) Compression type Type de compression <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This option reduces the storage of some floating-point data files by up to about 10% by eliminating some information that has virtually no effect on the audio data. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">While this does technically make the compression lossy, it retains all the advantages of floating point data (&gt;600 dB of dynamic range, no clipping, and 25 bits of resolution). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This also affects large integer compression by limiting the resolution to 24 bits.</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Cette option réduit la taille de certains fichiers de données à virgule flottante jusqu'à 10% en éliminant certaines informations qui n'ont virtuellement aucun effet sur les données audio. </p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Bien que cela soit techniquement une compression avec perte, cela garde l'avantage des données à virgule flottante (&gt;600 dB of dynamic range, no clipping, et une resolution de 25 bits). </p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This also affects large integer compression by limiting the resolution to 24 bits.</p></body></html> Skip WVX for extra compression (semi-lossless) Sauter WVX pour une compression supplémentaire (semi-lossless) Ogg Options Options ogg Quality (Smallest <-> Best) Qualité (faible <-> meilleure) Encoding Method Méthode d'encodage MP3 Options Options MP3 Minimum Bitrate Fréquence d'échantillonage minimum Quality (Fastest <-> Best) Qualité (rapide <-> meilleure) Sample Rate Fréquence d'échantillonage Conversion quality Qualité de la conversion ExternalProcessingDialog You have to supply an argument before starting the external process! Vous devez fournir un argument avant de démarrer un processus externe ! Program <b>%1</b> crashed! Le programme <b>%1</b> a crashé ! Available arguments for the sox program Arguments disponibles pour le programme sox Program <b>%1</b> not installed, or insufficient permissions to run! Le programme <b>%1</b> n'est pas installé, ou vous n'avez pas la permission! FadeBend Fade In: bend Fondu en ouverture : Fade Out: bend Fondu en fermeture : FadeCurve Fade Preset FadeMode Fade In: shape Fondu en ouverture : forme Fade Out: shape Fondu en fermeture : forme FadeRange Fade In: length Fondu en ouverture : longueur Fade Out: length Fondu en fermeture : longueur Fade In: remove Fondu en ouverture : supprimer Fade Out: remove Fondu en fermeture : supprimer FadeStrength Fade In: strength Fondu en ouverture : force Fade Out: strength Fondu en fermeture : force FileWidget My Computer Mon ordinateur My Documents Mes documents Parent Directory Dossier parent Refresh File View Rafraichir l'affichage Import Import Audio File Importer un fichier audio Insert Silence Insérer un silence Silence Silence All files (*) Tous les fichiers (*) Audio files (*.wav *.flac *.ogg *.mp3 *.wv *.w64) Fichiers audio (*.wav *.flac *.ogg *.mp3 *.wv *.w64) Import audio source Importer une source audio ImportClipsDialog Import Audio Clips Importer des régions audio Import to Track: Importer vers la piste : Add Markers Ajouter un repère InputEngine Modifier key actions are not supported from Context Menu Hold actions are not supported from Context Menu Les actions "maintenir" ne sont pas supportées depuis le menu contextuel Command Plugin %1 not found! Greffon de commande %1 introuvable ! Plugin %1 doesn't implement Command %2 Le greffon %1 n'implémente pas la commande %2 InsertSilenceDialog Insert Silence Insérer un silence Insert Silence (seconds): Insérer un silence (secondes) : Interface History Historique Resources Bin Ressources Correlation Meter Phase-metre FFT Spectrum Spectre FFT Traverso %1 (built with Qt %2) A multitrack audio recording and editing program. Look in the Help menu for more info. Traverso is brought to you by R. Sijrier and others, including all the people from the Free Software world who contributed the important technologies on which Traverso is based (Gcc, Qt, Xorg, Linux, and so on) Traverso %1 (fait avec Qt %2) Un programme d'enregistrement et d'édition audio multipiste. Utilisez le menu d'aide pour plus d'informations. Traverso est développé pour vous par R. Sijrier et d'autres, notamment toutes les personnes du monde du logiciel libre qui ont contribué aux importantes technologies sur lesquelles Traverso est basé (Gcc, Qt, Xorg, Linux, etc...) About Traverso A propos de Traverso &Project &Projet &New... &Nouveau... &Open... &Ouvrir... &Save &Enregistrer &Manage Project... &Gérer le projet... &Export... &Exporter... &CD Writing... &Graver un CD... &Restore Backup... &Restaurer une sauvegarde... &Quit &Quitter &Sheet &Espace de travail New &Track(s)... Nouvelle(s) &piste(s)... New &Sheet(s)... Nouvel(eaux) &espace(s) de travail... Marker Editor... Editeur de repères... Import &Audio... Importer &Audio... Insert Si&lence... Insérer un si&lence... &View &Affichage System Information Informations Système Se&ttings &Options &Recording File Format &Format d'en&registrement &Resample Quality Qualité de &rééchantillonnage &Preferences... &Préférences... &Getting Started &Premiers pas &User Manual Manuel &Utilisateur &About Traverso &A propos de Traverso <b>Description</b> <b>Description</b> <b>Key Sequence</b> <b>Séquence clé</b> Opening User Manual in external browser! Ouverture du manuel utilisateur dans un navigateur externe ! Traverso - Important Traverso - Important A Project directory changed outside of Traverso. This is NOT supported! Please undo this change now! If you want to rename a Project, use the Project Manager instead! Un répertoire de projet a changé hors de Traverso. Ceci n'est PAS supporté ! Annulez ce changement maintenant ! Si vous voulez renommer un projet, utilisez le gestionnaire de projet ! Traverso - Project load failed Traverso - Echec de chargement du projet The requested Project `%1` could not be loaded for the following reason: '%2' You will now be given a list of available backups (if any) to restore the Project from. Le projet '%1' n'a pas pu être chargé pour la raison suivante : '%2' Une liste de sauvegardes préalables (s'il y en a) va vous être donnée afin de restaurer le projet. Changed encoding for recording to %1 Encodage pour l'enregistrement changé en %1 Changed resample quality to: %1 Qualité du rééchantillonage changée en : %1 &Edit &Edition Undo Annuler Redo Refaire &Snap &Adhérer Snap items to edges of other items while dragging. Faire adhérer les bords des autres objets lors des déplacements. S&croll Playback Keep play cursor in view while playing or recording. Garder la tête de lecture visible lors de la lecture ou de l'enregistrement. &Show Effects &Montrer les effets Show effect plugins and automation curves on tracks Montrer les effets et les courbes d'automation sur les pistes Transport Console Console de transport Project Projet Edit Edition Best Meilleur High Haut Medium Moyen Fast Rapide &Help &Aide Open Audio Files Ouvrir des fichiers audio Audio files (*.wav *.flac *.ogg *.mp3 *.wv *.w64) Fichiers audio (*.wav *.flac *.ogg *.mp3 *.wv *.w64) %1: %2 %1 : %2 JackDriver Jack Driver: Couldn't connect to the jack server, is jack running? Pilote Jack : impossible de se connecter au serveur Jack, Jack est-il lancé ? Jack Driver: Connected successfully to the jack server! Pilote Jack : connecté avec succès au serveur Jack ! KeyboardConfigPage No description set for this keymap Pas de description pour ce raccourci clavier KeyMap Export Exporter les raccourcis claviers The exported keymap can be found here: %1 Les raccourcis claviers peuvent être trouvés ici : (sp)%1 Form Formulaire Configure Keyboard Configuration du clavier <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Double fact timeout:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The maximum time in miliseconds between 2 key presses </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">to determine if the 2 key presses are a double fact ( &lt;&lt; K &gt;&gt; or &lt;&lt; KK &gt;&gt;)</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> or 2 individual key presses ( a &lt; K &gt; and &lt; K &gt; action, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">or &lt; KK &gt; and &lt; KK &gt; action for example).</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Experienced users can set this value as low as 150 ms, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">if you don't have much experience yet, please leave the default of 180 ms.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">For more information, see chapter 7: Key Actions. of the User Manual</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Délai d'action simultanée :</span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Le temps maximum en millisecondes entre 2 actions au clavier. </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Pour déterminer si, lorsqu'on appui sur deux touches, il 'agit d'une action simultanée ( &lt;&lt; K &gt;&gt; ou &lt;&lt; KK &gt;&gt;)</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> ou bien de deux actions différentes ( a &lt; K &gt; et &lt; K &gt; action, </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ou &lt; KK &gt; et &lt; KK &gt; action par exemple).</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Les utilisateurs expérimentés peuvent régler cette valeur à 150 ms, </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">si vous n'avez pas encore beaucoup d'expérience, laissez la valeur par défaut de 180 ms.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Pour plus d'information, voir le chapitre 7 : Key Actions. du manuel d'utilisateur</p></body></html> <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Bitstream Vera Sans; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Double fact timeout (ms)</p></body></html> <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Bitstream Vera Sans; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Délai de la double action (ms)</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Hold timeout:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The maximum time to consider a pressed key a hold key fact, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">like [ K ] or [ KK ].</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The shorter this time, the sooner a pressed key will be </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">detected as a hold action. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Experienced users can set this value as low as 110 ms, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">if you don't have much experience yet, please leave the default of 150 ms.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">For more information, see chapter 7: "Key Actions" of the User Manual.</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Délai pour l'action "maintenir":</span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Le délai maximum pour qu'une touche appuyée soit considérée comme maintenue, </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">comme [ K ] ou [ KK ].</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Le plus court le délai, le plus rapidement la touche appuyée </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">sera détectée comme une action "maintenir". </p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Les utilisateurs expérimentés peuvent régler cette valeur à 110 ms, </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">si vous n'avez pas encore beaucoup d'expérience, laissez la valeur par défaut de 150 ms.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Pour plus d'information, voir le chapitre 7 : Key Actions. du manuel d'utilisateur.</p></body></html> <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Bitstream Vera Sans; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Hold timeout (ms)</p></body></html> <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Bitstream Vera Sans; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Délai pour l'action maintenir (ms)</p></body></html> Keymap Raccourci clavier Select keymap Sélection d'un raccourci clavier Export Keymap export des raccourcis clavier Print Keymap Impression des raccourcis clavier LanguageName English The name of this Language, e.g. German would be Deutch French MarkerDialog Markers Repères Position Position Title Titre Options Options ISRC: ISRC : Apply to all Appliquer à tous ... ... Pre-Emphasis Pré-accentuation Copy protection Protection contre la copie Position: (MM:SS:75ths) Position : (MM:SS:75ths) CD-Text Texte du CD Title: Titre : Performer: Artiste : Composer: Compositeur : CD-Text optional Texte optionnel du CD Arranger: Arrangeur : Message: Message : &Remove &Supprimer &Export &Exporter Songwriter Parolier &Ok &Ok &Cancel &Annuler MoveClip Copy Clip Copier le clip Move Clip Déplacer le clip Move Clip To Start Déplacer le clip au début Move Clip To End Déplacer le clip à la fin Fold Sheet Fold Track Fold Markers MoveEdge Move Clip Edge Séplacer le bord du clip NewProjectDialog You must supply a name for the project! Vous devez choisir un nom pour le projet ! Traverso - Question Traverso - Question The Project "%1" already exists, do you want to remove it and replace it with a new one ? Le projet %1 existe déjà. Voulez-vous le supprimer et le remplacer par un nouveau ? Yes Oui No Non Couldn't create project (%1) Impossible de créer le projet (%1) New Project Nouveau projet Name Nom Description Description Engineer Ingénieur Tracks per Sheet Pistes par feuille Use Template Utiliser un gabarit Open Audio Files Ouvrir des fichiers audio Audio files (*.wav *.flac *.ogg *.mp3 *.wv *.w64) Fichiers audio (*.wav *.flac *.ogg *.mp3 *.wv *.w64) Import Audio Files Importer des fichiers audio Empty Project Projet vide ... ... Track Name Nom de la piste File Fichier Copy files to project directory Copier les fichiers dans le répertoire du projet Number of Sheets Nombre d'espaces de travail NewSheetDialog I can't create a new Sheet if there is no Project loaded!! Impossible de créer une feuille s'il n'y a pas de projet chargé !! Added %n Sheet(s) New Sheet(s) Nouvelle(s) feuille(s) New Sheet name Nom de la nouvelle feuille Sheet count Compte de feuilles Track count Compte des pistes Use Template Utiliser un gabarit NewTrackDialog I can't create a new Track if there is no Project loaded!! Impossible de créer une nouvelle piste s'il n'y a pas de projet chargé ! Added %n Track(s) New Track(s) Nouvelle(s) piste(s) Track name Nom de la piste Track count Compte des pistes OpenProjectDialog <p>Project directory name <b>%1</b> is different from the Project title <b>%2</b>!</p><p>Did you rename the Project directory ? </p><p>Please rename the directory back to the Project title <b>%1</b>, and change the Project title with the Project Manager Dialog!</p> <p>Le nom du répertoire du projet <b>%1</b> est différent de celui du titre du projet <b>%2</b>!</p><p>Avez-vous renommé le répertoire du projet ? </p><p>Renommez ce répertoire comme le titre du projet <b>%1</b>, et changez le titre du projet dans le Gestionnaire de projet !</p> Description: Description : Created on: Créé le : No Project selected! Pas de projet sélectionné ! Select a project and click the 'Load' button again Sélectionnez un projet et cliquez sur "charger" à nouveau Project %1 does not exist, did you rename or remove the directory what that name ? Le projet %1 n'existe pas. Avez-vous renommé ou supprimé le dossier ? You must supply a name for the project! Vous devez choisir un nom pour le projet ! Project does not exist! (%1) Le projet n'existe pas ! (%1) Traverso - Question Traverso - Question Are you sure that you want to remove the project %1 ? It's not possible to undo it ! Etes vous sûr de vouloir supprimer le projet %1 ? Il sera impossible d'annuler ! Choose an existing or create a new Project Directory Choisir un projet existant ou créer un nouveau dossier de projet Traverso - Warning Traverso - Attention This directory is not writable by you! Vous n'avez pas les droits pour écrire dans ce répertoire ! Please check permission for this directory or choose another one: %1 Vérifiez que vous avez les droits nécessaires pour ce répertoire ou changez-en : %1 Unable to create Project directory! Impossible de créer un répertoire de projet ! Please check permission for this directory: %1 Vérifiez vos droits sur ce répertoire : %1 Traverso - Information Traverso - Information Created new Project directory for you here: %1 Nouveau répertoire de projet créé ici : %1 Open Project Ouvrir un projet Selected Project Projet sélectionné Load Charger Delete Supprimer Select Project Dir Sélectionner un répertoire pour le projet PADriver PADriver:: PortAudio error: %1 Pilote PA:: erreur PortAudio: %1 PADriver:: hostapi %1 was not found by Portaudio! Pilote PA:: hostapi %1 n'a pas été trouvé par PortAudio ! PaDriverPage Form Formulaire Portaudio drivers Pilotes PortAudio <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">PortAudio Driver:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The driver which should drive the PortAudio backend</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">PortAudio supports many driver backends, some of which Traverso has native support for too. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It is recommended to use Traverso's native drivers instead of using PortAudio's, however, if the native drivers give problems, you might try the ones supplied by PortAudio instead!</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">PortAudio provides transparent driver support for multiple platforms, including Windows (see the wmme, direct x and asio options), and Mac OS X (see the CoreAudio and jack options)</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Pilote PortAudio :</span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Le pilote qui utilise PortAudio</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">PortAudio supporte beaucoup de types de pilotes dont certains disposent aussi d'un support natif dans Traverso. </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Il est recommandé d'utiliser les pilotes natifs de Traverso plutot que ceux de PortAudio, toutefois si les pilotes natifs posent problème, vous pouvez essayer à la place ceux founis par PortAudio !</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">PortAudio offre un support de pilotes transparent pour de multiple plateformes, notamment Windows (voir les options wmme, direct x et asio), et Mac OS X (voir les options CoreAudio et jack)</p></body></html> Driver Pilote PerformanceConfigPage Form Formulaire Audio file buffering <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Read buffer size:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The amount of audio data that can be stored in the </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">read buffers in seconds.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The default value of 1 second should do just fine.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">However, if you're tight on memory, you can make this value lower.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If you experience buffer underruns when the hard disk bandwidth is </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(almost) saturated, or when buffer underruns happen regularly due </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">the hard disk can't keep up for some reason, you can try a larger </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">value, like 1.5 or 2.0 seconds.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Keep in mind that when using a larger buffer, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">it will take considerably more time to move (i.e. seeking) </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">the playhead to another positions, since all the buffers </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(one for each audioclip * channel count) need to be refilled!</p></body></html> Read buffer size (seconds) Taille du tampon de lecture (secondes) info icon Icône d'information Changing the buffer size only will take into effect after (re)loading a project. Changer la taille du tampon ne prendra effet qu'après avoir (re)chargé un projet. Painting Peindre <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The number of times per second at which the Graphical</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Items are repainted during a jog action, like moving an</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">AudioClip, or changing the Gain.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The default frames per second of 35 is a perfect compromise </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">between smooth painting, and low cpu usage.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">However, if you find the painting to be not smooth enough,</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">change this value to a higher one, but keep in mind that it</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">will consume considerably more cpu!</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If for example moving an AudioClip still takes to much cpu,</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">you should consider to lower this value.</p></body></html> Jog repaint speed (fps) <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Accelerates the painting of AudioClips and Tracks by using</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">the 3D engine of your graphics card.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Depending on your graphics card and driver support, this </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">can speed up painting considerably!</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Accélère l'affichage des régions et des pistes en utilisant</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">le moteur 3D de votre carte graphique.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">En fonction de votre carte graphique et de son pilote, cela </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">peut considérablement accélérer l'affichage !</p></body></html> Use hardware acceleration Utiliser l'accélération matérielle PluginSelectorDialog Plugin Selector Sélecteur de greffons Add Plugin too Ajouter aussi un greffon Plugin Name Nom du greffon Type Type In/Out In/Out OK OK Cancel Annuler ProgressToolBar Progress Toolbar Importing file %1 of %2: %p% Project Cannot create dir %1 Impossible de créer le répertoire %1 Created new Project %1 Nouveau projet créé : %1 Project %1: Cannot open project.tpf file! (Reason: %2) Projet %1 : impossible d'ouvrir le fichier .tpf ! (Raison : %2) Project %1: Failed to parse project.tpf file! (Reason: %2) Projet %1 : Impossible de parser le fichier .tpf ! (Raison : %2) Project File Version does not match, unable to load Project! La version de fichier du projet ne correspond pas, impossible de charger le projet ! Project %1 loaded Projet %1 chargé Couldn't open Project properties file for writing! (File %1. Reason: %2) Impossible d'ouvrir les propriétés du projet pour l'écriture ! (Fichier %1. Raison : %2) Project %1 saved Projet %1 sauvegardé Project with title '%1' allready exists, not setting new title! Le projet avec le titre '%1' existe déjà. Pas de nouveau titre ! Project directory %1 no longer exists, did you rename it? Shame on you! Please undo that, and come back later to rename your Project... Le répertoire du projet %1 n'existe plus, l'avez-vous renommé ? Honte sur vous ! Changez cela et revenez ici pour le renommer... Traverso - Information Traverso - Information Project title changed, Project will to be reloaded to ensure proper operation Titre du projet changé. Le projet va être rechargé pour s'assurer une opération correcte Sheet %1 added Espace de travail %1 ajouté Sheet '%1' doesn't exist! La feuille '%1' n'existe pas ! Remove Sheet %1 Supprimer la feuille %1 Export already in progress, cannot start it twice! Exportation en cours, impossible d'en lancer deux à la fois ! Detected clipping in exported audio! (%1) calculated norm factor: %1 You're still recording, please stop recording first to be able to exit the application! Vous êtes toujours en train d'enregistrer. Arrétez votre enregistrement pour fermer le programme ! Unable to create export directory! Please check permissions for this directory: %1 Impossible de créer un répertoire d'exportation ! Vérifiez que vous avez les droits nécessaires pour ce répertoire : %1 ProjectConverter Project file with version %1 cannot be converted, only files with version 2 can! Project %1: Failed to parse project.tpf file! (Reason: %2) Projet %1 : Impossible de parser le fichier .tpf ! (Raison : %2) Starting to convert Project from version 2 to version 3 Conversion du projet de la version 2 à la version 3 Converting project.tpf file..... Done! <b>Need to convert %1 files</b> <b>Il faut convertir %1 fichiers</b> Couldn't open Project properties file for writing! (File %1. Reason: %2) Impossible d'ouvrir les propriétés du projet pour l'écriture ! (Fichier %1. Raison : %2) Project %1 converted Projet %1 converti Saving converted project.tpf file.... Done! Conversion finished succesfully Conversion réalisée avec succès No conversion description available! Pas de description de conversion disponible ! Conversion stopped on user request, you can continue to use this Project with Traverso <= 0.41.0, or reopen it with this version of Traverso and start the conversion again Conversion arrétée par l'utilisateur. Vous pouvez continuer de travailler sur ce projet avec une version de Traverso <= 0.41.0 ou le réouvrir avec cette version et recommencer la conversion ProjectConverterDialog Project Converter Convertisseur de projet Project XXX (no translation needed) Conversion information Information sur la conversion Conversion progress Progression de la conversion Start conversion Démarrer la conversion Stop conversion Arréter la conversion Load Project Charger un projet Close Fermer ProjectInfoWidget Project Information Widget Widget d'information du projet Bitdepth Profondeur d'échantillonage - - Rate Taux Project Projet Songs Chansons ProjectManager Save Project Enregistrer le projet Do you want to save the Project before quiting? Voulez-vous enregistrer le projet avant de quitter ? Project %1 already exists! Le projet %1 existe déjà ! Unable to create new Project %1 Impossible de créer un nouveau projet %1 Unable to load Project %1 Impossible de charger le projet %1 No Project to save, open or create a Project first! Pas de projet à sauvegarder. Ouvrez ou créez un projet d'abord ! Choose a directory to store your Projects in Choisissez un répertoire où placer vos projets Traverso - Warning Traverso - Attention No directory was selected, to retry open the 'Open Project Dialog' and click 'Select Project Directory' button Aucun répertoire sélectionné, pour réessayer This directory is not writable by you! Il vous est impossible d'écrire dans ce répertoire ! Please check permission for this directory or choose another one: %1 Vérifiez vos permissions pour ce répertoire ou changez-en : %1 Using existing Project directory: %1 Unable to create Project directory! Impossible de créer un répertoire de projet ! Please check permission for this directory: %1 Vérifiez vos droits sur le répertoire : %1 Created new Project directory for you here: %1 Nouveau répertoire de projet créé ici : %1 Project %1 no longer could be found! (Did you remove or rename the Project directory ?) Le projet %1 ne peut plus être trouvé ! (Avez-vous renommé ou déplacé le répertoire du projet ?) Default Project created by Traverso Projet par défaut créé avec Traverso Could not rename Project directory to %1 Impossible de renommer le répertoire du projet en %1 Projectfile backup: The project file %1 could not be opened for reading (Reason: %2) Cannot create dir %1 Impossible de créer le répertoire %1 ProjectManagerDialog No new Sheet name was supplied! Aucun nom n'a été fourni pour le nouvel espace de travail ! Save Template Sauvegarder le gabarit Enter Template name Entrer le nom du gabarit Unable to create directory %1! Impossible de créer le répertoire %1 ! Traverso - Information Traverso - Information Template with name %1 already exists! Do you want to overwrite it? Le gabarit %1 existe déjà ! Voulez-vous l'écraser ? Saved Project Template: %1 Couldn't open file %1 for writing! Impossible d'ouvrir le fichier %1 en écriture ! Project with title '%1' allready exists, please supply a different title! Le projet avec le titre '%1' existe déjà. Veuillez fournir un nouveau titre ! Dialog Dialogue Project Projet Informational Title Titre Description Description Engineer Ingénieur Export Exporter Sheet(s) Espace(s) de travail Template Gabarit Sheets Feuilles Sheet Name Nom de la feuille Tracks Pistes Length Longueur Selected Sheet Feuille sélectionnée Delete Supprimer Rename Renommer New Sheet Nouvelle feuille Create new Sheet Créer une nouvelle feuille CD Text Texte du CD Performer Interprète Disc ID: ID du disque : UPC EAN: UPC EAN : Genre: Genre : Unused Inutilisé Undefined Non défini Adult Contemporary Contemporain adult Alternative Rock Rock alternatif Childrens Enfants Classical Classique Contemporary Christian Contemporain chrétien Country Country Dance Dance Easy Listening Easy Listening Erotic Erotique Folk Folk Gospel Gospel Hip Hop Hip Hop Jazz Jazz Latin Latino Musical Musical New Age New Age Opera Opera Operette Operette Pop Music Musique pop Rap Rap Reggae Reggae Rock Music Rock Rhythm and Blues Rhythm and Blues Sound Effects Effets sonores Spoken Word Texte parlé World Music Musique world Arranger Arrangeur Message Message <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Undo last change</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Annuler le dernier changement</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Redo last change</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Refaire le dernier changement</p></body></html> undotext redotext Songwriter Parolier QObject No error occurred Acune erreur ne s'est produite An error occurred when reading from the file. Une erreur est apparue lors de la lecture du fichier. An error occurred when writing to the file. Une erreur est apparue lors de l'écriture du fichier. A fatal error occurred. Une erreur grave est apparue. The file could not be opened. Le fichier n'a pas pu être ouvert. Resourc error The operation was aborted. Opération annulée. A timeout occurred. An unspecified error occurred. Une erreur inconnue est apparue. The file could not be removed. Le fichier n'a pas pu être supprimé. The file could not be renamed. Le fichier n'a pas pu être renommé. The position in the file could not be changed. Impossible de changer la position dans le fichier. The file could not be resized. Impossible de redimensionner le fichier. The file could not be accessed. Impossible d'accéder au fichier. The file could not be copied. Impossible de copier le fichier. Unknown error Erreur inconnue AudioClip Région audio Curve Courbe CurveNode FadeCurve Marker Repère Sheet Espace de travail TimeLine Track Piste QuickStartDialog Traverso: Getting Started Traverso : premiers pas <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"><span style=" font-size:18pt; font-weight:600;">Traverso: Getting Started</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">When you record or import an audio file into Traverso, it shows up as an Audio Clip in one of the horizontal Tracks in the current Sheet. You can edit many aspects of these Clips by placing the mouse pointer over a Clip and pressing or holding different keys on your keyboard and mouse. You can also change settings of a Track, the Sheet as a whole, and other objects in the Sheet.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">To see a list of what commands are available for any given object in the Sheet, move the mouse over that object, and Right-Click (or press Q). The keyboard shortcuts for each command are shown in the menu. The notation used is shown below.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; K &gt; </span> means press and release the K key. (Like a click.)</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"><span style=" font-weight:600;">&lt;&lt; K &gt;&gt;</span> means press the K key two times fast. (Like a double click.)</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ K ]</span> means drag the mouse while holding down the K key.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; KL &gt; </span> means press the K and L keys at the same time.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ KL ] </span> means drag the mouse while holding down the K and L keys at the same time.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">Here are some basic commands:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; SPACE &gt;</span> is Play/Stop.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; SHIFT &gt;</span> sets the Playhead. (Blue vertical line where playing starts.)</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; W &gt;</span> sets the Work Cursor. (Red vertical line.)</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; V &gt; </span> moves the Playhead back to the Work Cursor.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ D ] </span> move objects around (Audio Clip, Curve Nodes, etc)</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ Z ]</span> zooms in and out.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ TAB ]</span> scroll omnidirectional (aka Shuttle) </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">And some Audio Clip Commands:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ E ] </span> drags a Clip's left or right edge.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ F ]</span> adjusts the length of a Clip's Fade In / Fade Out.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ G ] </span>addust the Gain of a clip (also works on Tracks, Sheet)</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; X &gt;</span> splits the Clip at the cursor's position.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">For more information, right-click on everything, or check out the Traverso manual.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"><span style=" font-size:18pt; font-weight:600;">Traverso : Premiers pas</span></p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">Lorsque vous enregistrez ou importez un fichier audio dans Traverso, il apparait en temps que région audio dans l'une des pistes horizontales de l'espace de travail actuel. Vous pouvez éditer de nombreux paramètres de ces régions en plaçant le curseur de la souris sur la région et en appuyant ou en maintenant appuyées différentes touches de votre clavier ou de votre souris. You can also change settings of a Track, the Sheet as a whole, and other objects in the Sheet.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">To see a list of what commands are available for any given object in the Sheet, move the mouse over that object, and Right-Click (or press Q). The keyboard shortcuts for each command are shown in the menu. The notation used is shown below.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; K &gt; </span> means press and release the K key. (Like a click.)</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"><span style=" font-weight:600;">&lt;&lt; K &gt;&gt;</span> means press the K key two times fast. (Like a double click.)</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ K ]</span> means drag the mouse while holding down the K key.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; KL &gt; </span> means press the K and L keys at the same time.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ KL ] </span> means drag the mouse while holding down the K and L keys at the same time.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">Here are some basic commands:</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; SPACE &gt;</span> is Play/Stop.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; SHIFT &gt;</span> sets the Playhead. (Blue vertical line where playing starts.)</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; W &gt;</span> sets the Work Cursor. (Red vertical line.)</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; V &gt; </span> moves the Playhead back to the Work Cursor.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ D ] </span> move objects around (Audio Clip, Curve Nodes, etc)</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ Z ]</span> zooms in and out.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ TAB ]</span> scroll omnidirectional (aka Shuttle) </p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">And some Audio Clip Commands:</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ E ] </span> drags a Clip's left or right edge.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ F ]</span> adjusts the length of a Clip's Fade In / Fade Out.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ G ] </span>addust the Gain of a clip (also works on Tracks, Sheet)</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; X &gt;</span> splits the Clip at the cursor's position.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">For more information, right-click on everything, or check out the Traverso manual.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p></body></html> ReadSource Silence Silence Could not open file Impossible d'ouvrir le fichier Invalid channel count Nombre de canaux invalide File has zero channels Le fichier n'a pas de canaux The file does not exist! Le fichier n'existe pas ! No ReadSource error set RecordingConfigPage Form Formulaire Recording Enregistrement <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">WAV</span> : A format without compression. Uses more hard disk space then compressed encoding formats, but needs very little cpu.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Limits : ~ 1.7 hours of recording time @ Stereo - 44.1 KHz</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">WavPack</span> : A format with compression, up to 2 times smaller compared to WAV, and no quality loss. Uses significantly more cpu then WAV, but with modern (year 2005 and above) cpu's this shouldn't be a problem.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Using this format stresses the hard disk much less, increasing hard disk live, and less chance of saturating the hard disk bandwidth.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Limits : ~ 5 hours recording time @ Stereo - 44.1 KHz</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">WAV64</span> : WAV format with 64 bit header, support by other programs is currently limited.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Limits : None, thousands of hours of recording time, supposed that your hard disk can hold it.</p></body></html> Encoding format Format d'encodage WavPack options Options WavPack Compression type Type de compression <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This option reduces the storage of some floating-point data files by up to about 10% by eliminating some information that has virtually no effect on the audio data. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">While this does technically make the compression lossy, it retains all the advantages of floating point data (&gt;600 dB of dynamic range, no clipping, and 25 bits of resolution). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This also affects large integer compression by limiting the resolution to 24 bits.</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Cette option réduit la taille de certains fichiers de données à virgule flottante jusqu'à 10% en éliminant certaines informations qui n'ont virtuellement aucun effet sur les données audio. </p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Bien que cela soit techniquement une compression avec perte, cela garde l'avantage des données à virgule flottante (&gt;600 dB of dynamic range, no clipping, et une resolution de 25 bits). </p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This also affects large integer compression by limiting the resolution to 24 bits.</p></body></html> Skip WVX for extra compression (semi-lossless) Sauter WVX pour une compression supplémentaire (semi-lossless) Resampling Rééchantillonage Enable on the fly resampling (Playback only) Activation du rééchantillonage à la volée (lecture seulement) On the fly resample quality Qualité du rééchantillonage à la volée Default export resample quality Qualité par défaut du rééchantillonage pour l'exportation Best Meilleur High Haut Medium Moyen Fast Rapide ResourcesManager ResourcesManager:: Failed to initialize ReadSource %1 (Reason: %2) ResourcesManager: Received request to remove Audio Source %1but it is still in use by %2 AudioClips!!. NOT removing it! ResourcesWidget Form Formulaire Sources Sources Files Fichiers Name Nom Length Longueur Start Début End Fin RestoreProjectBackupDialog Restore from backup Restaurer d'après une sauvegarde Set the date to restore the selected backup. Régler la date pour restaurer la sauvegarde sélectionnée. Current date and time: Date et heure : Last backup: Dernière sauvegarde : - - Date Date Time Heure SettingsDialog Behavior Comportement Appearance Apparence Audio Options Options audio Keyboard Clavier Performance Performance Sound System Preferences - Traverso Sheet Untitled Sans nom No artists name set Aucun nom d'artiste donné Add Track Ajouter une piste Remove Track Supprimer la piste No audio to export! (Is everything muted?) Pas d'audio à exporter ! (est ce que tout est muet ?) Export start frame starts beyond export end frame!! Export tries to render to 0 channels wav file?? Hard Disk overload detected! Surcharge du disque dur détectée ! Failed to fill ReadBuffer in time Failed to empty WriteBuffer in time No Tracks armed for recording! Aucune piste armée pour l'enregistrement ! Recording to %n Clip(s) SongInfoWidget SongInfoWidget Widget d'information sur le morceau Song Chanson - - Snap Adhérer Gain Gain SMPTE SMPTE Zoom Zoom SpectralMeterConfigWidget FFT-Spectrum Configuration Configuration du spectre FFT Frequency Range Plage de fréquences Show average spectrum Montrer le spectre moyen Number of bands: Nombre de bandes : Lower dB value: Valeur inférieure en dB : Upper dB value: Valeur supérieure en dB : Hz Hz Lower Limit: Limite inférieure : Upper Limit: Limite supérieure : Advanced FFT Options Options avancées FFT FFT Size: Taille du FFT : 256 256 512 512 1024 1024 2048 2048 4096 4096 8192 8192 Rectangle Rectangle Hanning Hanning Hamming Hamming Blackman Blackman Windowing function: Fonction de fenêtrage : Advanced Avancé Apply Appliquer &Close &Fermer SpectralMeterView Screen Capture file name Nom du fichier de capture d'écran FFT: Unable to write captured image to hard disk FFT : Impossible d'écrire l'image capturée sur le disque dur FFT: No avarage curve used, not data to export! FFT : courbe moyenne non-activée, pas de donnée à exporter ! FFT: Enable avarage curve with < M > to generate data FFT : activez la courbe moyenne avec < M > pour générer des données FFT: No avarage data to export! FFT : pas de donnée moyenne à exporter ! Select output format Sélectionner le format de sortie Output format: Format de sortie : Export average dB curve Exporter la courbe moyenne dB SplitClip Split Clip Scinder la région SysInfoToolBar System Information Information système SystemInfoWidget SystemInfoWidget Widget d'information système Card Name (na) Nom de la carte (na) image image buffer size (na) Taille du tampon (na) rate taux - GB - GB drivertype (na) Type de pilote (na) xruns (na) xruns (na) latency (na) latence (na) - % - % bitdepth Profondeur d'échantillonage SystemResources Read Buffer Status Statut du tampon de lecture Write Buffer Status Statut du tampon d'écriture TimeLine Add Marker Ajouter un repère Remove Marker Supprimer le repère TimeLineView End Fin Add Marker Ajouter un repère You have to remove all other markers first. Vous devez d'abord supprimer tous les autres repères. Drag Marker Déplacer le repère Clear Markers Supprimer les repères Track Track: AudioClip with id %1 not found in Resources database! Piste : Le clip audio avec l'id %1 n'est pas trouvé dans la base de données des ressources ! Remove Clip Supprimer le clip Add Clip Ajouter un clip Silence Others Rendre les autres muets TrackPan Track Pan: %1 Panoramique : %1 Track Pan Panoramique TrackView Set Track name Définir le nom de la piste Enter new Track name Entrer un nouveau nom de piste Track %1: %2 Piste %1 : %2 TransportConsoleWidget Skip to Start Aller au début Previous Snap Position Record Enregistrer Play / Stop Lecture/arrêt Next Snap Position Skip to End Aller à la fin Recording to %1 Tracks, encoding format: %2 Enregistrement vers %1 pistes ; format d'encodage : %2 TraversoCommands Gain Gain Gain: Reset Gain : réinitialiser Panorama Panorama Panorama: Reset Panorama : reset Import Audio Importer audio Insert Silence Insérer silence Copy Clip Copier le clip New Track Nouvelle piste Remove Clip Supprimer le clip Remove Track Supprimer la piste External Processing Processus externe Move Clip Déplacer le clip Drag Edge Move Or Resize Clip Déplacer ou redimensionner la région Split Scinder Arm Tracks Armer les pistes Fold Sheet Fold Track Vertical In Horizontal Out Horizontal In Vertical Out Omnidirectional Omnidirectionnel Horizontal Horizontal Vertical Vertical Right Droite Left Gauche Up Haut Down Bas (De)Select All (De)sélectionner tout Fold Markers (De)Select Magnetic Cut traverso-0.49.4/resources/translations/traverso_de.qm000644 001750 001750 00000602077 11430303020 023364 0ustar00remonremon000000 000000 aF0ڿaDp7BI e8h88YۋIyŨtFɬ$}F8ڛy?YFq;{4o"qYcVb~$$.)Q` LA#Q'1wJ/a5_bvejwDN Ii<K_5_z١ @r7 WƤ| -ߛ:, M. . 0Ejm0{j[ _CdyfFquov e4z'zNs/ed"c͘R6SǏW<iX}*jȺ[Ur.l.m['[l:Ի|tb/>Mڑz1x .f6H9OyγJoe9LoMCjgmT1}dSJʖϥ}ϥʗx]U˿ϸL故f4s> qCY8:G8I8II(^tT v:Ixn61lESIJIINUyK1s4^Z,a , ϕKWlvWW L 4?d 6TyGj ',vv bրaE!ԋX OPO \榼 إKEFЋnE4`U1kE uE$)e'~}*YP,Nn2,N?,N4:;;D;= = e=FCH fU-ic~k2xsR du%NH5L .MNq"ЎLtiz#fgCɴ N#֪rI ; P eI~b=^3B~ߢm(*K3E*[/=/A1Wu?PDAZZ:2[;ƿ\uWU]=M']=_QMx_Q&aijOlsW{K)%iadDJgJ[.K?Tݐ%ia)Yno ONEm?ZpRgoRx /p !  JAsJJNo\AWa~=kmXnPQrIo<3cZaMU'%è l   P d Rm OH`L`Œ!]ĠEԍխQS'q 9deh"I"L#l9ϕCTCj-DKrMKCaPSPhQ->VQ mf+sNPI1K9\xÛ}İkyU1M WpoO)  k 1+ b 0H D.X MgP Mg A Y8 [[u [9 ]W޲ ^Q g" h>i IB .X 1 1 ߲ xu2 3 EZA Z 몠Dz \b} \R   : 9. !K & " 'n *LQ =a7 AGH Cb LZ~! dp h?8 h? hx lPv l[  l2 rD  kC   ʿ: 3 vHF O܌ ف' F  `   #( %$ 0Kk 7" Ff> GI= L. Q6^ ]I h).!Q YPq9 YP FH| Kn h  i_ t M ɂeVO R |  ܄~~ ޤ >Kt  9K W d  9  I  ( * >l ,JdN` ,g` ,g`Z ,g` 1 "> 25%e 3aG 6k] 7IȂ ;!gm >#F G- N0H Q3 SA ^ _ bq b bڅD iuPh t`M t` ztmD ~7? ~7j ~7' ̝ s  sgV  Ãb _!X xJ [T ܧ 4k )3 # sg ڞh{ ڞݜ ڞ ػ ߆-  dd ]2 yK G* 1zJ ^J4 ϰ F !/oi 3GyL 3Gyd 3W 3Y 4K7 5JY 7vz` 7vz 8Fq 8y: =O~ Q\c RZÄ Zy _Q `B eV<I jn nPKa ql . q Xyt > p} тh[ ͤ  u. ?_csoppYXh (/M4=zGӝUc.g&sp%p<bpQq/Īyy%tSUzP(|lc|ly@^PҡP!P;<grNY>G-jr֟Cūuڱ-Ą9!ɨO  H K %(}U-J.+9@tWGxKUbfgڝt|>Z*Pa]T]X"|o&.l7UM>K#-^!ߠ=SiClip entfernen Remove Clip AddRemoveClipRemove Selected Clips AddRemoveClip22AlsaDevicesPage33AlsaDevicesPage<html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Gert:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Das echte oder virtuelle benutzte ALSA-Gert.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ein echtes Gert ist eine im System installierte Soundkarte.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Virtuelle Gerte wurden in der Datei .asoundrc definiert, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">welche sich hufig im Benutzerordner befindet.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Im Zweifel knnen Sie das entweder Standardgert benutzen - dieses wurde </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Distribution festgelegt - oder Sie whlen einen Namen aus der Liste.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Im letzteren Fall vergewissern Sie sich, dass das Gert nicht verwendet wird. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Der Treiber knnte dann nicht initialisiert werden!</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Weitere Informationen finden Sie in Kapitel 3.1: "Das Treiber-Backend" des Benutzerhandbuches</p> </body></html> [

Device:

The real or virtual ALSA device to be used.

A real device is the audiocard installed in your system.

A virtual device is one created in the .asoundrc file,

often located in your home folder.

If unsure, use either the default device, this will use the audiodevice

configured by your distribution, or the device that names your audio card.

In the latter case, please make sure no application uses the audiocard,

else the driver won't be able to initialize!

For more info see chapter 3.1: "The Driver Backend" of the User Manual

AlsaDevicesPageb<html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Zahl der Perioden:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Audio wird in kleinen Abschnitten verwaltet, die Perioden heissen. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Dieser Wert bestimmt, wie viele dieser Abschnitte </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">vom Treiber der Soundkarte verwendet werden</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">In der Regel sind die Standard-Einstellungen optimal in Funktion und Latenz.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Dennoch funktionieren einige ALSA-Treiber nicht richtig</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">mit der Einstellung 2. Wenn Ihr Ton ruckelt, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">versuchen Sie es bitte mit 3 Perioden.</p></body></html>

Number of Periods:

Audio is managed in small chunks called periods.

This value determines how many of these chunks are

to be used by the driver of the audiocard.

The default should work just fine, and gives optimal latency behavior.

However, some (buggy) alsa drivers don't work correctly

with the default of 2, if you experience very choppy audio,

please try to use 3 periods.

AlsaDevicesPage<html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Dither verbessert die Audioqualitt bei Format-Konvertierungen. </p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Um die Funktionsweise von Dither zu erklren, stellt man sich am besten ein digitales Bild vor, das aus einzelnen Bildpunkten zusammengesetzt ist. Aus der Nhe sieht das Bild unscharf und unruhig aus. Ab einer bestimmten Entfernung ist das Auge nicht mehr in der Lage, die einzelnen Punkte aufzulsen, das Punktemuster verschwimmt und das eigentliche Bild tritt klarer hervor. Auf Audiosignale bezogen ist Dither ein sehr leises zuflliges Rauschen, das dem digitalen Signal beigemischt wird. Dadurch wird die digitale Rasterung des Signals verwischt und Artefakte, wie sie bei sehr leisen oder stark untersteuerten Passagen auftreten knnen, werden verringert. Bei hohen Bit-Auflsungen (24, 32-Fliesskomma) ist die Rasterung des Audiosignals so fein, dass Dither kaum eine hrbare Verbesserung bringt. Bei Reduktion auf 16 Bit (z.B. beim Export fr eine CD oder beim Abspielen ber eine 16-Bit Soundkarte) empfiehlt sich aber auf jeden Fall, Dither zu aktivieren. Welche Art von Dither am angenehmsten klingt, ist eine Frage des Geschmacks. "Triangular" ist ein guter Kompromiss zwischen Qualitt und Prozessorbelastung. Sehr gute Qualitt bei hoher Prozessorbelastung bietet "shaped". </p></body></html>

Dither is used to make the audio cleaner.

The best way to describe it is to imagine a painting with many dots. If you view it up close you can see each dot and the image is not very clear. If you view it from far away the image becomes clearer because your eyes/brain dither the dots to smooth out the image. It is a murky subject and obviously a very personal choice as to what dither is the best. For most people it is just plain magic. Anyone running at 16bit who cares about quality or has CPU cycles to spare should run with dither. Triangular is probably the best compromise of quality vs cpu cost (its very fast), but shaped is the best

AlsaDevicesPageALSA Gert ALSA DeviceAlsaDevicesPage GertDeviceAlsaDevicesPage DitherDitherAlsaDevicesPageFormFormAlsaDevicesPageKeinNoneAlsaDevicesPageAnzahl PeriodenNr. of periodsAlsaDevicesPage0Rechteckig (Rectangular) RectangularAlsaDevicesPage ShapedShapedAlsaDevicesPage,Dreieckig (Triangular) TriangularAlsaDevicesPageALSA Treiber: Kann das PCM Gert %1 nicht als Wiedergabe-Gert ffnen. Verwende den Aufnahme-Exklusiv-ModusVALSA Driver: Cannot open PCM device %1 for playback. Falling back to capture-only mode AlsaDriverALSA Treiber: Das Aufnahme-Gert %1 ist bereits in Verwendung. Bitte stoppen Sie das entsprechende Programm und starten Sie Traverso erneutqALSA Driver: The capture device %1 is already in use. Please stop the application using it and run Traverso again AlsaDriverALSA Treiber: Das Wiedergabegert %1 ist bereits in Verwendung. Bitte stoppen Sie das entsprechende Programm und starten Sie Traverso erneutrALSA Driver: The playback device %1 is already in use. Please stop the application using it and run Traverso again AlsaDriverALSA Treiber: Es war nicht mglich, die Hardware zu konfigurieren. Wird sie vielleicht gerade von einer anderen Anwendung benutzt?OALSA Driver: Unable to configure hardware, is it in use by another application? AlsaDriverALSA Treiber: Sie haben nicht die Berechtigung, das Audio-Gert %1 als Aufnahmegert zu verwendenOALSA Driver: You do not have permission to open the audio device %1 for capture AlsaDriverALSA Treiber: Sie haben nicht die Berechtigung, das Audio-Gert %1 als Wiedergabegert zu verwendenPALSA Driver: You do not have permission to open the audio device %1 for playback AlsaDriversnd_pcm_open(playback_handle, ..) mit einem unbekannten Fehler fehlgeschlagenMALSA Driver: snd_pcm_open(capture_handle, ...) failed with unknown error type AlsaDriverALSA Treiber: Kann das PCM Gert %1 nicht als Aufnahme-Gert ffnen. Verwende den Wiedergabe-Exklusiv-ModusOALSA: Cannot open PCM device %1 for capture. Falling back to playback-only mode AlsaDriversnd_pcm_open(playback_handle, ..) mit einem unbekannten Fehler fehlgeschlagen@snd_pcm_open(playback_handle, ..) failed with unknown error type AlsaDriver<html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Zeichnen der Wellenform mit einer Umrisslinie ist etwas langsamer, aber zeigt mehr Details.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Deaktivieren Sie diese Option wenn die Darstellung mit vielen Clips oder beim Scrollen langsam wird.</p></body></html>9

Painting the waveform with an outline is more detailed, but requires more cpu.

If you experience slowness when painting many clips, or during animated scroll, unselect this option!

AppearenceConfigPage(Motiv-Farbe anpassenAdjust theme colorAppearenceConfigPage"Vorhandene MotiveAvailable themesAppearenceConfigPage6Audio ausgerichtet zeichnenPaint audio rectifiedAppearenceConfigPageHUmrisslinie um Wellenformen zeichnenPaint audio with outlineAppearenceConfigPageNStereo-Dateien als einen Kanal zeichnen Paint stereo audio as mono audioAppearenceConfigPage2Pfad zu den Motiv-DateienPath to theme filesAppearenceConfigPage:Standard-Projektordner whlenSelect default project dirAppearenceConfigPageStil whlen Select styleAppearenceConfigPageStil-Optionen Style OptionsAppearenceConfigPageMotiv-Optionen Theme OptionsAppearenceConfigPageMotiv whlenTheme selectorAppearenceConfigPage<Tracks auf "Aufnahme" schalten Arm Tracks ArmTracksbDieser Aufnahmebus existiert nicht: %1 (Track %2)8AudioDevice doesn't have this Capture Bus: %1 (Track %2) AudioClipNormalisieren Normalization AudioClip0Entferne Ein-/Ausblenden Remove Fades AudioClip0Normalisieren auf Level:Set Normalization level: AudioClip,Sperre an-/ausschalten Toggle Lock AudioClip:Stummschaltung an/ausschalten Toggle Mute AudioClip<Kann nicht auf Track aufnehmenUnable to Record to Track AudioClip&Zurcksetzen&DefaultAudioClipEditDialog&Linear&LinearAudioClipEditDialog"Gebogen (Bending)BendingAudioClipEditDialog$Clip-EinstellungenClip ParametersAudioClipEditDialog DialogDialogAudioClipEditDialogEndeEndAudioClipEditDialog&Externe BearbeitungExternal ProcessingAudioClipEditDialogFade InFade InAudioClipEditDialogFade OutFade OutAudioClipEditDialog FadesFadesAudioClipEditDialogVolumenGainAudioClipEditDialog LngeLengthAudioClipEditDialog ModusModeAudioClipEditDialogNameNameAudioClipEditDialog"Strke (Strength)StrengthAudioClipEditDialogTextLabel TextLabelAudioClipEditDialogTrack-Anfang Track startAudioClipEditDialoghh:mm:ss.sss hh:mm:ss.sssAudioClipEditDialog4Clip: Externe VerarbeitungClip: External ProcessingAudioClipExternalProcessing,Auswahl: Clip einfgenSelection: Add ClipAudioClipManager"Auswahl: UmkehrenSelection: InvertAudioClipManager.Auswahl: Clip entfernenSelection: Remove ClipAudioClipManager\Alle Dateien (*);;Audiodateien (*.wav, *.flac))All files (*);;Audio files (*.wav *.flac) AudioClipViewNKlicken um Audio-Datei zurckzusetzen !Click to reset AudioFile ! AudioClipView.Keine Datei ausgewhlt!No file selected! AudioClipViewJAudio-Datei zurcksetzen fr Clip: %1Reset Audio File for Clip: %1 AudioClipViewTAudioClip Datei erfolgreich auf %1 gesetzt$Succesfully set AudioClip file to %1 AudioClipViewAudioDevice: Puffer-Leerlauf in kurzer Folge mehrfach erkannt, wechsele zum Null-TreiberHAudioDevice:: Buffer underrun 'Storm' detected, switching to Null Driver AudioDeviceAudioDevice: Um dieses Problem zu beheben, lesen Sie Kapitel 11 im Benutzerhandbuch!\AudioDevice:: For trouble shooting this problem, please see Chapter 11 from the user manual! AudioDevicejAudiogert: ALSA-Treiber konnte nicht erstellt werden-Audiodevice: Failed to create the ALSA Driver AudioDevicejAudiogert: Jack-Treiber konnte nicht erstellt werden-Audiodevice: Failed to create the Jack Driver AudioDevicetAudiogert: PortAudio-Treiber konnte nicht erstellt werden2Audiodevice: Failed to create the PortAudio Driver AudioDevicevAudiogert: PulseAudio-Treiber konnte nicht erstellt werden3Audiodevice: Failed to create the PulseAudio Driver AudioDevice.Kein Gert konfiguriertNo Device Configured AudioDevice(Kein Treiber geladenNo Driver Loaded AudioDevice<Der Jack Server wurde beendet!"The Jack server has been shutdown! AudioDeviceKonnte den Audiogerte-Prozess nicht auf Echtzeit-Prioritt setzen! Das wird vermutlich unzuverlssige Aufnahme, Wiedergabe und eine Menge Puffer-Leerlufe (== Aussetzer) verursachen. Schlimmstenfalls kann es Fehlfunktionen im Programm geben! Bitte stellen Sie sicher, dass Sie das Programm mit Echtzeit-Prioritt starten!Unable to set Audiodevice Thread to realtime priority!!!This most likely results in unreliable playback/capture and lots of buffer underruns (== sound drops).In the worst case the program can even malfunction!Please make sure you run this program with realtime privileges!!!AudioDeviceThread 2205022050AudioDriverConfigPage 3200032000AudioDriverConfigPage 4410044100AudioDriverConfigPage 4800048000AudioDriverConfigPage 8820088200AudioDriverConfigPage 9600096000AudioDriverConfigPage <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Puffer Latenz:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Die durch die Grsse des Audio-Puffers verursachte Latenz.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Einige Leute brauchen sehr geringe Latenzen. Sollten Sie diese nicht brauchen,</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">oder nicht wissen, was das bedeutet, behalten Sie bitte den Standard bei!</p> </body></html>`

Buffer latency:

The latency introduced by the size of the audio buffers.

Some people need low latencies, if you don't need it,

or don't know what it means, please leave the default setting!

AudioDriverConfigPage6<html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Duplex Modus:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Definiert ob beide - der Wiedergabe- und Aufnahmebus </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">der Soundkarte - benutzt werden.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">oder nur der Wiedergabe- oder Aufnahmebus </p></body></html>

Duplex mode:

Defines if both the Playback and Capture buses

of your soundcard are to be used,

or only the Playback or Capture bus(es).

AudioDriverConfigPagep<html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Sample-Frequenz:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Die von der Soundkarte zu benutzende Sample-Frequenz.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Neue Projekte werden diese Sample-Frequenz</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">beim Erstellen als Standard benutzen.</p></body></html>'

Sample rate:

The sample rate used by the audio card.

New projects will use this samplerate as

the project's sample rate on creation.

AudioDriverConfigPage$Puffer Latenz (ms)Buffer latency (ms)AudioDriverConfigPageAufnahmeCaptureAudioDriverConfigPage*Treiber konfigurierenConfigure driverAudioDriverConfigPageTreiber-AuswahlDriver SelectionAudioDriverConfigPageTreiber:Driver:AudioDriverConfigPageDuplex-Modus Duplex modeAudioDriverConfigPageBJack Transport Control aktivierenEnable Jack transport controlAudioDriverConfigPageVollFullAudioDriverConfigPageJackJackAudioDriverConfigPageWiedergabePlaybackAudioDriverConfigPage&Treiber neu startenRestart DriverAudioDriverConfigPageSample-Frequenz Sample rateAudioDriverConfigPageAudioquellen AudioSourcesAudioSourcesManagerWidgetFormFormAudioSourcesManagerWidget(Alle Quellen lschenRemove all sourcesAudioSourcesManagerWidgetQuelle lschen Remove sourceAudioSourcesManagerWidgetQuellen lschenRemove sourcesAudioSourcesManagerWidget4Ungenutzte Quellen lschenRemove unused sourcesAudioSourcesManagerWidgetv<html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Wiedergabe-Cursor bei der Aufnahme und Wiedergabe im Blickfeld halten.</p></body></html>

Keep the play cursor in view while playing or recording.

BehaviorConfigPageAnimiertAnimatedBehaviorConfigPage FragenAskBehaviorConfigPage.Audioclip EinstellungenAudio Clip SettingsBehaviorConfigPage\nderungen beim Ziehen kontinuierlich anwenden(Continuously adjust audio while draggingBehaviorConfigPageNicht speichern Don't saveBehaviorConfigPageFormFormBehaviorConfigPageSpringenJumpBehaviorConfigPagedZuletzt geladenes Projekt beim Programmstart laden!Load last used project at startupBehaviorConfigPage<Audioclips automatisch sperrenLock Audio Clips by defaultBehaviorConfigPageLEinstellungen fr neue ArbeitsbereicheNew Sheet SettingsBehaviorConfigPageBeim Beenden: On close:BehaviorConfigPage0Wiedergabe-EinstellungenPlayback SettingsBehaviorConfigPage*Projekt-EinstellungenProject SettingsBehaviorConfigPageSpeichernSaveBehaviorConfigPage.Bei Wiedergabe scrollenScroll playbackBehaviorConfigPageMittig halten Stay CenteredBehaviorConfigPage BeideBothBusSelectorDialogBus Auswahl Bus SelectorBusSelectorDialogAufnahme-Busse Capture BusesBusSelectorDialog KanleChannelsBusSelectorDialog LinksLeftBusSelectorDialogAbspielkanlePlayback BusesBusSelectorDialog RechtsRightBusSelectorDialog TrackTrackBusSelectorDialog12x12xCDWritingDialog16x16xCDWritingDialog1x1xCDWritingDialog20x20xCDWritingDialog24x24xCDWritingDialog28x28xCDWritingDialog2x2xCDWritingDialog32x32xCDWritingDialog36x36xCDWritingDialog40x40xCDWritingDialog44x44xCDWritingDialog48x48xCDWritingDialog4x4xCDWritingDialog8x8xCDWritingDialogAbbrechenAbortCDWritingDialogBrenn-LaufwerkBurning DeviceCDWritingDialogCD brennen CD WritingCDWritingDialogJNormalisierung berechnen und anwenden!Calculate and apply normalizationCDWritingDialogSchliessenCloseCDWritingDialogjExportiere nur das CD-Abbild (CD wird nicht gebrannt).Export wav and toc files only (don't write CD)CDWritingDialog0Allgemeine EinstellungenGeneral OptionsCDWritingDialogInformation InformationCDWritingDialogAnzahl KopienNumber of copiesCDWritingDialogSimulationSimulateCDWritingDialogGeschwindigkeitSpeedCDWritingDialog(Brennvorgang starten Start WritingCDWritingDialog StatusStatusCDWritingDialog6Brenne alle ArbeitsbereicheWrite all SheetsCDWritingDialogFBrenne den aktuellen ArbeitsbereichWrite current SheetCDWritingDialogAutomatischautoCDWritingDialogClip auswhlen Select Clip ClipSelection0Auswahl: Clip hinzufgenSelection: Add Clip ClipSelection.Auswahl: Clip entfernenSelection: Remove Clip ClipSelection6%n Audiodateien importierenImport %n audiofile(s) ClipsViewPort,Kurvenpunkt hinzufgen Add CurveNodeCurve*Kurvenpunkt entfernenRemove CurveNodeCurveAn dieser Stelle existiert schon ein Knotenpunkt. Fge keinen neuen hinzu.FThere is allready a node at this exact position, not adding a new nodeCurve&Lsche Knotenpunkte Clear Nodes CurveViewPunkt ziehen Drag Node CurveViewAbbruchCancelDialog DialogDialogDialogOKOKDialogDigitale Uhr Digital Clock DigitalClock@Audio-Gerteeinstellungen ndernChange Audio Device settings DriverInfo-- ExportDialog Export abbrechen Abort Export ExportDialogSchliessenClose ExportDialog ExportExport ExportDialog>Exportiere alle ArbeitsbereicheExport all Sheets ExportDialogNExportiere den aktuellen ArbeitsbereichExport current Sheet ExportDialog"ExportverzeichnisExport directory ExportDialogExportstatus Export status ExportDialog0Allgemeine EinstellungenGeneral Options ExportDialogExport starten Start Export ExportDialog <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Diese Option reduziert den Speicherverbrauch von Fliesspunkt-Daten um bis zu 10%, indem es Informationen aus dem Audiosignal entfernt, die so gut wie keinen Einfluss auf die Qualitt haben.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Technisch gesehen wird die Kompression dadurch verlustbehaftet, aber die Vorteile der Fliesspunkt-Auflsung bleiben erhalten (&gt;600 dB Dynamikumfang, keine bersteuerung, 25 Bit Auflsung). </p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Bei Integer-Daten wird die Bit-Auflsung auf maximal 24 Bit reduziert.</p></body></html>B

This option reduces the storage of some floating-point data files by up to about 10% by eliminating some information that has virtually no effect on the audio data.

While this does technically make the compression lossy, it retains all the advantages of floating point data (>600 dB of dynamic range, no clipping, and 25 bits of resolution).

This also affects large integer compression by limiting the resolution to 24 bits.

ExportFormatOptionsWidget Mittlere BitrateAverage BitrateExportFormatOptionsWidget BesteBestExportFormatOptionsWidgetSampleauflsungBitdepthExportFormatOptionsWidget KanleChannelsExportFormatOptionsWidget&KompressionsmethodeCompression typeExportFormatOptionsWidget4Qualitt der KonvertierungConversion qualityExportFormatOptionsWidgetKodierungEncodingExportFormatOptionsWidgetKodiermethodeEncoding MethodExportFormatOptionsWidgetSchnellFastExportFormatOptionsWidgetDateityp File TypeExportFormatOptionsWidget&FormateinstellungenFormat OptionsExportFormatOptionsWidgetHochHighExportFormatOptionsWidgetMP3-Optionen MP3 OptionsExportFormatOptionsWidget Maximale BitrateMaximum BitrateExportFormatOptionsWidget MittelMediumExportFormatOptionsWidget Minimale BitrateMinimum BitrateExportFormatOptionsWidget2Audiosignal normalisierenNormalize AudioExportFormatOptionsWidgetOgg-Optionen Ogg OptionsExportFormatOptionsWidgetHQualitt (schnell <-> gute Qualitt)Quality (Fastest <-> Best)ExportFormatOptionsWidgetRQualitt (kleine Datei <-> gute Qualitt)Quality (Smallest <-> Best)ExportFormatOptionsWidgetSamplefrequenz Sample RateExportFormatOptionsWidgetxberspringe WVX fr strkere Kompression (quasi-verlustfrei).Skip WVX for extra compression (semi-lossless)ExportFormatOptionsWidgetVWavPack-Optionen (verlustfreie Kompression)&WavPack options (lossless compression)ExportFormatOptionsWidgetRFr das sox-Programm verfgbare Parameter'Available arguments for the sox programExternalProcessingDialogDProgramm <b>%1</b> ist abgestrzt!Program %1 crashed!ExternalProcessingDialogDas Programm <b>%1</b> ist nicht installiert oder Ihnen fehlt die zum Ausfhren notwendige Berechtigung!DProgram %1 not installed, or insufficient permissions to run!ExternalProcessingDialogSie mssen ein Argument angeben, bevor Sie die externe Bearbeitung starten!DYou have to supply an argument before starting the external process!ExternalProcessingDialog&Einblenden:Biegung Fade In: bendFadeBend&Ausblenden:BiegungFade Out: bendFadeBendHVoreinstellungen fr Ein-/Ausblenden Fade Preset FadeCurve Einblenden: FormFade In: shapeFadeMode Ausblenden: FormFade Out: shapeFadeMode"Einblenden: LngeFade In: length FadeRange*Einblenden: EntfernenFade In: remove FadeRange"Ausblenden: LngeFade Out: length FadeRange*Ausblenden: EntfernenFade Out: remove FadeRange$Einblenden:StrkeFade In: strength FadeStrength$Ausblenden:StrkeFade Out: strength FadeStrengthMein Computer My Computer FileWidgetMeine Dokumente My Documents FileWidget4Nchst hheres VerzeichnisParent Directory FileWidget4Dateiansicht aktualisierenRefresh File View FileWidget Alle Dateien (*) All files (*)ImportfAudio-Dateien (*.wav *.flac *.ogg *.mp3 *.wv *.w64)1Audio files (*.wav *.flac *.ogg *.mp3 *.wv *.w64)Import,Audiodatei importierenImport Audio FileImport.Audioquelle importierenImport audio sourceImportStille einfgenInsert SilenceImport StilleSilenceImportBCommand Plugin %1 nicht gefunden!Command Plugin %1 not found! InputEnginexHalte-Aktionen sind aus dem Kontextmen heraus nicht mglich0Hold actions are not supported from Context Menu InputEngineModifiziertasten-Aktionen sind aus dem Kontextmen heraus nicht mglich8Modifier key actions are not supported from Context Menu InputEngineDPlugin %1 setzt Befehl %2 nicht um&Plugin %1 doesn't implement Command %2 InputEngineStille einfgenInsert SilenceInsertSilenceDialog6Stille einfgen (Sekunden):Insert Silence (seconds):InsertSilenceDialog(&Alles ber Traverso&About Traverso Interface &CD schreiben...&CD Writing... Interface&Export... &Export... InterfaceDer Einstie&g&Getting Started Interface$Projekt&manager...&Manage Project... Interface&Neu...&New... Interface&Oeffnen...&Open... Interface"&Einstellungen...&Preferences... Interface&Projekt&Project Interface&Beenden&Quit Interface6&Format der Aufnahmedateien&Recording File Format InterfaceL&Qualitt der Samplerate-Konvertierung&Resample Quality Interface6&Backup wiederherstellen...&Restore Backup... Interface&Speichern&Save Interface&Arbeitsbereich&Sheet Interface"Effekte &anzeigen &Show Effects InterfaceEinra&sten&Snap Interface"Ben&utzerhandbuch &User Manual Interface&Ansicht&View Interface&<b>Beschreibung</b>Description Interface$<b>Tastenfolge</b>Key Sequence InterfaceEin Projekt-Verzeichnis wurde auerhalb von Traverso gendert. Dies wird NICHT untersttzt! Bitte machen Sie diese nderung schnell rckgngig! Verwenden Sie zum ndern eines Projektnamens stattdessen bitte den Projekt-Manager!A Project directory changed outside of Traverso. This is NOT supported! Please undo this change now! If you want to rename a Project, use the Project Manager instead! Interfaceber TraversoAbout Traverso InterfacefAudio-Dateien (*.wav *.flac *.ogg *.mp3 *.wv *.w64)1Audio files (*.wav *.flac *.ogg *.mp3 *.wv *.w64) Interface BesteBest InterfaceVKodierung fr Aufnahme in %1 wurde gendert$Changed encoding for recording to %1 Interfacehndere Qualitt der Samplerate-Konvertierung auf: %1Changed resample quality to: %1 Interface2Korrellationsgrad-AnzeigeCorrelation Meter Interface(FFT Frequenzspektrum FFT Spectrum InterfaceSchnellFast InterfaceHochHigh InterfaceVerlaufHistory Interface &Audio-Import...Import &Audio... Interface&Sti&lle einfgen...Insert Si&lence... InterfacezWiedergabecursor bei Aufnahme/Wiedergabe im Blickfeld halten.4Keep play cursor in view while playing or recording. Interface(Markierungseditor...Marker Editor... Interface MittelMedium Interface0Neuer &Arbeitsbereich...New &Sheet(s)... Interface"Neue &Spur(en)...New &Track(s)... InterfaceVffne Benutzerhandbuch in externem Browser!(Opening User Manual in external browser! InterfaceProjektProject InterfaceWiederholenRedo Interface Materialsammlung Resources Bin Interface(Wiedergabe S&crollenS&croll Playback InterfaceEins&tellungen Se&ttings InterfacepObjekte beim Ziehen an Kanten anderer Objekte einrasten.2Snap items to edges of other items while dragging. Interface&SysteminformationenSystem Information InterfaceDas Projekt '%1' konnte nicht geladen werden. Begrndung: '%2' Falls Backups bestehen, haben Sie nun die Mglichkeit, ein solches zu ffnen.The requested Project `%1` could not be loaded for the following reason: '%2' You will now be given a list of available backups (if any) to restore the Project from. InterfaceTraverso %1 (kompiliert gegen Qt %2) Ein Multi-Track Audio Recording- und Editing-Programm. Schauen Sie ins Hilfe-Men fr weitere Informationen. Traverso wird ihnen von R Sijrier und vielen Anderen zur Verfgung gestellt. Fallen viele Leute aus der Welt der freien Software, die zu den Technologien beigetragen haben, auf denen Traverso basiert. (Gcc, Qt, Xorg, Linux, und so weiter...)KTraverso %1 (built with Qt %2) A multitrack audio recording and editing program. Look in the Help menu for more info. Traverso is brought to you by R. Sijrier and others, including all the people from the Free Software world who contributed the important technologies on which Traverso is based (Gcc, Qt, Xorg, Linux, and so on) Interface$Traverso - WichtigTraverso - Important InterfaceZTraverso - Laden des Projektes fehlgeschlagenTraverso - Project load failed InterfaceRckgngigUndo InterfaceZJack Treiber: Erfolgreich mit Jack verbunden!7Jack Driver: Connected successfully to the jack server! JackDriverJack Treiber: Konnte nicht mit Jack-Server verbinden. Luft ein Jack Server?BJack Driver: Couldn't connect to the jack server, is jack running? JackDriver<html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Bitstream Vera Sans; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Timeout fr Doppelklick-Tastaturbefehle (ms)</p></body></html>Z

Double fact timeout (ms)

KeyboardConfigPage<html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Bitstream Vera Sans; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Timeout fr Halten (ms)</p></body></html>S

Hold timeout (ms)

KeyboardConfigPage,<html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Double fact timeout:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Maximale Zeit zwischen 2 Tastendrcken </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">um zu bestimmen, ob diese 2 Tastendrcke ein double fact sind ( &lt;&lt; K &gt;&gt; oder &lt;&lt; KK &gt;&gt;)</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> oder 2 einzelne Tastendrcke ( eine &lt; K &gt; und &lt; K &gt; Aktion, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">oder eine &lt; KK &gt; und &lt; KK &gt; Aktion zum Beispiel).</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Erfahrene Benutzer knnen hier bis auf 150ms herab gehen, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">weniger Erfahrene sollten es bei 180 ms belassen.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mehr Informationen finden Sie in Kapitel 7: Tastaturbefehle des Benutzerhandbuches.</p></body></html>

Double fact timeout:

The maximum time in miliseconds between 2 key presses

to determine if the 2 key presses are a double fact ( << K >> or << KK >>)

or 2 individual key presses ( a < K > and < K > action,

or < KK > and < KK > action for example).

Experienced users can set this value as low as 150 ms,

if you don't have much experience yet, please leave the default of 180 ms.

For more information, see chapter 7: Key Actions. of the User Manual

KeyboardConfigPage~<html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Timeout fr Halten:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Die Zeitgrenze, um einen Tastendruck als Halten zu interpretieren, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">wie [ K ] oder [ KK ].</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Je krzer diese Zeit ist, um so eher wird ein Tastendruck </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">als Halten-Aktion interpretiert. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Erfahrene Benutzer werden mit 110ms gut zurecht kommen, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">weniger erfahrene sollten es bei eta 150ms belassen.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Weitere Informationen in Kapitel 7: "Tasten-Aktionen" des Benutzerhandbuches.</p> </body></html>7

Hold timeout:

The maximum time to consider a pressed key a hold key fact,

like [ K ] or [ KK ].

The shorter this time, the sooner a pressed key will be

detected as a hold action.

Experienced users can set this value as low as 110 ms,

if you don't have much experience yet, please leave the default of 150 ms.

For more information, see chapter 7: "Key Actions" of the User Manual.

KeyboardConfigPage,Tastatur konfigurierenConfigure KeyboardKeyboardConfigPage4Tastenbelegung exportieren Export KeymapKeyboardConfigPageFormularFormKeyboardConfigPage4Tastenbelegung exportieren KeyMap ExportKeyboardConfigPageTastenbelegungKeymapKeyboardConfigPagepEs existiert keine Beschreibung fr diese Tastenbelegung"No description set for this keymapKeyboardConfigPage0Tastaturbelegung drucken Print KeymapKeyboardConfigPage*Tastenbelegung whlen Select keymapKeyboardConfigPagexDie exportierte Tastaturbelegung wurde unter %1 gespeichert.+The exported keymap can be found here: %1KeyboardConfigPage DeutchEnglish LanguageName&Export&Export MarkerDialogEntfe&rnen&Remove MarkerDialog...... MarkerDialog"Auf alle anwenden Apply to all MarkerDialogArrangeur: Arranger: MarkerDialogCD-TextCD-Text MarkerDialog CD-Text optionalCD-Text optional MarkerDialogKomponist: Composer: MarkerDialogKopierschutzCopy protection MarkerDialog ISRC:ISRC: MarkerDialogMarkierungenMarkers MarkerDialogNachricht:Message: MarkerDialogOptionenOptions MarkerDialogInterpret: Performer: MarkerDialogPositionPosition MarkerDialog0Position: (MM:SS:75stel)Position: (MM:SS:75ths) MarkerDialogPreemphasis Pre-Emphasis MarkerDialog TitelTitle MarkerDialog Titel:Title: MarkerDialogClip kopieren Copy ClipMoveClip*Arbeitsbereich falten Fold SheetMoveClipSpur falten Fold TrackMoveClip Clip verschieben Move ClipMoveClip8Clip an das Ende verschiebenMove Clip To EndMoveClip4Clip an den Anfang bewegenMove Clip To StartMoveClip,Clip-Kante verschiebenMove Clip EdgeMoveEdge......NewProjectDialogfAudio-Dateien (*.wav *.flac *.ogg *.mp3 *.wv *.w64)1Audio files (*.wav *.flac *.ogg *.mp3 *.wv *.w64)NewProjectDialogPFehler beim Erstellen des Projektes (%1)Couldn't create project (%1)NewProjectDialogBeschreibung DescriptionNewProjectDialogTontechnikerEngineerNewProjectDialogNameNameNewProjectDialogNeues Projekt New ProjectNewProjectDialogNeinNoNewProjectDialogAnzahl SheetsNumber of SheetsNewProjectDialogEin Projekt namens "%1" existiert bereits. Wollen Sie es lschen und durch ein neues ersetzen?YThe Project "%1" already exists, do you want to remove it and replace it with a new one ?NewProjectDialog2Spuren pro ArbeitsbereichTracks per SheetNewProjectDialog Traverso - FrageTraverso - QuestionNewProjectDialog"Vorlage verwenden Use TemplateNewProjectDialogJaYesNewProjectDialogREs muss ein Projektname angegeben werden!'You must supply a name for the project!NewProjectDialogF%n neue Arbeitsbereiche hinzugefgtAdded %n Sheet(s)NewSheetDialogEs kann kein neuerArbeitsbereich erstellt werden wenn kein Projekt geladen wurde!!:I can't create a new Sheet if there is no Project loaded!!NewSheetDialog:Name fr neuen ArbeitsbereichNew Sheet nameNewSheetDialog(Neue Arbeitsbereiche New Sheet(s)NewSheetDialog,Anzahl Arbeitsbereiche Sheet countNewSheetDialogAnzahl Spuren Track countNewSheetDialog"Vorlage verwenden Use TemplateNewSheetDialog*%n Tracks hinzugefgtAdded %n Track(s)NewTrackDialogEs kann kein Track hinzugefgt werden, wenn kein Projekt geladen ist!!!:I can't create a new Track if there is no Project loaded!!NewTrackDialogNeue Tracks New Track(s)NewTrackDialogTrack-Anzahl Track countNewTrackDialogTrack Name Track nameNewTrackDialog*<p>Projekt-Verzeichnis <b>%1</b> unterscheidet sich vom Projekttitel <b>%2</b>!</p><p>Haben Sie das Projektverzeichnis umbenannt?</p><p>Bitte benennen Sie das Projektverzeichnis zurck in den Projektnamen <b>%1</b> und ndern Sie den Projektnamen im Projekt-Manager-Dialog!</p>

Project directory name %1 is different from the Project title %2!

Did you rename the Project directory ?

Please rename the directory back to the Project title %1, and change the Project title with the Project Manager Dialog!

OpenProjectDialogWollen sie das Projekt "%1" wirklich entfernen? Diese Aktion kann nicht rckgngig gemacht werden!TAre you sure that you want to remove the project %1 ? It's not possible to undo it !OpenProjectDialogWhlen sie ein existierendes Projektverzeichnis, oder erstellen Sie ein neues4Choose an existing or create a new Project DirectoryOpenProjectDialog`Ein neues Projektverzeichnis wurde erstellt: %1 /Created new Project directory for you here: %1 OpenProjectDialogErstellt am: Created on:OpenProjectDialogLschenDeleteOpenProjectDialogBeschreibung: Description:OpenProjectDialog LadenLoadOpenProjectDialog0Kein Projekt ausgewhlt!No Project selected!OpenProjectDialogProjekt ffnen Open ProjectOpenProjectDialogBitte berprfen Sie die Berechtigungen fr dieses Verzeichnis, oder whlen Sie ein anderes: %1FPlease check permission for this directory or choose another one: %1OpenProjectDialog|Bitte berprfen Sie die Berechtigungen fr das Verzeichnis %1.Please check permission for this directory: %1OpenProjectDialogProjekt %1 existiert nicht. Haben Sie das dazugehrige Verzeichnis umbenannt oder gelscht?RProject %1 does not exist, did you rename or remove the directory what that name ?OpenProjectDialogBDas Projekt existiert nicht! (%1)Project does not exist! (%1)OpenProjectDialog2Projektverzeichnis whlenSelect Project DirOpenProjectDialogWhlen Sie ein Projekt und drcken Sie erneut den Button 'Laden'2Select a project and click the 'Load' button againOpenProjectDialog(Ausgewhltes ProjektSelected ProjectOpenProjectDialogbDieses Verzeichnis kann nicht geschrieben werden!(This directory is not writable by you! OpenProjectDialog,Traverso - InformationTraverso - InformationOpenProjectDialog Traverso - FrageTraverso - QuestionOpenProjectDialog$Traverso - WarnungTraverso - WarningOpenProjectDialogJKonnte Projektordner nicht anlegen! %Unable to create Project directory! OpenProjectDialogREs muss ein Projektname angegeben werden!'You must supply a name for the project!OpenProjectDialog>PADriver:: PortAudio Fehler: %1PADriver:: PortAudio error: %1PADriverrPADriver:: hostapi %1 wurde von PortAudio nicht gefunden!1PADriver:: hostapi %1 was not found by Portaudio!PADriver R<html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">PortAudio Treiber:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Der Treiber fr das PortAudio Backend</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">PortAudio untersttzt viele Treiber-Backends von denen Traverso einige auch selbst untersttzt. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Es wird empfohlen, wenn mglich die Traverso-eigenen Treiber zu benutzen. Solle es Probleme geben, ist ein Versuch mit PortAudio jedoch eine gute Idee.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">PortAudio bietet transparente Untersttzung fr verschiedene Platformen. Unter anderem Windows (beachten Sie wmme, DirectX und asio Optionen) und Mac OS X (beachten Sie CoreAudio and jack Optionen)</p> </body></html>

PortAudio Driver:

The driver which should drive the PortAudio backend

PortAudio supports many driver backends, some of which Traverso has native support for too.

It is recommended to use Traverso's native drivers instead of using PortAudio's, however, if the native drivers give problems, you might try the ones supplied by PortAudio instead!

PortAudio provides transparent driver support for multiple platforms, including Windows (see the wmme, direct x and asio options), and Mac OS X (see the CoreAudio and jack options)

 PaDriverPageTreiberDriver PaDriverPageFormForm PaDriverPage"PortAudio TreiberPortaudio drivers PaDriverPageD<html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head> <body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Gre des Lese-Puffers:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Die Menge an Audio-Daten, die in den Lese-Puffern</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">gespeichert werden kann (in Sekunden)</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Der Standard von einer Sekunde sollte gut funktionieren.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Wenn es allerdings an Speicher mangelt, kann der Wert reduziert werden.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Gibt es einen Puffer-Leerlauf, so ist die Bandbreite der Festplatte(n) </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">nahezu ausgelastet. Bei regelmigem Auftreten aufgrund </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">zu geringen Festplattendurchsatzes, versuchen Sie einen Wert von</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">1.5 oder 2 Sekunden</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Behalten Sie im Hinterkopf, dass ein grosser Puffer, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">sprbar Lngere Verzgerungen beim verschieben </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">des Wiedergabekopfes verursacht, da alle Puffer </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(einer pro Clip in jedem Kanal) neu gefllt werden mssen!</p> </body></html> +

Read buffer size:

The amount of audio data that can be stored in the

read buffers in seconds.

The default value of 1 second should do just fine.

However, if you're tight on memory, you can make this value lower.

If you experience buffer underruns when the hard disk bandwidth is

(almost) saturated, or when buffer underruns happen regularly due

the hard disk can't keep up for some reason, you can try a larger

value, like 1.5 or 2.0 seconds.

Keep in mind that when using a larger buffer,

it will take considerably more time to move (i.e. seeking)

the playhead to another positions, since all the buffers

(one for each audioclip * channel count) need to be refilled!

PerformanceConfigPager<html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Beschleunigt die Anzeige von Clips und Tracks durch</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">die im System vorhandende Grafikhardware.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Abhngig von der Karte und den Treibern kann dies die Anzeige </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">auf grandiose Weise beschleunigen!</p></body></html>8

Accelerates the painting of AudioClips and Tracks by using

the 3D engine of your graphics card.

Depending on your graphics card and driver support, this

can speed up painting considerably!

PerformanceConfigPage8<html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Legt fest, wie oft bei einer Jog-Aktion die Elemente neu</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">gezeichnet werden. Beispiele waeren das Bewegen eines</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Audio-Clip oder eine Gain-nderung.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Standard ist hier 35. Dies ist ein guter Kompromiss zwischen</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">einer angenehmen Ansicht und vertretbarer Last.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Sollte die Anzeige dennoch nicht fluessig genug sein,</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">erhhen Sie den Wert. Behalten Sie allerdings im Hinterkopf,</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">dass dies ihre CPU sprbar mehr beansprucht!</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Andersherum kann ein senken des Wertes sinnvoll sein,</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">wenn es z.B. Leistungsprobleme beim verschieben eines Clips gibt.</p></body></html> ~

The number of times per second at which the Graphical

Items are repainted during a jog action, like moving an

AudioClip, or changing the Gain.

The default frames per second of 35 is a perfect compromise

between smooth painting, and low cpu usage.

However, if you find the painting to be not smooth enough,

change this value to a higher one, but keep in mind that it

will consume considerably more cpu!

If for example moving an AudioClip still takes to much cpu,

you should consider to lower this value.

PerformanceConfigPage&Audio-Datei puffernAudio file bufferingPerformanceConfigPageEine nderung der Puffer-Gre wird erst nach (Neu)laden des Projektes angewandt.QChanging the buffer size only will take into effect after (re)loading a project.PerformanceConfigPageFormularFormPerformanceConfigPage6Jog Neuzeichnungsrate (fps)Jog repaint speed (fps)PerformanceConfigPageZeichnenPaintingPerformanceConfigPage6Lesepuffer-Gre (Sekunden)Read buffer size (seconds)PerformanceConfigPage@Hardwarebeschleunigung verwendenUse hardware accelerationPerformanceConfigPageInfo Icon info iconPerformanceConfigPage"Plugin hinzufgenAdd Plugin tooPluginSelectorDialogAbbruchCancelPluginSelectorDialogEin-/AusgangIn/OutPluginSelectorDialogOKOKPluginSelectorDialogPlugin Name Plugin NamePluginSelectorDialogPlugin AuswahlPlugin SelectorPluginSelectorDialogTypTypePluginSelectorDialogJKonnte Verzeichnis %1 nicht erstellenCannot create dir %1ProjectKonnte die Datei fr die Projekteinstellungen nicht zum Schreiben ffnen (Datei %1. Grund: %2)HCouldn't open Project properties file for writing! (File %1. Reason: %2)Project2Neues Projekt %1 erstelltCreated new Project %1ProjectvEs wurde Clipping im exportierten Audiosignal erkannt! (%1))Detected clipping in exported audio! (%1)Project>Export wurde bereits gestartet!2Export already in progress, cannot start it twice!Project$Projekt %1 geladenProject %1 loadedProject.Projekt %1 gespeichert Project %1 saved ProjectProjekt %1: Datei project.tpf kann nicht geffnet werden! (Grund: %2)6Project %1: Cannot open project.tpf file! (Reason: %2)ProjectbProjekt %1: Konnte project.tpf nicht parsen! (%2):Project %1: Failed to parse project.tpf file! (Reason: %2)ProjectDie Version der Projektdatei passt nicht. Kann das Projekt nicht laden!%1 Dateien zu konvertieren</b>Need to convert %1 filesProjectConverterBKonvertierung erfolgreich beendetConversion finished succesfullyProjectConverterLKonvertierung durch Benutzer abgebrochen. Die Datei kann weiterhin mit Traverso <= 0.41.0 geffnet werden, oder neu mit dieser Version von Traverso konvertiert werdenConversion stopped on user request, you can continue to use this Project with Traverso <= 0.41.0, or reopen it with this version of Traverso and start the conversion againProjectConverterVKonvertierung von project.tpf..... Beendet!&Converting project.tpf file..... Done!ProjectConverterKonnte die Datei fr die Projekteinstellungen nicht zum Schreiben ffnen (Datei %1. Grund: %2)HCouldn't open Project properties file for writing! (File %1. Reason: %2)ProjectConverter^Keine Beschreibung der Konvertierung verfgbar!$No conversion description available!ProjectConverter8Projekt %1 wurde konvertiertProject %1 convertedProjectConverterbProjekt %1: Konnte project.tpf nicht parsen! (%2):Project %1: Failed to parse project.tpf file! (Reason: %2)ProjectConverterProjektdateien mit Version %1 knnen nicht konvertiert werden. Konvertierung ist nur mit Dateien von Version 2 mglich!PProject file with version %1 cannot be converted, only files with version 2 can!ProjectConverterxKonvertierte Datei project.tpf wird gespeichert.... Beendet!+Saving converted project.tpf file.... Done!ProjectConverter|Beginne das Projekt von Version 2 zu Version 3 zu konvertieren7Starting to convert Project from version 2 to version 3ProjectConverterSchlieenCloseProjectConverterDialog>Informationen zur KonvertierungConversion informationProjectConverterDialog:Fortschritt der KonvertierungConversion progressProjectConverterDialogProjekt laden Load ProjectProjectConverterDialog(ProjektkonvertierungProject ConverterProjectConverterDialog#Project XXX (no translation needed)ProjectConverterDialog*Beginne KonvertierungStart conversionProjectConverterDialog(Beende KonvertierungStop conversionProjectConverterDialog--ProjectInfoWidgetSampleauflsungBitdepthProjectInfoWidgetProjektProjectProjectInfoWidget(ProjektinformationenProject Information WidgetProjectInfoWidgetSamplefrequenzRateProjectInfoWidget SongsSongsProjectInfoWidgetJKonnte Verzeichnis %1 nicht erstellenCannot create dir %1ProjectManagerXWhlen Sie ein Verzeichnis fr ihre Projekte,Choose a directory to store your Projects inProjectManager`Konnte Projektverzeichnis nicht zu %1 umbenennen(Could not rename Project directory to %1ProjectManager`Ein neues Projektverzeichnis wurde erstellt: %1 /Created new Project directory for you here: %1 ProjectManagerJStandardprojekt erstellt von Traverso#Default Project created by TraversoProjectManagerbWollen Sie das Projekt vor dem Beenden speichern?/Do you want to save the Project before quiting?ProjectManagerEs gibt nichts zu speichern. ffnen oder erstellen Sie zuerst ein Projekt!3No Project to save, open or create a Project first!ProjectManagerEs wurde kein Verzeichnis ausgewhlt. Im Dialog "Projekt ffnen", "Projektverzeichnis auswhlen" kann es nachtrglich ausgewhlt werdenoNo directory was selected, to retry open the 'Open Project Dialog' and click 'Select Project Directory' button ProjectManagerBitte berprfen Sie die Berechtigungen auf dieses Verzeichnis oder whlen Sie ein anderes: %1FPlease check permission for this directory or choose another one: %1ProjectManagertBitte berprfen Sie die Berechtigungen fr Verzeichnis %1.Please check permission for this directory: %1ProjectManager:Projekt %1 existiert bereits!Project %1 already exists!ProjectManagerProjekt %1 konnte nicht mehr gefunden werden! (Haben Sie das Projektverzeichnis umbenannt oder verschoben?)WProject %1 no longer could be found! (Did you remove or rename the Project directory ?)ProjectManagerProjekt-Backup: Projektdatei %1 konnte nicht gelesen werden (Grund: %2)TProjectfile backup: The project file %1 could not be opened for reading (Reason: %2)ProjectManager"Projekt speichern Save ProjectProjectManagerbDieses Verzeichnis kann nicht geschrieben werden!(This directory is not writable by you! ProjectManager$Traverso - WarnungTraverso - WarningProjectManagerHKonnte Projektorder nicht anlegen! %Unable to create Project directory! ProjectManagerNKonnte neues Projekt %1 nicht erstellenUnable to create new Project %1ProjectManager:Konnte Projekt %1 nicht ladenUnable to load Project %1ProjectManagerdVerwende ein existierendes Projektverzeichnis: %1 %Using existing Project directory: %1 ProjectManager <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Letzte nderung wiederholen</p></body></html>

Redo last change

ProjectManagerDialog,<html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Letzte nderung Rckgngig machen</p></body></html>

Undo last change

ProjectManagerDialog$Adult ContemporaryAdult ContemporaryProjectManagerDialog Alternative RockAlternative RockProjectManagerDialogArrangeurArrangerProjectManagerDialogCD-TextCD TextProjectManagerDialogChildrens ChildrensProjectManagerDialogClassical ClassicalProjectManagerDialog,Contemporary ChristianContemporary ChristianProjectManagerDialogVKonnte Datei %1 nicht zum Schreiben ffnen!"Couldn't open file %1 for writing!ProjectManagerDialogCountryCountryProjectManagerDialog<Neuen Arbeitsbereich erstellenCreate new SheetProjectManagerDialog DanceDanceProjectManagerDialogLschenDeleteProjectManagerDialogBeschreibung DescriptionProjectManagerDialog DialogDialogProjectManagerDialogDisc ID:Disc ID:ProjectManagerDialogEasyListeningEasy ListeningProjectManagerDialogTontechnikerEngineerProjectManagerDialogFGeben Sie den Namen der Vorlage einEnter Template nameProjectManagerDialog EroticEroticProjectManagerDialog ExportExportProjectManagerDialogFolkFolkProjectManagerDialog Genre:Genre:ProjectManagerDialog GospelGospelProjectManagerDialogHip HopHip HopProjectManagerDialogInformation InformationalProjectManagerDialogJazzJazzProjectManagerDialog LatinLatinProjectManagerDialog LngeLengthProjectManagerDialogMitteilungMessageProjectManagerDialogMusicalMusicalProjectManagerDialogNew AgeNew AgeProjectManagerDialog(Neuer Arbeitsbereich New SheetProjectManagerDialogtEs wurde kein Name fr den neuen Arbeitsbereich angegeben!No new Sheet name was supplied!ProjectManagerDialog OperaOperaProjectManagerDialogOperetteOperetteProjectManagerDialogInterpret PerformerProjectManagerDialogPop Music Pop MusicProjectManagerDialogProjektProjectProjectManagerDialogEin Projekt mit dem Titel '%1' existiert bereits. Bitte geben Sie einen anderen Titel an!IProject with title '%1' allready exists, please supply a different title!ProjectManagerDialogRapRapProjectManagerDialog ReggaeReggaeProjectManagerDialogUmbenennenRenameProjectManagerDialogRhytm and BluesRhythm and BluesProjectManagerDialogRock Music Rock MusicProjectManagerDialog"Vorlage speichern Save TemplateProjectManagerDialog<Projektvorlage gespeichert: %1Saved Project Template: %1ProjectManagerDialog6Ausgewhlter ArbeitsbereichSelected SheetProjectManagerDialog2Name des Arbeitsbereiches Sheet NameProjectManagerDialog"Arbeitsbereich(e)Sheet(s)ProjectManagerDialogArbeitsbereicheSheetsProjectManagerDialogSound Effects Sound EffectsProjectManagerDialogSpoken Word Spoken WordProjectManagerDialogVorlageTemplateProjectManagerDialogEine Vorlage mit dem Namen %1 existiert bereits! Wollen Sie diese berschreiben?CTemplate with name %1 already exists! Do you want to overwrite it?ProjectManagerDialog TitelTitleProjectManagerDialog SpurenTracksProjectManagerDialog,Traverso - InformationTraverso - InformationProjectManagerDialogUPC EAN:UPC EAN:ProjectManagerDialogHKonnte Verzeichnis %1 nicht anlegen!Unable to create directory %1!ProjectManagerDialogUndefined UndefinedProjectManagerDialog UnusedUnusedProjectManagerDialogWorld Music World MusicProjectManagerDialogWiederholenredotextProjectManagerDialogRckgngigundotextProjectManagerDialogHEin schwerer Fehler ist aufgetreten.A fatal error occurred.QObject&Zeitberschreitung.A timeout occurred.QObject`Beim Lesen der Datei ist ein Fehler aufgetreten.-An error occurred when reading from the file.QObjecthBeim Schreiben der Datei ist ein Fehler aufgetreten.+An error occurred when writing to the file.QObjectNEin unbekannter Fehler ist aufgetreten.An unspecified error occurred.QObject0Keine Fehler aufgetretenNo error occurredQObjectResourcenfehler Resourc errorQObject SheetSheetQObjectHZugriff auf die Datei nicht mglich.The file could not be accessed.QObjectLDie Datei konnte nicht kopiert werden.The file could not be copied.QObjectNDie Datei konnte nicht geffnet werden.The file could not be opened.QObjectNDie Datei konnte nicht gelscht werden.The file could not be removed.QObjectPDie Datei konnte nicht umbenannt werden.The file could not be renamed.QObjectbDie Gre der Datei konnte nicht gendert werden.The file could not be resized.QObject@Die Operation wurde abgebrochen.The operation was aborted.QObjectnDie Position in der Datei konnte nicht gendert werden..The position in the file could not be changed.QObject TrackTrackQObject"Unbekannte Fehler Unknown errorQObject><html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"><span style=" font-size:18pt; font-weight:600;">Traverso: Erste Schritte</span></p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">Eine aufgenommene oder importierte Audiodatei wird in einer der horizontalen Spuren des aktuellen Arbeitsbereiches angezeigt. Zahlreiche Funktionen knnen ber Tasten ausgewhlt werden, solange sich der Mauszeiger ber der Audiodatei befindet. Funktionen von Spuren knnen ebenfalls ber Tasten gewhlt werden, wenn sich der Mauszeiger ber einem leeren Bereich der Spur befindet.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">Eine Liste aller verfgbarer Funktionen kann ber die rechte Maustaste oder die Taste Q geffnet werden. Folgende Notation wird fr die verschiedenen Arten von Tastaturbefehlen verwendet:</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; K &gt; </span> drcke die K-Taste und lasse sie wieder los</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"><span style=" font-weight:600;">&lt;&lt; K &gt;&gt;</span> drcke die K-Taste zweimal nacheinander wie ein Doppelklick</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ K ]</span> drcke die K-Taste und halte sie gedrckt. Bewege die Maus whrend K gedrckt ist</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; KL &gt; </span> drcke K und L einmal gleichzeitig</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ KL ] </span> halte K und L gleichzeitig gedrckt und bewege die Maus</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">Einige der wichtigesten Funktionen:</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; SPACE &gt;</span> Wiedergabe starten/stoppen.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; SHIFT &gt;</span> positioniere die Abspielposition. (Senkrechte blaue Linie, die die aktuelle Abspielposition markiert.)</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; W &gt;</span> positioniert den Arbeits-Cursor (rote senkrechte Linie)</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; V &gt; </span> setzt die Abspielposition auf den Arbeits-Cursor</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ D ] </span> Verschieben von Objekten</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ Z ]</span> Vergrssern / Verkleinern</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ TAB ]</span> Sichtbaren Bereich verschieben (Scrollen) </p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">Einige Befehle fr Audio-Clips:</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ E ] </span> Linkes oder rechtes Ende verschieben</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ F ]</span> Lnge von Ein-/Ausblendung verndern.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ G ] </span> Lautstrke ndern</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; X &gt;</span> Clip in zwei Hlften teilen</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">Weiter Informationen sind im Handbuch zu finden.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p></body></html>

Traverso: Getting Started

When you record or import an audio file into Traverso, it shows up as an Audio Clip in one of the horizontal Tracks in the current Sheet. You can edit many aspects of these Clips by placing the mouse pointer over a Clip and pressing or holding different keys on your keyboard and mouse. You can also change settings of a Track, the Sheet as a whole, and other objects in the Sheet.

To see a list of what commands are available for any given object in the Sheet, move the mouse over that object, and Right-Click (or press Q). The keyboard shortcuts for each command are shown in the menu. The notation used is shown below.

< K > means press and release the K key. (Like a click.)

<< K >> means press the K key two times fast. (Like a double click.)

[ K ] means drag the mouse while holding down the K key.

< KL > means press the K and L keys at the same time.

[ KL ] means drag the mouse while holding down the K and L keys at the same time.

Here are some basic commands:

< SPACE > is Play/Stop.

< SHIFT > sets the Playhead. (Blue vertical line where playing starts.)

< W > sets the Work Cursor. (Red vertical line.)

< V > moves the Playhead back to the Work Cursor.

[ D ] move objects around (Audio Clip, Curve Nodes, etc)

[ Z ] zooms in and out.

[ TAB ] scroll omnidirectional (aka Shuttle)

And some Audio Clip Commands:

[ E ] drags a Clip's left or right edge.

[ F ] adjusts the length of a Clip's Fade In / Fade Out.

[ G ] addust the Gain of a clip (also works on Tracks, Sheet)

< X > splits the Clip at the cursor's position.

For more information, right-click on everything, or check out the Traverso manual.

QuickStartDialogTraverso: Getting StartedQuickStartDialogNDie Datei konnte nicht geffnet werden.Could not open file ReadSource<Die Datei enthlt keine SpurenFile has zero channels ReadSource.Ungltige Anzahl SpurenInvalid channel count ReadSource(No ReadSource-FehlerNo ReadSource error set ReadSource StilleSilence ReadSource,Datei existiert nicht!The file does not exist! ReadSource<html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">WAV</span> : Ein unkomprimiertes Format. Bentigt mehr Festplattenplatz als komprimierte Formate, belastet aber den Prozessor weniger.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Einschrnkungen: Aufnahmezeit auf ca 1.7 Stunden limitiert bei 44.1 KHz in Stereo.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">WavPack</span> : Ein verlustfrei komprimiertes Format, das die Dateigrsse gegenber WAV auf etwa die Hlfte reduziert. Verursacht deutlich mehr Prozessorbelastung, was aber mit modernen Computern kein Problem sein sollte.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ein komprimiertes Format reduziert die Zugriffe auf die Festplatte, und erlaubt daher das gleichzeitige Lesen von mehr Kanlen.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Einschrnkungen: Maximale Aufnahmezeit bei 44.1 kHz in Stereo ca. 5 Stunden.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">WAV64</span> : WAV-Format mit 64 bit Header (von anderen Programmen zum Teil noch nicht untersttzt!)</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Einschrnkungen: Keine, nahezu unlimitierte Aufnahmezeit.</p></body></html> k

WAV : A format without compression. Uses more hard disk space then compressed encoding formats, but needs very little cpu.

Limits : ~ 1.7 hours of recording time @ Stereo - 44.1 KHz

WavPack : A format with compression, up to 2 times smaller compared to WAV, and no quality loss. Uses significantly more cpu then WAV, but with modern (year 2005 and above) cpu's this shouldn't be a problem.

Using this format stresses the hard disk much less, increasing hard disk live, and less chance of saturating the hard disk bandwidth.

Limits : ~ 5 hours recording time @ Stereo - 44.1 KHz

WAV64 : WAV format with 64 bit header, support by other programs is currently limited.

Limits : None, thousands of hours of recording time, supposed that your hard disk can hold it.

RecordingConfigPage <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Diese Option reduziert den Speicherverbrauch von Fliesspunkt-Daten um bis zu 10%, indem es Informationen aus dem Audiosignal entfernt, die so gut wie keinen Einfluss auf die Qualitt haben.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Technisch gesehen wird die Kompression dadurch verlustbehaftet, aber die Vorteile der Fliesspunkt-Auflsung bleiben erhalten (&gt;600 dB Dynamikumfang, keine bersteuerung, 25 Bit Auflsung). </p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Bei Integer-Daten wird die Bit-Auflsung auf maximal 24 Bit reduziert.</p></body></html>B

This option reduces the storage of some floating-point data files by up to about 10% by eliminating some information that has virtually no effect on the audio data.

While this does technically make the compression lossy, it retains all the advantages of floating point data (>600 dB of dynamic range, no clipping, and 25 bits of resolution).

This also affects large integer compression by limiting the resolution to 24 bits.

RecordingConfigPage BesteBestRecordingConfigPage&KompressionsmethodeCompression typeRecordingConfigPagebQualitt der Samplerate-Konvertierung beim ExportDefault export resample qualityRecordingConfigPagefEchtzeit-Resampling aktivieren (nur bei Wiedergabe),Enable on the fly resampling (Playback only)RecordingConfigPageKodierformatEncoding formatRecordingConfigPageSchnellFastRecordingConfigPageFormularFormRecordingConfigPageHochHighRecordingConfigPage MittelMediumRecordingConfigPagebQualitt der Samplerate-Konvertierung in EchtzeitOn the fly resample qualityRecordingConfigPageAufnahme RecordingRecordingConfigPage0Samplerate-Konvertierung ResamplingRecordingConfigPagexberspringe WVX fr strkere Kompression (quasi-verlustfrei).Skip WVX for extra compression (semi-lossless)RecordingConfigPage WavPack-OptionenWavPack optionsRecordingConfigPageResourcesManager:: Konnte Readsource %1 nicht initialisieren (Grund: %2)CResourcesManager:: Failed to initialize ReadSource %1 (Reason: %2)ResourcesManagerEndeEndResourcesWidgetDateienFilesResourcesWidgetFormFormResourcesWidget LngeLengthResourcesWidgetNameNameResourcesWidgetQuellenSourcesResourcesWidget StartStartResourcesWidget--RestoreProjectBackupDialog2Aktuelles Datum und Zeit:Current date and time:RestoreProjectBackupDialog DatumDateRestoreProjectBackupDialog0Letzte Sicherheitskopie: Last backup:RestoreProjectBackupDialog.Backup wiederherstellenRestore from backup RestoreProjectBackupDialogrGeben Sie das Datum der gewnschten Sicherheitskopie ein.,Set the date to restore the selected backup.RestoreProjectBackupDialogZeitTimeRestoreProjectBackupDialogErscheinung AppearanceSettingsDialogAudiooptionen Audio OptionsSettingsDialogVerhaltenBehaviorSettingsDialogTastaturKeyboardSettingsDialog$Leistungsverhalten PerformanceSettingsDialogSpur hinzufgen Add TrackSheetxDer erste Frame des Exports liegt hinter dem letzten Frame!!3Export start frame starts beyond export end frame!!SheettEs soll eine WAVE-Datei mit 0 Kanlen geschrieben werden??/Export tries to render to 0 channels wav file??SheetZKonnte Schreibpuffer nicht rechtzeitig leeren#Failed to empty WriteBuffer in timeSheetTKonnte Lesepuffer nicht rechtzeitig fllen!Failed to fill ReadBuffer in timeSheet>Festplattenberlastung erkannt!Hard Disk overload detected!SheetBKeine Spur auf Aufnahme gestellt!No Tracks armed for recording!Sheet8Kein Knstlername festgelegtNo artists name setSheetKeine Audiodaten zu exportieren! (Sind alle Kanle stumm geschalten?)*No audio to export! (Is everything muted?)Sheet(Aufnahme in %n ClipsRecording to %n Clip(s)SheetSpur entfernen Remove TrackSheetUnbenanntUntitledSheet--SongInfoWidgetLautstrkeGainSongInfoWidget SMPTESMPTESongInfoWidgetEinrastenSnapSongInfoWidgetSongSongSongInfoWidget$Song-InformationenSongInfoWidgetSongInfoWidgetZoomZoomSongInfoWidget Hz HzSpectralMeterConfigWidgetS&chlieen&CloseSpectralMeterConfigWidget10241024SpectralMeterConfigWidget20482048SpectralMeterConfigWidget256256SpectralMeterConfigWidget40964096SpectralMeterConfigWidget512512SpectralMeterConfigWidget81928192SpectralMeterConfigWidgetErweitertAdvancedSpectralMeterConfigWidget.Erweiterte FFT OptionenAdvanced FFT OptionsSpectralMeterConfigWidgetAnwendenApplySpectralMeterConfigWidgetBlackmanBlackmanSpectralMeterConfigWidgetFFT Gre: FFT Size:SpectralMeterConfigWidget>Konfiguration des FFT-SpektrumsFFT-Spectrum ConfigurationSpectralMeterConfigWidgetFrequenzbereichFrequency RangeSpectralMeterConfigWidgetHammingHammingSpectralMeterConfigWidgetHanningHanningSpectralMeterConfigWidgetUntere Grenze: Lower Limit:SpectralMeterConfigWidget&Untere dB-Schwelle:Lower dB value:SpectralMeterConfigWidgetAnzahl Bnder:Number of bands:SpectralMeterConfigWidgetRechteck RectangleSpectralMeterConfigWidget:Durchschnitts-Spektrum zeigenShow average spectrumSpectralMeterConfigWidgetObere Grenze: Upper Limit:SpectralMeterConfigWidget$Obere dB-Schwelle:Upper dB value:SpectralMeterConfigWidget(Fensterungsfunktion:Windowing function:SpectralMeterConfigWidgetLDurchschnittliche dB-Kurve exportierenExport average dB curveSpectralMeterViewFFT: Aktivieren Sie die Durchschnittskurve mit < M > um Daten zu erfassen5FFT: Enable avarage curve with < M > to generate dataSpectralMeterViewFFT: Keine Durschnittskurve verwendet, keine exportfhigen Daten vorhanden!/FFT: No avarage curve used, not data to export!SpectralMeterViewZFFT: Keine Durchschnittswerte fr den Export!FFT: No avarage data to export!SpectralMeterViewrFFT: Konnte erfasstes Bild nicht auf Festplatte schreiben0FFT: Unable to write captured image to hard diskSpectralMeterViewAusgabeformat:Output format:SpectralMeterView.Schnappschuss DateinameScreen Capture file nameSpectralMeterView(Ausgabeformat whlenSelect output formatSpectralMeterViewClip aufteilen Split Clip SplitClip&SysteminformationenSystem InformationSysInfoToolBar(sp)- % - %SystemInfoWidget- GB- GBSystemInfoWidgetSoundkarteCard Name (na)SystemInfoWidget&SysteminformationenSystemInfoWidgetSystemInfoWidgetBit-TiefebitdepthSystemInfoWidgetPuffergrssebuffer size (na)SystemInfoWidgetAudio-Treiberdrivertype (na)SystemInfoWidgetBildimageSystemInfoWidget Latenz latency (na)SystemInfoWidgetRaterateSystemInfoWidget xruns xruns (na)SystemInfoWidget"Lesepuffer-StatusRead Buffer StatusSystemResources(Schreibpuffer-StatusWrite Buffer StatusSystemResources"Marker hinzufgen Add MarkerTimeLine Marker entfernen Remove MarkerTimeLine"Marker hinzufgen Add Marker TimeLineView,Mehrere Marker lschen Clear Markers TimeLineViewMarker ziehen Drag Marker TimeLineViewEndeEnd TimeLineViewPAlle Marker mssen erst gelscht werden.+You have to remove all other markers first. TimeLineViewClip hinzufgenAdd ClipTrackClip entfernen Remove ClipTrack(Andere stummschaltenSilence OthersTrackTrack: AudioClip mit der ID %1 in der Resourcendatenbank nicht gefunden!BTrack: AudioClip with id %1 not found in Resources database!TrackTrack Balance Track PanTrackPan"Track Balance: %1 Track Pan: %1TrackPanJGeben Sie einen neuen Track-Namen einEnter new Track name TrackViewTrack-NameSet Track name TrackViewTrack %1: %2 Track %1: %2 TrackViewAufnahmeRecordTransportConsoleWidgetHAufnahme in %1 Spuren, Kodierung: %2+Recording to %1 Tracks, encoding format: %2TransportConsoleWidget8Tracks auf Aufnahme schalten Arm TracksTraversoCommandsClip kopieren Copy ClipTraversoCommands RunterDownTraversoCommandsKante ziehen Drag EdgeTraversoCommands(Externe VerarbeitungExternal ProcessingTraversoCommands*Arbeitsbereich falten Fold SheetTraversoCommandsSpur falten Fold TrackTraversoCommandsGainGainTraversoCommands$Gain: Zurcksetzen Gain: ResetTraversoCommandsHorizontal HorizontalTraversoCommandsHorizontal rein Horizontal InTraversoCommandsHorizontal rausHorizontal OutTraversoCommands"Audio importieren Import AudioTraversoCommandsStille einfgenInsert SilenceTraversoCommands LinksLeftTraversoCommands Clip verschieben Move ClipTraversoCommandsDClip verschieben oder Gre ndernMove Or Resize ClipTraversoCommandsNeuer Track New TrackTraversoCommandsOmnidirektionalOmnidirectionalTraversoCommandsPanoramaPanoramaTraversoCommands,Panorama: ZurcksetzenPanorama: ResetTraversoCommandsClip entfernen Remove ClipTraversoCommandsTrack entfernen Remove TrackTraversoCommands RechtsRightTraversoCommandsAufteilenSplitTraversoCommandsHochUpTraversoCommandsVertikalVerticalTraversoCommandsVertikal rein Vertical InTraversoCommandsVertikal raus Vertical OutTraversoCommandstraverso-0.49.4/resources/translations/traverso_pt.qm000644 001750 001750 00000000145 11430303020 023403 0ustar00remonremon000000 000000 AddRemoveClip Remove Clip Clip entfernen Remove Selected Clips AlsaDevicesPage Form Form ALSA Device ALSA Gerät <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Device:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The real or virtual ALSA device to be used.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A real device is the audiocard installed in your system.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A virtual device is one created in the .asoundrc file, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">often located in your home folder.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If unsure, use either the default device, this will use the audiodevice </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">configured by your distribution, or the device that names your audio card.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">In the latter case, please make sure no application uses the audiocard, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">else the driver won't be able to initialize!</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">For more info see chapter 3.1: "The Driver Backend" of the User Manual</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Gerät:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Das echte oder virtuelle benutzte ALSA-Gerät.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ein echtes Gerät ist eine im System installierte Soundkarte.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Virtuelle Geräte wurden in der Datei .asoundrc definiert, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">welche sich häufig im Benutzerordner befindet.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Im Zweifel können Sie das entweder Standardgerät benutzen - dieses wurde </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Distribution festgelegt - oder Sie wählen einen Namen aus der Liste.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Im letzteren Fall vergewissern Sie sich, dass das Gerät nicht verwendet wird. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Der Treiber könnte dann nicht initialisiert werden!</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Weitere Informationen finden Sie in Kapitel 3.1: "Das Treiber-Backend" des Benutzerhandbuches</p> </body></html> Device Gerät <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Number of Periods:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Audio is managed in small chunks called periods. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This value determines how many of these chunks are </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">to be used by the driver of the audiocard.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The default should work just fine, and gives optimal latency behavior.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">However, some (buggy) alsa drivers don't work correctly </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">with the default of 2, if you experience very choppy audio, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">please try to use 3 periods.</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Zahl der Perioden:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Audio wird in kleinen Abschnitten verwaltet, die Perioden heissen. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Dieser Wert bestimmt, wie viele dieser Abschnitte </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">vom Treiber der Soundkarte verwendet werden</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">In der Regel sind die Standard-Einstellungen optimal in Funktion und Latenz.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Dennoch funktionieren einige ALSA-Treiber nicht richtig</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">mit der Einstellung 2. Wenn Ihr Ton ruckelt, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">versuchen Sie es bitte mit 3 Perioden.</p></body></html> Nr. of periods Anzahl Perioden 2 2 3 3 <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Dither is used to make the audio cleaner. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The best way to describe it is to imagine a painting with many dots. If you view it up close you can see each dot and the image is not very clear. If you view it from far away the image becomes clearer because your eyes/brain dither the dots to smooth out the image. It is a murky subject and obviously a very personal choice as to what dither is the best. For most people it is just plain magic. Anyone running at 16bit who cares about quality or has CPU cycles to spare should run with dither. Triangular is probably the best compromise of quality vs cpu cost (its very fast), but shaped is the best</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Dither verbessert die Audioqualität bei Format-Konvertierungen. </p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Um die Funktionsweise von Dither zu erklären, stellt man sich am besten ein digitales Bild vor, das aus einzelnen Bildpunkten zusammengesetzt ist. Aus der Nähe sieht das Bild unscharf und unruhig aus. Ab einer bestimmten Entfernung ist das Auge nicht mehr in der Lage, die einzelnen Punkte aufzulösen, das Punktemuster verschwimmt und das eigentliche Bild tritt klarer hervor. Auf Audiosignale bezogen ist Dither ein sehr leises zufälliges Rauschen, das dem digitalen Signal beigemischt wird. Dadurch wird die digitale Rasterung des Signals verwischt und Artefakte, wie sie bei sehr leisen oder stark untersteuerten Passagen auftreten können, werden verringert. Bei hohen Bit-Auflösungen (24, 32-Fliesskomma) ist die Rasterung des Audiosignals so fein, dass Dither kaum eine hörbare Verbesserung bringt. Bei Reduktion auf 16 Bit (z.B. beim Export für eine CD oder beim Abspielen über eine 16-Bit Soundkarte) empfiehlt sich aber auf jeden Fall, Dither zu aktivieren. Welche Art von Dither am angenehmsten klingt, ist eine Frage des Geschmacks. "Triangular" ist ein guter Kompromiss zwischen Qualität und Prozessorbelastung. Sehr gute Qualität bei hoher Prozessorbelastung bietet "shaped". </p></body></html> Dither Dither None Kein Shaped Shaped Rectangular Rechteckig (Rectangular) Triangular Dreieckig (Triangular) AlsaDriver ALSA Driver: The playback device %1 is already in use. Please stop the application using it and run Traverso again ALSA Treiber: Das Wiedergabegerät %1 ist bereits in Verwendung. Bitte stoppen Sie das entsprechende Programm und starten Sie Traverso erneut ALSA Driver: You do not have permission to open the audio device %1 for playback ALSA Treiber: Sie haben nicht die Berechtigung, das Audio-Gerät %1 als Wiedergabegerät zu verwenden snd_pcm_open(playback_handle, ..) failed with unknown error type snd_pcm_open(playback_handle, ..) mit einem unbekannten Fehler fehlgeschlagen ALSA Driver: The capture device %1 is already in use. Please stop the application using it and run Traverso again ALSA Treiber: Das Aufnahme-Gerät %1 ist bereits in Verwendung. Bitte stoppen Sie das entsprechende Programm und starten Sie Traverso erneut ALSA Driver: You do not have permission to open the audio device %1 for capture ALSA Treiber: Sie haben nicht die Berechtigung, das Audio-Gerät %1 als Aufnahmegerät zu verwenden ALSA Driver: snd_pcm_open(capture_handle, ...) failed with unknown error type snd_pcm_open(playback_handle, ..) mit einem unbekannten Fehler fehlgeschlagen ALSA Driver: Cannot open PCM device %1 for playback. Falling back to capture-only mode ALSA Treiber: Kann das PCM Gerät %1 nicht als Wiedergabe-Gerät öffnen. Verwende den Aufnahme-Exklusiv-Modus ALSA: Cannot open PCM device %1 for capture. Falling back to playback-only mode ALSA Treiber: Kann das PCM Gerät %1 nicht als Aufnahme-Gerät öffnen. Verwende den Wiedergabe-Exklusiv-Modus ALSA Driver: Unable to configure hardware, is it in use by another application? ALSA Treiber: Es war nicht möglich, die Hardware zu konfigurieren. Wird sie vielleicht gerade von einer anderen Anwendung benutzt? AppearenceConfigPage Icons only Text only Text beside Icons Text below Icons Default Language Select default project dir Standard-Projektordner wählen Form Theme Theme selector Motiv wählen Path to theme files Pfad zu den Motiv-Dateien Available themes Vorhandene Motive Adjust theme color Motiv-Farbe anpassen Theme Options Motiv-Optionen Paint audio rectified Audio ausgerichtet zeichnen <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Painting the waveform with an outline is more detailed, but requires more cpu.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If you experience slowness when painting many clips, or during animated scroll, unselect this option!</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Zeichnen der Wellenform mit einer Umrisslinie ist etwas langsamer, aber zeigt mehr Details.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Deaktivieren Sie diese Option wenn die Darstellung mit vielen Clips oder beim Scrollen langsam wird.</p></body></html> Paint audio with outline Umrisslinie um Wellenformen zeichnen Paint stereo audio as mono audio Stereo-Dateien als einen Kanal zeichnen Draw lines at 0 and -6 dB Style Options Stil-Optionen Select style Stil wählen Use selected style's palette Toolbars Icon size Button style Transport Console size Language Interface Language Changing the language of the Interface will take effect after restarting Traverso! ArmTracks Arm Tracks Tracks auf "Aufnahme" schalten AudioClip Unable to Record to Track Kann nicht auf Track aufnehmen AudioDevice doesn't have this Capture Bus: %1 (Track %2) Dieser Aufnahmebus existiert nicht: %1 (Track %2) Normalization Normalisieren Set Normalization level: Normalisieren auf Level: Toggle Mute Stummschaltung an/ausschalten Toggle Lock Sperre an-/ausschalten Remove Fades Entferne Ein-/Ausblenden AudioClip: Normalize AudioClipEditDialog Dialog Dialog Clip Parameters Clip-Einstellungen External Processing Externe Bearbeitung hh:mm:ss.sss hh:mm:ss.sss TextLabel TextLabel End Ende Length Länge Track start Track-Anfang Gain Volumen Name Name Fades Fades Fade In Fade In Mode Modus Bending Gebogen (Bending) Strength Stärke (Strength) &Linear &Linear &Default &Zurücksetzen Fade Out Fade Out Source AudioClipExternalProcessing Clip: External Processing Clip: Externe Verarbeitung AudioClipManager Selection: Add Clip Auswahl: Clip einfügen Selection: Remove Clip Auswahl: Clip entfernen Selection: Invert Auswahl: Umkehren AudioClipView Click to reset AudioFile ! Klicken um Audio-Datei zurückzusetzen ! Reset Audio File for Clip: %1 Audio-Datei zurücksetzen für Clip: %1 All files (*);;Audio files (*.wav *.flac) Alle Dateien (*);;Audiodateien (*.wav, *.flac) No file selected! Keine Datei ausgewählt! Succesfully set AudioClip file to %1 AudioClip Datei erfolgreich auf %1 gesetzt AudioDevice No Driver Loaded Kein Treiber geladen No Device Configured Kein Gerät konfiguriert The Jack server has been shutdown! Der Jack Server wurde beendet! AudioDevice:: Buffer underrun 'Storm' detected, switching to Null Driver AudioDevice: Puffer-Leerlauf in kurzer Folge mehrfach erkannt, wechsele zum Null-Treiber AudioDevice:: For trouble shooting this problem, please see Chapter 11 from the user manual! AudioDevice: Um dieses Problem zu beheben, lesen Sie Kapitel 11 im Benutzerhandbuch! Audiodevice: Failed to create the Jack Driver Audiogerät: Jack-Treiber konnte nicht erstellt werden Audiodevice: Failed to create the ALSA Driver Audiogerät: ALSA-Treiber konnte nicht erstellt werden Audiodevice: Failed to create the PortAudio Driver Audiogerät: PortAudio-Treiber konnte nicht erstellt werden Audiodevice: Failed to create the PulseAudio Driver Audiogerät: PulseAudio-Treiber konnte nicht erstellt werden Audiodevice: Failed to create the CoreAudio Driver AudioDeviceThread Unable to set Audiodevice Thread to realtime priority!!!This most likely results in unreliable playback/capture and lots of buffer underruns (== sound drops).In the worst case the program can even malfunction!Please make sure you run this program with realtime privileges!!! Konnte den Audiogeräte-Prozess nicht auf Echtzeit-Priorität setzen! Das wird vermutlich unzuverlässige Aufnahme, Wiedergabe und eine Menge Puffer-Leerläufe (== Aussetzer) verursachen. Schlimmstenfalls kann es Fehlfunktionen im Programm geben! Bitte stellen Sie sicher, dass Sie das Programm mit Echtzeit-Priorität starten! AudioDriverConfigPage System default Form Driver Selection Treiber-Auswahl Driver: Treiber: Configure driver Treiber konfigurieren <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Duplex mode:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Defines if both the Playback and Capture buses </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">of your soundcard are to be used, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">or only the Playback or Capture bus(es).</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Duplex Modus:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Definiert ob beide - der Wiedergabe- und Aufnahmebus </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">der Soundkarte - benutzt werden.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">oder nur der Wiedergabe- oder Aufnahmebus </p></body></html> Duplex mode Duplex-Modus Full Voll Playback Wiedergabe Capture Aufnahme <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Sample rate:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The sample rate used by the audio card.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">New projects will use this samplerate as </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">the project's sample rate on creation.</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Sample-Frequenz:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Die von der Soundkarte zu benutzende Sample-Frequenz.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Neue Projekte werden diese Sample-Frequenz</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">beim Erstellen als Standard benutzen.</p></body></html> Sample rate Sample-Frequenz 22050 22050 32000 32000 44100 44100 48000 48000 88200 88200 96000 96000 <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Buffer latency:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The latency introduced by the size of the audio buffers.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Some people need low latencies, if you don't need it, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">or don't know what it means, please leave the default setting!</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Puffer Latenz:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Die durch die Grösse des Audio-Puffers verursachte Latenz.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Einige Leute brauchen sehr geringe Latenzen. Sollten Sie diese nicht brauchen,</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">oder nicht wissen, was das bedeutet, behalten Sie bitte den Standard bei!</p> </body></html> Buffer latency (ms) Puffer Latenz (ms) Restart Driver Treiber neu starten Jack Jack Enable Jack transport control Jack Transport Control aktivieren AudioSourcesManagerWidget Form Form AudioSources Audioquellen Remove sources Quellen löschen Remove source Quelle löschen Remove all sources Alle Quellen löschen Remove unused sources Ungenutzte Quellen löschen BehaviorConfigPage Form Form Project Settings Projekt-Einstellungen Load last used project at startup Zuletzt geladenes Projekt beim Programmstart laden Ask Fragen Don't save Nicht speichern New Sheet Settings Einstellungen für neue Arbeitsbereiche Playback Settings Wiedergabe-Einstellungen <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Keep the play cursor in view while playing or recording.</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Wiedergabe-Cursor bei der Aufnahme und Wiedergabe im Blickfeld halten.</p></body></html> Scroll playback Bei Wiedergabe scrollen Jump Springen Stay Centered Mittig halten Animated Animiert Continuously adjust audio while dragging Änderungen beim Ziehen kontinuierlich anwenden Lock Audio Clips by default Audioclips automatisch sperren Audio Clip Settings Audioclip Einstellungen On close: Beim Beenden: Save Speichern Number of tracks BusSelectorDialog Bus Selector Bus Auswahl Track Track Capture Buses Aufnahme-Busse Channels Kanäle Both Beide Left Links Right Rechts Playback Buses Abspielkanäle CDWritingDialog Information Information CD Writing CD brennen General Options Allgemeine Einstellungen Write current Sheet Brenne den aktuellen Arbeitsbereich Write all Sheets Brenne alle Arbeitsbereiche Calculate and apply normalization Normalisierung berechnen und anwenden Export wav and toc files only (don't write CD) Exportiere nur das CD-Abbild (CD wird nicht gebrannt) Burning Device Brenn-Laufwerk Number of copies Anzahl Kopien Simulate Simulation Speed Geschwindigkeit auto Automatisch 1x 1x 2x 2x 4x 4x 8x 8x 12x 12x 16x 16x 20x 20x 24x 24x 28x 28x 32x 32x 36x 36x 40x 40x 44x 44x 48x 48x Status Status Start Writing Brennvorgang starten Abort Abbrechen Close Schliessen ClipSelection Selection: Remove Clip Auswahl: Clip entfernen Selection: Add Clip Auswahl: Clip hinzufügen Select Clip Clip auswählen ClipsViewPort Import %n audiofile(s) %n Audiodateien importieren Crop AudioClip: Magnetic Cut Curve Add CurveNode Kurvenpunkt hinzufügen Remove CurveNode Kurvenpunkt entfernen There is allready a node at this exact position, not adding a new node An dieser Stelle existiert schon ein Knotenpunkt. Füge keinen neuen hinzu. CurveView Drag Node Punkt ziehen Clear Nodes Lösche Knotenpunkte Dialog Dialog Dialog OK OK Cancel Abbruch DigitalClock Digital Clock Digitale Uhr DriverInfo Change Audio Device settings Audio-Geräteeinstellungen ändern ExportDialog Export Export General Options Allgemeine Einstellungen Export current Sheet Exportiere den aktuellen Arbeitsbereich Export all Sheets Exportiere alle Arbeitsbereiche Export directory Exportverzeichnis Export status Exportstatus - - Abort Export Export abbrechen Start Export Export starten Close Schliessen ExportFormatOptionsWidget Best Beste High Hoch Medium Mittel Fast Schnell Bitrate Average Bitrate Mittlere Bitrate Maximum Bitrate Maximale Bitrate Export Format Options Format Options Formateinstellungen Encoding Kodierung File Type Dateityp Channels Kanäle Normalize Audio Audiosignal normalisieren Bitdepth Sampleauflösung WavPack options (lossless compression) WavPack-Optionen (verlustfreie Kompression) Compression type Kompressionsmethode <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This option reduces the storage of some floating-point data files by up to about 10% by eliminating some information that has virtually no effect on the audio data. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">While this does technically make the compression lossy, it retains all the advantages of floating point data (&gt;600 dB of dynamic range, no clipping, and 25 bits of resolution). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This also affects large integer compression by limiting the resolution to 24 bits.</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Diese Option reduziert den Speicherverbrauch von Fliesspunkt-Daten um bis zu 10%, indem es Informationen aus dem Audiosignal entfernt, die so gut wie keinen Einfluss auf die Qualität haben.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Technisch gesehen wird die Kompression dadurch verlustbehaftet, aber die Vorteile der Fliesspunkt-Auflösung bleiben erhalten (&gt;600 dB Dynamikumfang, keine Übersteuerung, 25 Bit Auflösung). </p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Bei Integer-Daten wird die Bit-Auflösung auf maximal 24 Bit reduziert.</p></body></html> Skip WVX for extra compression (semi-lossless) Überspringe WVX für stärkere Kompression (quasi-verlustfrei) Ogg Options Ogg-Optionen Quality (Smallest <-> Best) Qualität (kleine Datei <-> gute Qualität) Encoding Method Kodiermethode MP3 Options MP3-Optionen Minimum Bitrate Minimale Bitrate Quality (Fastest <-> Best) Qualität (schnell <-> gute Qualität) Sample Rate Samplefrequenz Conversion quality Qualität der Konvertierung ExternalProcessingDialog You have to supply an argument before starting the external process! Sie müssen ein Argument angeben, bevor Sie die externe Bearbeitung starten! Available arguments for the sox program Für das sox-Programm verfügbare Parameter Program <b>%1</b> not installed, or insufficient permissions to run! Das Programm <b>%1</b> ist nicht installiert oder Ihnen fehlt die zum Ausführen notwendige Berechtigung! Program <b>%1</b> crashed! Programm <b>%1</b> ist abgestürzt! FadeBend Fade In: bend Einblenden: Biegung Fade Out: bend Ausblenden: Biegung FadeCurve Fade Preset Voreinstellungen für Ein-/Ausblenden FadeMode Fade In: shape Einblenden: Form Fade Out: shape Ausblenden: Form FadeRange Fade In: length Einblenden: Länge Fade Out: length Ausblenden: Länge Fade In: remove Einblenden: Entfernen Fade Out: remove Ausblenden: Entfernen FadeStrength Fade In: strength Einblenden: Stärke Fade Out: strength Ausblenden: Stärke FileWidget My Computer Mein Computer My Documents Meine Dokumente Parent Directory Nächst höheres Verzeichnis Refresh File View Dateiansicht aktualisieren Import Import audio source Audioquelle importieren Import Audio File Audiodatei importieren Insert Silence Stille einfügen Silence Stille All files (*) Alle Dateien (*) Audio files (*.wav *.flac *.ogg *.mp3 *.wv *.w64) Audio-Dateien (*.wav *.flac *.ogg *.mp3 *.wv *.w64) ImportClipsDialog Import Audio Clips Import to Track: Add Markers InputEngine Modifier key actions are not supported from Context Menu Modifiziertasten-Aktionen sind aus dem Kontextmenü heraus nicht möglich Hold actions are not supported from Context Menu Halte-Aktionen sind aus dem Kontextmenü heraus nicht möglich Command Plugin %1 not found! Command Plugin %1 nicht gefunden! Plugin %1 doesn't implement Command %2 Plugin %1 setzt Befehl %2 nicht um InsertSilenceDialog Insert Silence Stille einfügen Insert Silence (seconds): Stille einfügen (Sekunden): Interface History Verlauf About Traverso Über Traverso &Save &Speichern &Quit &Beenden &About Traverso &Alles über Traverso Correlation Meter Korrellationsgrad-Anzeige FFT Spectrum FFT Frequenzspektrum Resources Bin Materialsammlung &Project &Projekt &New... &Neu... &Open... &Oeffnen... &Manage Project... Projekt&manager... &Export... &Export... &Sheet &Arbeitsbereich New &Track(s)... Neue &Spur(en)... New &Sheet(s)... Neuer &Arbeitsbereich... Import &Audio... &Audio-Import... Insert Si&lence... Sti&lle einfügen... &View &Ansicht System Information Systeminformationen Se&ttings Eins&tellungen &Preferences... &Einstellungen... <b>Description</b> <b>Beschreibung</b> <b>Key Sequence</b> <b>Tastenfolge</b> Marker Editor... Markierungseditor... Traverso %1 (built with Qt %2) A multitrack audio recording and editing program. Look in the Help menu for more info. Traverso is brought to you by R. Sijrier and others, including all the people from the Free Software world who contributed the important technologies on which Traverso is based (Gcc, Qt, Xorg, Linux, and so on) Traverso %1 (kompiliert gegen Qt %2) Ein Multi-Track Audio Recording- und Editing-Programm. Schauen Sie ins Hilfe-Menü für weitere Informationen. Traverso wird ihnen von R Sijrier und vielen Anderen zur Verfügung gestellt. Fallen viele Leute aus der Welt der freien Software, die zu den Technologien beigetragen haben, auf denen Traverso basiert. (Gcc, Qt, Xorg, Linux, und so weiter...) &Getting Started Der Einstie&g &User Manual Ben&utzerhandbuch Opening User Manual in external browser! Öffne Benutzerhandbuch in externem Browser! &CD Writing... &CD schreiben... &Restore Backup... &Backup wiederherstellen... &Recording File Format &Format der Aufnahmedateien Traverso - Important Traverso - Wichtig A Project directory changed outside of Traverso. This is NOT supported! Please undo this change now! If you want to rename a Project, use the Project Manager instead! Ein Projekt-Verzeichnis wurde außerhalb von Traverso geändert. Dies wird NICHT unterstützt! Bitte machen Sie diese Änderung schnell rückgängig! Verwenden Sie zum Ändern eines Projektnamens stattdessen bitte den Projekt-Manager! Traverso - Project load failed Traverso - Laden des Projektes fehlgeschlagen The requested Project `%1` could not be loaded for the following reason: '%2' You will now be given a list of available backups (if any) to restore the Project from. Das Projekt '%1' konnte nicht geladen werden. Begründung: '%2' Falls Backups bestehen, haben Sie nun die Möglichkeit, ein solches zu öffnen. Changed encoding for recording to %1 Kodierung für Aufnahme in %1 wurde geändert &Resample Quality &Qualität der Samplerate-Konvertierung Changed resample quality to: %1 Ändere Qualität der Samplerate-Konvertierung auf: %1 &Edit Undo Rückgängig Redo Wiederholen &Snap Einra&sten Snap items to edges of other items while dragging. Objekte beim Ziehen an Kanten anderer Objekte einrasten. S&croll Playback Wiedergabe S&crollen Keep play cursor in view while playing or recording. Wiedergabecursor bei Aufnahme/Wiedergabe im Blickfeld halten. &Show Effects Effekte &anzeigen Show effect plugins and automation curves on tracks Transport Console Project Projekt Edit Best Beste High Hoch Medium Mittel Fast Schnell &Help Open Audio Files Audio files (*.wav *.flac *.ogg *.mp3 *.wv *.w64) Audio-Dateien (*.wav *.flac *.ogg *.mp3 *.wv *.w64) %1: %2 JackDriver Jack Driver: Couldn't connect to the jack server, is jack running? Jack Treiber: Konnte nicht mit Jack-Server verbinden. Läuft ein Jack Server? Jack Driver: Connected successfully to the jack server! Jack Treiber: Erfolgreich mit Jack verbunden! KeyboardConfigPage No description set for this keymap Es existiert keine Beschreibung für diese Tastenbelegung Form Formular Configure Keyboard Tastatur konfigurieren <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Double fact timeout:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The maximum time in miliseconds between 2 key presses </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">to determine if the 2 key presses are a double fact ( &lt;&lt; K &gt;&gt; or &lt;&lt; KK &gt;&gt;)</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> or 2 individual key presses ( a &lt; K &gt; and &lt; K &gt; action, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">or &lt; KK &gt; and &lt; KK &gt; action for example).</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Experienced users can set this value as low as 150 ms, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">if you don't have much experience yet, please leave the default of 180 ms.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">For more information, see chapter 7: Key Actions. of the User Manual</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Double fact timeout:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Maximale Zeit zwischen 2 Tastendrücken </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">um zu bestimmen, ob diese 2 Tastendrücke ein double fact sind ( &lt;&lt; K &gt;&gt; oder &lt;&lt; KK &gt;&gt;)</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> oder 2 einzelne Tastendrücke ( eine &lt; K &gt; und &lt; K &gt; Aktion, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">oder eine &lt; KK &gt; und &lt; KK &gt; Aktion zum Beispiel).</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Erfahrene Benutzer können hier bis auf 150ms herab gehen, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">weniger Erfahrene sollten es bei 180 ms belassen.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mehr Informationen finden Sie in Kapitel 7: Tastaturbefehle des Benutzerhandbuches.</p></body></html> <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Bitstream Vera Sans; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Double fact timeout (ms)</p></body></html> <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Bitstream Vera Sans; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Timeout für Doppelklick-Tastaturbefehle (ms)</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Hold timeout:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The maximum time to consider a pressed key a hold key fact, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">like [ K ] or [ KK ].</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The shorter this time, the sooner a pressed key will be </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">detected as a hold action. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Experienced users can set this value as low as 110 ms, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">if you don't have much experience yet, please leave the default of 150 ms.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">For more information, see chapter 7: "Key Actions" of the User Manual.</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Timeout für Halten:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Die Zeitgrenze, um einen Tastendruck als Halten zu interpretieren, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">wie [ K ] oder [ KK ].</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Je kürzer diese Zeit ist, um so eher wird ein Tastendruck </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">als Halten-Aktion interpretiert. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Erfahrene Benutzer werden mit 110ms gut zurecht kommen, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">weniger erfahrene sollten es bei eta 150ms belassen.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Weitere Informationen in Kapitel 7: "Tasten-Aktionen" des Benutzerhandbuches.</p> </body></html> <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Bitstream Vera Sans; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Hold timeout (ms)</p></body></html> <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Bitstream Vera Sans; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Timeout für Halten (ms)</p></body></html> Keymap Tastenbelegung Select keymap Tastenbelegung wählen KeyMap Export Tastenbelegung exportieren The exported keymap can be found here: %1 Die exportierte Tastaturbelegung wurde unter %1 gespeichert. Export Keymap Tastenbelegung exportieren Print Keymap Tastaturbelegung drucken LanguageName English The name of this Language, e.g. German would be Deutch Deutch MarkerDialog Markers Markierungen Position Position Title Titel Options Optionen ISRC: ISRC: Apply to all Auf alle anwenden ... ... Pre-Emphasis Preemphasis Copy protection Kopierschutz Position: (MM:SS:75ths) Position: (MM:SS:75stel) CD-Text CD-Text Title: Titel: Performer: Interpret: Composer: Komponist: CD-Text optional CD-Text optional Arranger: Arrangeur: Message: Nachricht: &Remove Entfe&rnen &Export &Export Songwriter &Ok &Cancel MoveClip Copy Clip Clip kopieren Move Clip Clip verschieben Move Clip To Start Clip an den Anfang bewegen Move Clip To End Clip an das Ende verschieben Fold Sheet Arbeitsbereich falten Fold Track Spur falten Fold Markers MoveEdge Move Clip Edge Clip-Kante verschieben NewProjectDialog You must supply a name for the project! Es muss ein Projektname angegeben werden! Traverso - Question Traverso - Frage The Project "%1" already exists, do you want to remove it and replace it with a new one ? Ein Projekt namens "%1" existiert bereits. Wollen Sie es löschen und durch ein neues ersetzen? Yes Ja No Nein Couldn't create project (%1) Fehler beim Erstellen des Projektes (%1) New Project Neues Projekt Name Name Description Beschreibung Engineer Tontechniker Tracks per Sheet Spuren pro Arbeitsbereich Use Template Vorlage verwenden Open Audio Files Audio files (*.wav *.flac *.ogg *.mp3 *.wv *.w64) Audio-Dateien (*.wav *.flac *.ogg *.mp3 *.wv *.w64) Import Audio Files Empty Project ... ... Track Name File Copy files to project directory Number of Sheets Anzahl Sheets NewSheetDialog I can't create a new Sheet if there is no Project loaded!! Es kann kein neuer Arbeitsbereich erstellt werden wenn kein Projekt geladen wurde!! Added %n Sheet(s) %n neue Arbeitsbereiche hinzugefügt New Sheet(s) Neue Arbeitsbereiche New Sheet name Name für neuen Arbeitsbereich Sheet count Anzahl Arbeitsbereiche Track count Anzahl Spuren Use Template Vorlage verwenden NewTrackDialog I can't create a new Track if there is no Project loaded!! Es kann kein Track hinzugefügt werden, wenn kein Projekt geladen ist!!! Added %n Track(s) %n Tracks hinzugefügt New Track(s) Neue Tracks Track name Track Name Track count Track-Anzahl OpenProjectDialog Description: Beschreibung: Created on: Erstellt am: No Project selected! Kein Projekt ausgewählt! Select a project and click the 'Load' button again Wählen Sie ein Projekt und drücken Sie erneut den Button 'Laden' Project does not exist! (%1) Das Projekt existiert nicht! (%1) You must supply a name for the project! Es muss ein Projektname angegeben werden! Traverso - Question Traverso - Frage Are you sure that you want to remove the project %1 ? It's not possible to undo it ! Wollen sie das Projekt "%1" wirklich entfernen? Diese Aktion kann nicht rückgängig gemacht werden! Choose an existing or create a new Project Directory Wählen sie ein existierendes Projektverzeichnis, oder erstellen Sie ein neues Traverso - Warning Traverso - Warnung Unable to create Project directory! Konnte Projektordner nicht anlegen! Please check permission for this directory: %1 Bitte überprüfen Sie die Berechtigungen für das Verzeichnis %1 Traverso - Information Traverso - Information Created new Project directory for you here: %1 Ein neues Projektverzeichnis wurde erstellt: %1 Open Project Projekt öffnen Selected Project Ausgewähltes Projekt Load Laden Delete Löschen Select Project Dir Projektverzeichnis wählen <p>Project directory name <b>%1</b> is different from the Project title <b>%2</b>!</p><p>Did you rename the Project directory ? </p><p>Please rename the directory back to the Project title <b>%1</b>, and change the Project title with the Project Manager Dialog!</p> <p>Projekt-Verzeichnis <b>%1</b> unterscheidet sich vom Projekttitel <b>%2</b>!</p><p>Haben Sie das Projektverzeichnis umbenannt?</p><p>Bitte benennen Sie das Projektverzeichnis zurück in den Projektnamen <b>%1</b> und ändern Sie den Projektnamen im Projekt-Manager-Dialog!</p> Project %1 does not exist, did you rename or remove the directory what that name ? Projekt %1 existiert nicht. Haben Sie das dazugehörige Verzeichnis umbenannt oder gelöscht? Please check permission for this directory or choose another one: %1 Bitte überprüfen Sie die Berechtigungen für dieses Verzeichnis, oder wählen Sie ein anderes: %1 This directory is not writable by you! Dieses Verzeichnis kann nicht geschrieben werden! PADriver PADriver:: PortAudio error: %1 PADriver:: PortAudio Fehler: %1 PADriver:: hostapi %1 was not found by Portaudio! PADriver:: hostapi %1 wurde von PortAudio nicht gefunden! PaDriverPage Form Form Portaudio drivers PortAudio Treiber <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">PortAudio Driver:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The driver which should drive the PortAudio backend</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">PortAudio supports many driver backends, some of which Traverso has native support for too. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It is recommended to use Traverso's native drivers instead of using PortAudio's, however, if the native drivers give problems, you might try the ones supplied by PortAudio instead!</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">PortAudio provides transparent driver support for multiple platforms, including Windows (see the wmme, direct x and asio options), and Mac OS X (see the CoreAudio and jack options)</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">PortAudio Treiber:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Der Treiber für das PortAudio Backend</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">PortAudio unterstützt viele Treiber-Backends von denen Traverso einige auch selbst unterstützt. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Es wird empfohlen, wenn möglich die Traverso-eigenen Treiber zu benutzen. Solle es Probleme geben, ist ein Versuch mit PortAudio jedoch eine gute Idee.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">PortAudio bietet transparente Unterstützung für verschiedene Platformen. Unter anderem Windows (beachten Sie wmme, DirectX und asio Optionen) und Mac OS X (beachten Sie CoreAudio and jack Optionen)</p> </body></html> Driver Treiber PerformanceConfigPage Form Formular Painting Zeichnen <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The number of times per second at which the Graphical</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Items are repainted during a jog action, like moving an</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">AudioClip, or changing the Gain.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The default frames per second of 35 is a perfect compromise </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">between smooth painting, and low cpu usage.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">However, if you find the painting to be not smooth enough,</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">change this value to a higher one, but keep in mind that it</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">will consume considerably more cpu!</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If for example moving an AudioClip still takes to much cpu,</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">you should consider to lower this value.</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Legt fest, wie oft bei einer Jog-Aktion die Elemente neu</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">gezeichnet werden. Beispiele waeren das Bewegen eines</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Audio-Clip oder eine Gain-Änderung.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Standard ist hier 35. Dies ist ein guter Kompromiss zwischen</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">einer angenehmen Ansicht und vertretbarer Last.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Sollte die Anzeige dennoch nicht fluessig genug sein,</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">erhöhen Sie den Wert. Behalten Sie allerdings im Hinterkopf,</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">dass dies ihre CPU spürbar mehr beansprucht!</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Andersherum kann ein senken des Wertes sinnvoll sein,</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">wenn es z.B. Leistungsprobleme beim verschieben eines Clips gibt.</p></body></html> Jog repaint speed (fps) Jog Neuzeichnungsrate (fps) <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Accelerates the painting of AudioClips and Tracks by using</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">the 3D engine of your graphics card.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Depending on your graphics card and driver support, this </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">can speed up painting considerably!</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Beschleunigt die Anzeige von Clips und Tracks durch</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">die im System vorhandende Grafikhardware.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Abhängig von der Karte und den Treibern kann dies die Anzeige </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">auf grandiose Weise beschleunigen!</p></body></html> Use hardware acceleration Hardwarebeschleunigung verwenden Audio file buffering Audio-Datei puffern <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Read buffer size:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The amount of audio data that can be stored in the </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">read buffers in seconds.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The default value of 1 second should do just fine.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">However, if you're tight on memory, you can make this value lower.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If you experience buffer underruns when the hard disk bandwidth is </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(almost) saturated, or when buffer underruns happen regularly due </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">the hard disk can't keep up for some reason, you can try a larger </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">value, like 1.5 or 2.0 seconds.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Keep in mind that when using a larger buffer, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">it will take considerably more time to move (i.e. seeking) </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">the playhead to another positions, since all the buffers </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(one for each audioclip * channel count) need to be refilled!</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head> <body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Größe des Lese-Puffers:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Die Menge an Audio-Daten, die in den Lese-Puffern</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">gespeichert werden kann (in Sekunden)</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Der Standard von einer Sekunde sollte gut funktionieren.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Wenn es allerdings an Speicher mangelt, kann der Wert reduziert werden.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Gibt es einen Puffer-Leerlauf, so ist die Bandbreite der Festplatte(n) </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">nahezu ausgelastet. Bei regelmäßigem Auftreten aufgrund </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">zu geringen Festplattendurchsatzes, versuchen Sie einen Wert von</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">1.5 oder 2 Sekunden</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Behalten Sie im Hinterkopf, dass ein grosser Puffer, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">spürbar Längere Verzögerungen beim verschieben </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">des Wiedergabekopfes verursacht, da alle Puffer </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(einer pro Clip in jedem Kanal) neu gefüllt werden müssen!</p> </body></html> Read buffer size (seconds) Lesepuffer-Größe (Sekunden) info icon Info Icon Changing the buffer size only will take into effect after (re)loading a project. Eine Änderung der Puffer-Größe wird erst nach (Neu)laden des Projektes angewandt. PluginSelectorDialog OK OK Cancel Abbruch Plugin Selector Plugin Auswahl Add Plugin too Plugin hinzufügen Plugin Name Plugin Name Type Typ In/Out Ein-/Ausgang ProgressToolBar Importing file %1 of %2: %p% Progress Toolbar Project Cannot create dir %1 Konnte Verzeichnis %1 nicht erstellen Created new Project %1 Neues Projekt %1 erstellt Project File Version does not match, unable to load Project! Die Version der Projektdatei passt nicht. Kann das Projekt nicht laden! Project %1 loaded Projekt %1 geladen Project %1 saved Projekt %1 gespeichert Sheet %1 added Sheet %1 hinzugefügt Sheet '%1' doesn't exist! Sheet '%1' existiert nicht! Remove Sheet %1 Sheet '%1' entfernen Detected clipping in exported audio! (%1) Es wurde Clipping im exportierten Audiosignal erkannt! (%1) calculated norm factor: %1 Errechneter Normalisierungsfaktor: %1 Traverso - Information Traverso - Information You're still recording, please stop recording first to be able to exit the application! Es läuft noch eine Aufnahme. Bitte beenden Sie diese, bevor Sie das Programm verlassen! Export already in progress, cannot start it twice! Export wurde bereits gestartet! Project with title '%1' allready exists, not setting new title! Es gibt bereits ein Projekt mit dem Titel '%1'. Der neue Titel wurde nicht gesetzt! Project directory %1 no longer exists, did you rename it? Shame on you! Please undo that, and come back later to rename your Project... Projekt-Verzeichnis '%1' existiert nicht mehr. Haben Sie es umbenannt? Böööse! Bitte machen Sie diese Änderung rückgängig und fahren erst danach mit diesem Projekt fort... Project title changed, Project will to be reloaded to ensure proper operation Da sich der Projekt-Titel geändert hat, wird das Projekt nun neu geladen um ein anständiges Arbeiten möglich zu machen Project %1: Cannot open project.tpf file! (Reason: %2) Projekt %1: Datei project.tpf kann nicht geöffnet werden! (Grund: %2) Project %1: Failed to parse project.tpf file! (Reason: %2) Projekt %1: Konnte project.tpf nicht parsen! (%2) Couldn't open Project properties file for writing! (File %1. Reason: %2) Konnte die Datei für die Projekteinstellungen nicht zum Schreiben öffnen (Datei %1. Grund: %2) Unable to create export directory! Please check permissions for this directory: %1 ProjectConverter Project file with version %1 cannot be converted, only files with version 2 can! Projektdateien mit Version %1 können nicht konvertiert werden. Konvertierung ist nur mit Dateien von Version 2 möglich! Project %1: Failed to parse project.tpf file! (Reason: %2) Projekt %1: Konnte project.tpf nicht parsen! (%2) Starting to convert Project from version 2 to version 3 Beginne das Projekt von Version 2 zu Version 3 zu konvertieren Converting project.tpf file..... Done! Konvertierung von project.tpf..... Beendet! <b>Need to convert %1 files</b> <b>%1 Dateien zu konvertieren</b> Couldn't open Project properties file for writing! (File %1. Reason: %2) Konnte die Datei für die Projekteinstellungen nicht zum Schreiben öffnen (Datei %1. Grund: %2) Project %1 converted Projekt %1 wurde konvertiert Saving converted project.tpf file.... Done! Konvertierte Datei project.tpf wird gespeichert.... Beendet! Conversion finished succesfully Konvertierung erfolgreich beendet No conversion description available! Keine Beschreibung der Konvertierung verfügbar! Conversion stopped on user request, you can continue to use this Project with Traverso <= 0.41.0, or reopen it with this version of Traverso and start the conversion again Konvertierung durch Benutzer abgebrochen. Die Datei kann weiterhin mit Traverso <= 0.41.0 geöffnet werden, oder neu mit dieser Version von Traverso konvertiert werden ProjectConverterDialog Project Converter Projektkonvertierung Project XXX (no translation needed) Conversion information Informationen zur Konvertierung Conversion progress Fortschritt der Konvertierung Start conversion Beginne Konvertierung Stop conversion Beende Konvertierung Load Project Projekt laden Close Schließen ProjectInfoWidget Project Information Widget Projektinformationen Bitdepth Sampleauflösung - - Rate Samplefrequenz Project Projekt Songs Songs ProjectManager Save Project Projekt speichern Do you want to save the Project before quiting? Wollen Sie das Projekt vor dem Beenden speichern? Project %1 already exists! Projekt %1 existiert bereits! Unable to create new Project %1 Konnte neues Projekt %1 nicht erstellen Unable to load Project %1 Konnte Projekt %1 nicht laden No Project to save, open or create a Project first! Es gibt nichts zu speichern. Öffnen oder erstellen Sie zuerst ein Projekt! Using existing Project directory: %1 Verwende ein existierendes Projektverzeichnis: %1 Traverso - Warning Traverso - Warnung Unable to create Project directory! Konnte Projektorder nicht anlegen! Please check permission for this directory: %1 Bitte überprüfen Sie die Berechtigungen für Verzeichnis %1 Created new Project directory for you here: %1 Ein neues Projektverzeichnis wurde erstellt: %1 Default Project created by Traverso Standardprojekt erstellt von Traverso Project %1 no longer could be found! (Did you remove or rename the Project directory ?) Projekt %1 konnte nicht mehr gefunden werden! (Haben Sie das Projektverzeichnis umbenannt oder verschoben?) Could not rename Project directory to %1 Konnte Projektverzeichnis nicht zu %1 umbenennen This directory is not writable by you! Dieses Verzeichnis kann nicht geschrieben werden! Please check permission for this directory or choose another one: %1 Bitte überprüfen Sie die Berechtigungen auf dieses Verzeichnis oder wählen Sie ein anderes: %1 Projectfile backup: The project file %1 could not be opened for reading (Reason: %2) Projekt-Backup: Projektdatei %1 konnte nicht gelesen werden (Grund: %2) Cannot create dir %1 Konnte Verzeichnis %1 nicht erstellen Choose a directory to store your Projects in Wählen Sie ein Verzeichnis für ihre Projekte No directory was selected, to retry open the 'Open Project Dialog' and click 'Select Project Directory' button Es wurde kein Verzeichnis ausgewählt. Im Dialog "Projekt öffnen", "Projektverzeichnis auswählen" kann es nachträglich ausgewählt werden ProjectManagerDialog No new Sheet name was supplied! Es wurde kein Name für den neuen Arbeitsbereich angegeben! Save Template Vorlage speichern Enter Template name Geben Sie den Namen der Vorlage ein Unable to create directory %1! Konnte Verzeichnis %1 nicht anlegen! Traverso - Information Traverso - Information Template with name %1 already exists! Do you want to overwrite it? Eine Vorlage mit dem Namen %1 existiert bereits! Wollen Sie diese überschreiben? Saved Project Template: %1 Projektvorlage gespeichert: %1 Couldn't open file %1 for writing! Konnte Datei %1 nicht zum Schreiben öffnen! Dialog Dialog Project Projekt Informational Information Title Titel Description Beschreibung Engineer Tontechniker Export Export Sheet(s) Arbeitsbereich(e) Template Vorlage Sheets Arbeitsbereiche Selected Sheet Ausgewählter Arbeitsbereich Delete Löschen Rename Umbenennen New Sheet Neuer Arbeitsbereich Create new Sheet Neuen Arbeitsbereich erstellen <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Undo last change</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Letzte Änderung Rückgängig machen</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Redo last change</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Letzte Änderung wiederholen</p></body></html> undotext Rückgängig redotext Wiederholen Sheet Name Name des Arbeitsbereiches Tracks Spuren Length Länge CD Text CD-Text Performer Interpret Disc ID: Disc ID: UPC EAN: UPC EAN: Genre: Genre: Unused Unused Undefined Undefined Adult Contemporary Adult Contemporary Alternative Rock Alternative Rock Childrens Childrens Classical Classical Contemporary Christian Contemporary Christian Country Country Dance Dance Easy Listening Easy Listening Erotic Erotic Folk Folk Gospel Gospel Hip Hop Hip Hop Jazz Jazz Latin Latin Musical Musical New Age New Age Opera Opera Operette Operette Pop Music Pop Music Rap Rap Reggae Reggae Rock Music Rock Music Rhythm and Blues Rhytm and Blues Sound Effects Sound Effects Spoken Word Spoken Word World Music World Music Arranger Arrangeur Message Mitteilung Project with title '%1' allready exists, please supply a different title! Ein Projekt mit dem Titel '%1' existiert bereits. Bitte geben Sie einen anderen Titel an! Songwriter QObject No error occurred Keine Fehler aufgetreten An error occurred when reading from the file. Beim Lesen der Datei ist ein Fehler aufgetreten. An error occurred when writing to the file. Beim Schreiben der Datei ist ein Fehler aufgetreten. A fatal error occurred. Ein schwerer Fehler ist aufgetreten. The file could not be opened. Die Datei konnte nicht geöffnet werden. Resourc error Resourcenfehler The operation was aborted. Die Operation wurde abgebrochen. A timeout occurred. Zeitüberschreitung. An unspecified error occurred. Ein unbekannter Fehler ist aufgetreten. The file could not be removed. Die Datei konnte nicht gelöscht werden. The file could not be renamed. Die Datei konnte nicht umbenannt werden. The position in the file could not be changed. Die Position in der Datei konnte nicht geändert werden. The file could not be resized. Die Größe der Datei konnte nicht geändert werden. The file could not be accessed. Zugriff auf die Datei nicht möglich. The file could not be copied. Die Datei konnte nicht kopiert werden. Unknown error Unbekannte Fehler AudioClip Curve CurveNode FadeCurve Marker Sheet Sheet TimeLine Track Track QuickStartDialog Traverso: Getting Started <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"><span style=" font-size:18pt; font-weight:600;">Traverso: Getting Started</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">When you record or import an audio file into Traverso, it shows up as an Audio Clip in one of the horizontal Tracks in the current Sheet. You can edit many aspects of these Clips by placing the mouse pointer over a Clip and pressing or holding different keys on your keyboard and mouse. You can also change settings of a Track, the Sheet as a whole, and other objects in the Sheet.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">To see a list of what commands are available for any given object in the Sheet, move the mouse over that object, and Right-Click (or press Q). The keyboard shortcuts for each command are shown in the menu. The notation used is shown below.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; K &gt; </span> means press and release the K key. (Like a click.)</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"><span style=" font-weight:600;">&lt;&lt; K &gt;&gt;</span> means press the K key two times fast. (Like a double click.)</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ K ]</span> means drag the mouse while holding down the K key.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; KL &gt; </span> means press the K and L keys at the same time.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ KL ] </span> means drag the mouse while holding down the K and L keys at the same time.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">Here are some basic commands:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; SPACE &gt;</span> is Play/Stop.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; SHIFT &gt;</span> sets the Playhead. (Blue vertical line where playing starts.)</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; W &gt;</span> sets the Work Cursor. (Red vertical line.)</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; V &gt; </span> moves the Playhead back to the Work Cursor.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ D ] </span> move objects around (Audio Clip, Curve Nodes, etc)</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ Z ]</span> zooms in and out.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ TAB ]</span> scroll omnidirectional (aka Shuttle) </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">And some Audio Clip Commands:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ E ] </span> drags a Clip's left or right edge.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ F ]</span> adjusts the length of a Clip's Fade In / Fade Out.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ G ] </span>addust the Gain of a clip (also works on Tracks, Sheet)</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; X &gt;</span> splits the Clip at the cursor's position.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">For more information, right-click on everything, or check out the Traverso manual.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"><span style=" font-size:18pt; font-weight:600;">Traverso: Erste Schritte</span></p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">Eine aufgenommene oder importierte Audiodatei wird in einer der horizontalen Spuren des aktuellen Arbeitsbereiches angezeigt. Zahlreiche Funktionen können über Tasten ausgewählt werden, solange sich der Mauszeiger über der Audiodatei befindet. Funktionen von Spuren können ebenfalls über Tasten gewählt werden, wenn sich der Mauszeiger über einem leeren Bereich der Spur befindet.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">Eine Liste aller verfügbarer Funktionen kann über die rechte Maustaste oder die Taste Q geöffnet werden. Folgende Notation wird für die verschiedenen Arten von Tastaturbefehlen verwendet:</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; K &gt; </span> drücke die K-Taste und lasse sie wieder los</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"><span style=" font-weight:600;">&lt;&lt; K &gt;&gt;</span> drücke die K-Taste zweimal nacheinander wie ein Doppelklick</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ K ]</span> drücke die K-Taste und halte sie gedrückt. Bewege die Maus während K gedrückt ist</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; KL &gt; </span> drücke K und L einmal gleichzeitig</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ KL ] </span> halte K und L gleichzeitig gedrückt und bewege die Maus</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">Einige der wichtigesten Funktionen:</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; SPACE &gt;</span> Wiedergabe starten/stoppen.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; SHIFT &gt;</span> positioniere die Abspielposition. (Senkrechte blaue Linie, die die aktuelle Abspielposition markiert.)</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; W &gt;</span> positioniert den Arbeits-Cursor (rote senkrechte Linie)</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; V &gt; </span> setzt die Abspielposition auf den Arbeits-Cursor</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ D ] </span> Verschieben von Objekten</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ Z ]</span> Vergrössern / Verkleinern</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ TAB ]</span> Sichtbaren Bereich verschieben (Scrollen) </p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">Einige Befehle für Audio-Clips:</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ E ] </span> Linkes oder rechtes Ende verschieben</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ F ]</span> Länge von Ein-/Ausblendung verändern.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ G ] </span> Lautstärke ändern</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; X &gt;</span> Clip in zwei Hälften teilen</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">Weiter Informationen sind im Handbuch zu finden.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p></body></html> ReadSource Silence Stille Could not open file Die Datei konnte nicht geöffnet werden. Invalid channel count Ungültige Anzahl Spuren File has zero channels Die Datei enthält keine Spuren The file does not exist! Datei existiert nicht! No ReadSource error set No ReadSource-Fehler RecordingConfigPage Form Formular Recording Aufnahme <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">WAV</span> : A format without compression. Uses more hard disk space then compressed encoding formats, but needs very little cpu.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Limits : ~ 1.7 hours of recording time @ Stereo - 44.1 KHz</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">WavPack</span> : A format with compression, up to 2 times smaller compared to WAV, and no quality loss. Uses significantly more cpu then WAV, but with modern (year 2005 and above) cpu's this shouldn't be a problem.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Using this format stresses the hard disk much less, increasing hard disk live, and less chance of saturating the hard disk bandwidth.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Limits : ~ 5 hours recording time @ Stereo - 44.1 KHz</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">WAV64</span> : WAV format with 64 bit header, support by other programs is currently limited.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Limits : None, thousands of hours of recording time, supposed that your hard disk can hold it.</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">WAV</span> : Ein unkomprimiertes Format. Benötigt mehr Festplattenplatz als komprimierte Formate, belastet aber den Prozessor weniger.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Einschränkungen: Aufnahmezeit auf ca 1.7 Stunden limitiert bei 44.1 KHz in Stereo.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">WavPack</span> : Ein verlustfrei komprimiertes Format, das die Dateigrösse gegenüber WAV auf etwa die Hälfte reduziert. Verursacht deutlich mehr Prozessorbelastung, was aber mit modernen Computern kein Problem sein sollte.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ein komprimiertes Format reduziert die Zugriffe auf die Festplatte, und erlaubt daher das gleichzeitige Lesen von mehr Kanälen.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Einschränkungen: Maximale Aufnahmezeit bei 44.1 kHz in Stereo ca. 5 Stunden.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">WAV64</span> : WAV-Format mit 64 bit Header (von anderen Programmen zum Teil noch nicht unterstützt!)</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Einschränkungen: Keine, nahezu unlimitierte Aufnahmezeit.</p></body></html> Encoding format Kodierformat WavPack options WavPack-Optionen Compression type Kompressionsmethode <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This option reduces the storage of some floating-point data files by up to about 10% by eliminating some information that has virtually no effect on the audio data. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">While this does technically make the compression lossy, it retains all the advantages of floating point data (&gt;600 dB of dynamic range, no clipping, and 25 bits of resolution). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This also affects large integer compression by limiting the resolution to 24 bits.</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Diese Option reduziert den Speicherverbrauch von Fliesspunkt-Daten um bis zu 10%, indem es Informationen aus dem Audiosignal entfernt, die so gut wie keinen Einfluss auf die Qualität haben.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Technisch gesehen wird die Kompression dadurch verlustbehaftet, aber die Vorteile der Fliesspunkt-Auflösung bleiben erhalten (&gt;600 dB Dynamikumfang, keine Übersteuerung, 25 Bit Auflösung). </p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Bei Integer-Daten wird die Bit-Auflösung auf maximal 24 Bit reduziert.</p></body></html> Skip WVX for extra compression (semi-lossless) Überspringe WVX für stärkere Kompression (quasi-verlustfrei) Resampling Samplerate-Konvertierung On the fly resample quality Qualität der Samplerate-Konvertierung in Echtzeit Default export resample quality Qualität der Samplerate-Konvertierung beim Export Best Beste High Hoch Medium Mittel Fast Schnell Enable on the fly resampling (Playback only) Echtzeit-Resampling aktivieren (nur bei Wiedergabe) ResourcesManager ResourcesManager:: Failed to initialize ReadSource %1 (Reason: %2) ResourcesManager:: Konnte Readsource %1 nicht initialisieren (Grund: %2) ResourcesManager: Received request to remove Audio Source %1but it is still in use by %2 AudioClips!!. NOT removing it! ResourcesWidget Form Form Sources Quellen Files Dateien Name Name Length Länge Start Start End Ende RestoreProjectBackupDialog Restore from backup Backup wiederherstellen Set the date to restore the selected backup. Geben Sie das Datum der gewünschten Sicherheitskopie ein. Current date and time: Aktuelles Datum und Zeit: Last backup: Letzte Sicherheitskopie: - - Date Datum Time Zeit SettingsDialog Behavior Verhalten Appearance Erscheinung Keyboard Tastatur Performance Leistungsverhalten Audio Options Audiooptionen Sound System Preferences - Traverso Sheet Hard Disk overload detected! Festplattenüberlastung erkannt! Failed to fill ReadBuffer in time Konnte Lesepuffer nicht rechtzeitig füllen Failed to empty WriteBuffer in time Konnte Schreibpuffer nicht rechtzeitig leeren Add Track Spur hinzufügen Remove Track Spur entfernen Untitled Unbenannt No artists name set Kein Künstlername festgelegt Recording to %n Clip(s) Aufnahme in %n Clips Export start frame starts beyond export end frame!! Der erste Frame des Exports liegt hinter dem letzten Frame!! Export tries to render to 0 channels wav file?? Es soll eine WAVE-Datei mit 0 Kanälen geschrieben werden?? No audio to export! (Is everything muted?) Keine Audiodaten zu exportieren! (Sind alle Kanäle stumm geschalten?) No Tracks armed for recording! Keine Spur auf Aufnahme gestellt! SongInfoWidget SongInfoWidget Song-Informationen Song Song - - Snap Einrasten Gain Lautstärke SMPTE SMPTE Zoom Zoom SpectralMeterConfigWidget Frequency Range Frequenzbereich Show average spectrum Durchschnitts-Spektrum zeigen Number of bands: Anzahl Bänder: Lower dB value: Untere dB-Schwelle: Upper dB value: Obere dB-Schwelle: Hz Hz Lower Limit: Untere Grenze: Upper Limit: Obere Grenze: Advanced FFT Options Erweiterte FFT Optionen FFT Size: FFT Größe: 256 256 512 512 1024 1024 2048 2048 4096 4096 8192 8192 Rectangle Rechteck Hanning Hanning Hamming Hamming Blackman Blackman Windowing function: Fensterungsfunktion: Advanced Erweitert Apply Anwenden &Close S&chließen FFT-Spectrum Configuration Konfiguration des FFT-Spektrums SpectralMeterView Screen Capture file name Schnappschuss Dateiname FFT: Unable to write captured image to hard disk FFT: Konnte erfasstes Bild nicht auf Festplatte schreiben FFT: No avarage curve used, not data to export! FFT: Keine Durschnittskurve verwendet, keine exportfähigen Daten vorhanden! FFT: Enable avarage curve with < M > to generate data FFT: Aktivieren Sie die Durchschnittskurve mit < M > um Daten zu erfassen FFT: No avarage data to export! FFT: Keine Durchschnittswerte für den Export! Select output format Ausgabeformat wählen Output format: Ausgabeformat: Export average dB curve Durchschnittliche dB-Kurve exportieren SplitClip Split Clip Clip aufteilen SysInfoToolBar System Information Systeminformationen SystemInfoWidget SystemInfoWidget Systeminformationen Card Name (na) Soundkarte image Bild buffer size (na) Puffergrösse rate Rate - GB - GB drivertype (na) Audio-Treiber xruns (na) xruns latency (na) Latenz - % (sp)- % bitdepth Bit-Tiefe SystemResources Read Buffer Status Lesepuffer-Status Write Buffer Status Schreibpuffer-Status TimeLine Add Marker Marker hinzufügen Remove Marker Marker entfernen TimeLineView End Ende Add Marker Marker hinzufügen Drag Marker Marker ziehen Clear Markers Mehrere Marker löschen You have to remove all other markers first. Alle Marker müssen erst gelöscht werden. Track Silence Others Andere stummschalten Remove Clip Clip entfernen Add Clip Clip hinzufügen Track: AudioClip with id %1 not found in Resources database! Track: AudioClip mit der ID %1 in der Resourcendatenbank nicht gefunden! TrackPan Track Pan: %1 Track Balance: %1 Track Pan Track Balance TrackView Set Track name Track-Name Enter new Track name Geben Sie einen neuen Track-Namen ein Track %1: %2 Track %1: %2 TransportConsoleWidget Skip to Start Previous Snap Position Record Aufnahme Play / Stop Next Snap Position Skip to End Recording to %1 Tracks, encoding format: %2 Aufnahme in %1 Spuren, Kodierung: %2 TraversoCommands Gain Gain Gain: Reset Gain: Zurücksetzen Panorama Panorama Panorama: Reset Panorama: Zurücksetzen Import Audio Audio importieren Insert Silence Stille einfügen Copy Clip Clip kopieren New Track Neuer Track Remove Clip Clip entfernen Remove Track Track entfernen External Processing Externe Verarbeitung Move Clip Clip verschieben Drag Edge Kante ziehen Move Or Resize Clip Clip verschieben oder Größe ändern Split Aufteilen Arm Tracks Tracks auf Aufnahme schalten Fold Sheet Arbeitsbereich falten Fold Track Spur falten Vertical In Vertikal rein Horizontal Out Horizontal raus Horizontal In Horizontal rein Vertical Out Vertikal raus Omnidirectional Omnidirektional Horizontal Horizontal Vertical Vertikal Right Rechts Left Links Up Hoch Down Runter (De)Select All Fold Markers (De)Select Magnetic Cut traverso-0.49.4/resources/translations/traverso_nl.qm000644 001750 001750 00000510073 11430303020 023377 0ustar00remonremon000000 000000 aF0baDͻp7ejg%MzIWP8d88ռYmPif5ŨtSɬ$vFϨڛyY0q;4oq/kmB^>>=]g~$قQ$.vQrL 6Z#Qڹ'1d /a%;5_bcej1wDN.֓RkTo#_؆_za Hr7N8Lڑg17 .Qd aL+Ե5*T639Oy.BlJoPlLorMCUg+mT}dSlM4Sϥ–ϥBʗ]U'˿l#ϸ=к故Q47^m>%qCi :U(58:Gk8I8Ic-I(^wTl"cv:4-xn{1[ED\ILIIXy1_^F3,LN,ϕ=%WYAW*W=_B4?z kTeGjt,vvրL!hXO;OEL榼L0إ<ESFn/h4mU1V u#/$)P'~Y*Y:,NZ,NR,NJJ48S;3;E;D= f= g=^'FCiH KSYNU-f iKk2dsRh(muK%LH5zTL K.0>hq|Ў7tUSkz#.U~o~ɴN֪!"M^N^ ;Z Pl5 evI~bУ^BhFmKN(ŋ*K3:*/=//A<1C ?P|DA|ZZ:Y[;O\uF]=7]=q'_Q7_QqVaVjb#Tej_l|sԘ{5H%V>ad.JRJ.5?ݐ%eT1)Jno,9EN?Z]RT oC6 /Pp   JA` JJN\5\A_:7_:pa~xk>mH3nPQ|r3lC<P3LYZaUp6%  !   jfd SRZ>!19`7O`oŒ!IZĠ/lԍZqխ,=l' 9Cn ldnqde"O">9#Y 9ϕC@CUDEKr>KCMNONP?PSQ-\VQumQsNA3bK9\evÛ]}rİXyA bMW\io@ !  1+a b 0uJ D.D Mg;Z Mg Y+ [[t [z ]W ^Q̔ g- h>a IB .XN  1f9 g xuՋ 3 e E? EE $ 몠. \M \  % [ 2 9. !5 & w 'ny *L> =a A1- Cb LZ~U dpiT h?. h?27 hE lPɒ l[ lJ rD I2% . \O X^  O ʿ`d rK v2M O) ف F ? L   {qG $q #(b %$S 0KX 7o FQa GIB L.E Q6^ ]E h). zn YP] YP F2 K[i M  iJ }lh tQ MXs ɂeF{ Ӱ; >% | T ܄~ ޤ1 >K NC 9K B d9 c X . Iq ڶ ( * >y7 ,Jd8 ,g` ,g`i ,g`u 1 "G 25% 3aތ 6kb 7IQl ;!R* > G- N01 Q3 SAn ^ _ b b bڅY iuP t`8 t`s ztZ ~7Ӎ ~7ח ~7s9  sw  sS v à _!} x5 [TC d 4ww )3!  sR; ڞSZ ڞ- ڞi ػE ߆$  ddr ]N~ y5 Gӑ 1f ^4k  FF !/[ 3Gy? 3Gy5 3Ch 3E 4K7 5JE_ 7vzK\ 7vzص 8Fqs 8y:V =O Q\c RZK Zy4 _=y `ξ eV<3 jn> nP5| qle . ^ Xye  q \ d тU ͤx g; u ._k)cuso]H%pYC]d1(/M=z<G[Utc.g&sp%p<pSq/yǣy%t?RzP}|lN|l@ZP[P7PRLgrNH>GсjrjZCMuڱĄF96!RnO { F %+"R(}A-J.82nuN@`GxKUbfgÞgSDt@y11|>*P]@ ]C"|[.V7U>݇K#-^w/ߠLSiwVerwijder Clip Remove Clip AddRemoveClip.Verwijder Clip SelectieRemove Selected Clips AddRemoveClip22AlsaDevicesPage33AlsaDevicesPage<html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Apparaat:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">De echte of virtuele ALSA geluidskaart die wordt gebruikt.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Een echte ALSA geluidskaart is fysiek aanwezig in uw computersysteem.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Een virtuele geluidskaart werd in het .asoundrc bestand aangemaakt. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Dit bestand bevindt zich meestal in uw home folder.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Bij twijfel, kies de standaard-geluidskaart, dus de geluidskaart door uw distributie ingesteld, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">of het apparaat dat naar uw geluidskaart is vernoemd.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">In het laatste geval, verzeker u ervan dat geen andere applicaties van de geluidskaart gebruikmaken, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">zoniet zal de driver niet kunnen starten!</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Voor meer info, zie hoofdstuk 3.1: "The Driver Backend" van de gebruikershandleiding.</p></body></html> [

Device:

The real or virtual ALSA device to be used.

A real device is the audiocard installed in your system.

A virtual device is one created in the .asoundrc file,

often located in your home folder.

If unsure, use either the default device, this will use the audiodevice

configured by your distribution, or the device that names your audio card.

In the latter case, please make sure no application uses the audiocard,

else the driver won't be able to initialize!

For more info see chapter 3.1: "The Driver Backend" of the User Manual

AlsaDevicesPage<html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Aantal perioden:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Audiodata wordt verwerkt in kleine deeltjes, de zogenaamde periods. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Deze waarde bepaalt hoeveel van deze deeltjes je audio kaart tegelijk behandelt</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">De standaardwaarde voldoet in de meeste gevallen, en geeft in ieder geval de laagste latency.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Sommige (slechtgeschreven) alsa drivers werken echter niet zoals het hoort</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">met de standaardwaarde van 2, dus indien audio op uw geluidskaart niet vlot speelt, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">probeer deze waarde eens op 3 te zetten.</p></body></html>

Number of Periods:

Audio is managed in small chunks called periods.

This value determines how many of these chunks are

to be used by the driver of the audiocard.

The default should work just fine, and gives optimal latency behavior.

However, some (buggy) alsa drivers don't work correctly

with the default of 2, if you experience very choppy audio,

please try to use 3 periods.

AlsaDevicesPage

Dither is used to make the audio cleaner.

The best way to describe it is to imagine a painting with many dots. If you view it up close you can see each dot and the image is not very clear. If you view it from far away the image becomes clearer because your eyes/brain dither the dots to smooth out the image. It is a murky subject and obviously a very personal choice as to what dither is the best. For most people it is just plain magic. Anyone running at 16bit who cares about quality or has CPU cycles to spare should run with dither. Triangular is probably the best compromise of quality vs cpu cost (its very fast), but shaped is the best

AlsaDevicesPageALSA Apparaat ALSA DeviceAlsaDevicesPageApparaatDeviceAlsaDevicesPageDitherAlsaDevicesPageFormFormAlsaDevicesPageGeenNoneAlsaDevicesPageAantal periodenNr. of periodsAlsaDevicesPage RectangularAlsaDevicesPageShapedAlsaDevicesPage TriangularAlsaDevicesPageALSA Driver: Kan PCM apparaat %1 niet openen om af te spelen. Er wordt terug gevallen op alleen opnemen modusVALSA Driver: Cannot open PCM device %1 for playback. Falling back to capture-only mode AlsaDriverALSA Driver: Opname apparaat %1 is al in gebruik. Stop de applicatie die het in gebruik heeft a.u.b., en start Traverso opnieuwqALSA Driver: The capture device %1 is already in use. Please stop the application using it and run Traverso again AlsaDriverALSA Driver: Het afspeel apparaat %1 is al in gebruik. Stop de applicatie die het in gebruik heeft a.u.b., en start Traverso opnieuwrALSA Driver: The playback device %1 is already in use. Please stop the application using it and run Traverso again AlsaDriverALSA Driver: Kan hardware niet configureren, wordt het gebruikt door een andere applicatie ?OALSA Driver: Unable to configure hardware, is it in use by another application? AlsaDriverALSA Driver: U heeft geen toestemming om apparaat %1 te openen om op te nemenOALSA Driver: You do not have permission to open the audio device %1 for capture AlsaDriverALSA Driver: U heeft geen toestemming om audio apparaat %1 te openen om af te spelenPALSA Driver: You do not have permission to open the audio device %1 for playback AlsaDriverMALSA Driver: snd_pcm_open(capture_handle, ...) failed with unknown error type AlsaDriverALSA Driver: Kan PCM apparaat %1 niet openen om op te nemen. Er wordt terug gevallen naar alleen afspelen modusOALSA: Cannot open PCM device %1 for capture. Falling back to playback-only mode AlsaDriver@snd_pcm_open(playback_handle, ..) failed with unknown error type AlsaDriver9

Painting the waveform with an outline is more detailed, but requires more cpu.

If you experience slowness when painting many clips, or during animated scroll, unselect this option!

AppearenceConfigPage*Thema kleur aanpassenAdjust theme colorAppearenceConfigPage$Beschikbare themasAvailable themesAppearenceConfigPageKnop stijl Button styleAppearenceConfigPageRChanging the language of the Interface will take effect after restarting Traverso!AppearenceConfigPageDefault LanguageAppearenceConfigPage4Teken lijnen op 0 en -6 dBDraw lines at 0 and -6 dBAppearenceConfigPageFormFormAppearenceConfigPageIcoon grootte Icon sizeAppearenceConfigPageAlleen Iconen Icons onlyAppearenceConfigPageInterface taalInterface LanguageAppearenceConfigPageTaalLanguageAppearenceConfigPage2Geluid positief weergevenPaint audio rectifiedAppearenceConfigPage4Teken geluidsvorm met randPaint audio with outlineAppearenceConfigPage@Stereo geluid als mono weergeven Paint stereo audio as mono audioAppearenceConfigPage0Pad naar thema bestandenPath to theme filesAppearenceConfigPageDSelecteer de standaard project mapSelect default project dirAppearenceConfigPageSelecteer style Select styleAppearenceConfigPageStyle opties Style OptionsAppearenceConfigPage$Tekst naast IconenText below IconsAppearenceConfigPage$Tekst naast IconenText beside IconsAppearenceConfigPageAlleen tekst Text onlyAppearenceConfigPageThemeAppearenceConfigPageThema opties Theme OptionsAppearenceConfigPage$Thema selecteerderTheme selectorAppearenceConfigPageWerkbalkenToolbarsAppearenceConfigPageTransport Console sizeAppearenceConfigPagePGebruik palet van de geselecteerde stijlUse selected style's paletteAppearenceConfigPage Arm Tracks ArmTracksnAudioApparaat heeft deze Opname Bus niet: %1 (Track %2)8AudioDevice doesn't have this Capture Bus: %1 (Track %2) AudioClipNormalizatie Normalization AudioClipVerwijder Fades Remove Fades AudioClip2Geef normalizatie niveau:Set Normalization level: AudioClip*Vergrendeling aan/uit Toggle Lock AudioClipSchakel Mute Toggle Mute AudioClip6Kan niet opnemen naar TrackUnable to Record to Track AudioClipStandaard&DefaultAudioClipEditDialog&LinearAudioClipEditDialog BuigenBendingAudioClipEditDialogClip ParametersAudioClipEditDialogDialoogDialogAudioClipEditDialog EindeEndAudioClipEditDialog"Externe bewerkingExternal ProcessingAudioClipEditDialogFade InAudioClipEditDialogFade OutAudioClipEditDialogFadesAudioClipEditDialogGainGainAudioClipEditDialog LengteLengthAudioClipEditDialogModeAudioClipEditDialogNaamNameAudioClipEditDialogSterkteStrengthAudioClipEditDialogText Label TextLabelAudioClipEditDialogTrack start Track startAudioClipEditDialog hh:mm:ss.sssAudioClipEditDialog.Clip: Externe bewerkingClip: External ProcessingAudioClipExternalProcessing0Selectie: Clip toevoegenSelection: Add ClipAudioClipManager"Selectie: OmkerenSelection: InvertAudioClipManager4Selectie: Clip verwijderenSelection: Remove ClipAudioClipManagerdAlle bestanden (*);;Audio bestanden (*.wav *.flac))All files (*);;Audio files (*.wav *.flac) AudioClipViewTClick om AudioFile opnieuw toe te wijzen !Click to reset AudioFile ! AudioClipView.Geen file geselecteerd!No file selected! AudioClipView2Zet bestand voor Clip: %1Reset Audio File for Clip: %1 AudioClipViewZBestand %1 succesvol toegewezen aan AudioClip$Succesfully set AudioClip file to %1 AudioClipViewAudioApparaat:: Lange serie 'buffer underruns' ervaren, schakelt over op de Null DriverHAudioDevice:: Buffer underrun 'Storm' detected, switching to Null Driver AudioDeviceAudioApparaat:: Om dit probleem op te lossen, zie Hoofdstuk 11 van de gebuikershandleiding!\AudioDevice:: For trouble shooting this problem, please see Chapter 11 from the user manual! AudioDevicebAudio apparaat: Maken van de ALSA Driver mislukte-Audiodevice: Failed to create the ALSA Driver AudioDevice2Audiodevice: Failed to create the CoreAudio Driver AudioDevicebAudio apparaat: Maken van de Jack Driver mislukte-Audiodevice: Failed to create the Jack Driver AudioDevicelAudio apparaat: Maken van de PortAudio Driver mislukte2Audiodevice: Failed to create the PortAudio Driver AudioDevice3Audiodevice: Failed to create the PulseAudio Driver AudioDevice8Geen Apparaat geconfigureerdNo Device Configured AudioDevice&Geen Driver geladenNo Driver Loaded AudioDevice:De Jack server is afgesloten!"The Jack server has been shutdown! AudioDeviceKon de Audio bewerkings stroom proriteit niet naar hoogste wijzigen!! Dit heeft zeer waarschijnlijk tot gevolg dat opname and afpelen niet goed werkt, zoals het kort wegvallen van het geluid. Het kan zelfs zorgen voor het niet functioneren van het programma. Zorgt u er a.u.b. voor dat het programma bevoegd is voor Real Time operatie!!Unable to set Audiodevice Thread to realtime priority!!!This most likely results in unreliable playback/capture and lots of buffer underruns (== sound drops).In the worst case the program can even malfunction!Please make sure you run this program with realtime privileges!!!AudioDeviceThread 2205022050AudioDriverConfigPage 3200032000AudioDriverConfigPage 4410044100AudioDriverConfigPage 4800048000AudioDriverConfigPage 8820088200AudioDriverConfigPage 9600096000AudioDriverConfigPagex<html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Buffer latency:</span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">De vertraging, bepaalt door de grootte van de audio buffers.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Soms is een lage vertraging gewenst. Zoniet, kunt U best</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">de standaardkeuze behouden.</p></body></html>`

Buffer latency:

The latency introduced by the size of the audio buffers.

Some people need low latencies, if you don't need it,

or don't know what it means, please leave the default setting!

AudioDriverConfigPage <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Duplex mode:</span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Bepaalt of zowel de Playback- als de Capturebus </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">van uw geluidskaart gebruikt worden, </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">or slechts n van de twee.</p></body></html>

Duplex mode:

Defines if both the Playback and Capture buses

of your soundcard are to be used,

or only the Playback or Capture bus(es).

AudioDriverConfigPage$<html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Sample rate:</span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">De sample rate die de geluidskaart gebruikt.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Nieuwe projecten gebruiken deze standaard, </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">bij het aanmaken.</p></body></html>'

Sample rate:

The sample rate used by the audio card.

New projects will use this samplerate as

the project's sample rate on creation.

AudioDriverConfigPage,Buffer vertraging (ms)Buffer latency (ms)AudioDriverConfigPageOpnemenCaptureAudioDriverConfigPage$Configureer DriverConfigure driverAudioDriverConfigPage Selecteer DriverDriver SelectionAudioDriverConfigPageDriver: Driver:AudioDriverConfigPageDuplex modus Duplex modeAudioDriverConfigPageDJack transport control inschakelenEnable Jack transport controlAudioDriverConfigPageFormFormAudioDriverConfigPage&Afspelen n OpnemenFullAudioDriverConfigPageJackAudioDriverConfigPageAfspelenPlaybackAudioDriverConfigPage"Driver herstartenRestart DriverAudioDriverConfigPageSample rate Sample rateAudioDriverConfigPage"Systeem standaardSystem defaultAudioDriverConfigPageAudio Bronnen AudioSourcesAudioSourcesManagerWidgetFormFormAudioSourcesManagerWidget,Verwijder alle bronnenRemove all sourcesAudioSourcesManagerWidgetVerwijder bron Remove sourceAudioSourcesManagerWidget"Verwijder bronnenRemove sourcesAudioSourcesManagerWidget@Verwijder niet gebruikte bronnenRemove unused sourcesAudioSourcesManagerWidget~Gedurende afspelen of opnemen de afspeel cursor in beeld houden

Keep the play cursor in view while playing or recording.

BehaviorConfigPageGeanimeerdAnimatedBehaviorConfigPage VraagAskBehaviorConfigPage.Audio Clip InstellingenAudio Clip SettingsBehaviorConfigPageRGeluid synchronizeren tijdens verplaatsen(Continuously adjust audio while draggingBehaviorConfigPageNiet opslaan Don't saveBehaviorConfigPageFormFormBehaviorConfigPage SpringJumpBehaviorConfigPageVLaatst geopende project laden tijdens start!Load last used project at startupBehaviorConfigPageFVergrendel standaard de audio clipsLock Audio Clips by defaultBehaviorConfigPage2Nieuwe Sheet instellingenNew Sheet SettingsBehaviorConfigPageAantal TracksNumber of tracksBehaviorConfigPageBij afsluiten: On close:BehaviorConfigPage(Afspeel instellingenPlayback SettingsBehaviorConfigPage(Project instellingenProject SettingsBehaviorConfigPageOpslaanSaveBehaviorConfigPage"Afspelen scrollenScroll playbackBehaviorConfigPageCentreren Stay CenteredBehaviorConfigPage BeideBothBusSelectorDialog Bus Selecteerder Bus SelectorBusSelectorDialogOpname Bussen Capture BusesBusSelectorDialogKanalenChannelsBusSelectorDialog LinksLeftBusSelectorDialogAfspeel BussenPlayback BusesBusSelectorDialog RechtsRightBusSelectorDialog TrackTrackBusSelectorDialog12x12xCDWritingDialog16x16xCDWritingDialog1x1xCDWritingDialog20x20xCDWritingDialog24x24xCDWritingDialog28x28xCDWritingDialog2x2xCDWritingDialog32x32xCDWritingDialog36x36xCDWritingDialog40x40xCDWritingDialog44x44xCDWritingDialog48x48xCDWritingDialog4x4xCDWritingDialog8x8xCDWritingDialogAfbrekenAbortCDWritingDialogCD branderBurning DeviceCDWritingDialogCD Schrijven CD WritingCDWritingDialog>Bereken en pas normalizatie toe!Calculate and apply normalizationCDWritingDialogSluitenCloseCDWritingDialogrExporteer aleen wave en toc bestanden (CD niet schrijven).Export wav and toc files only (don't write CD)CDWritingDialogAlgemene optiesGeneral OptionsCDWritingDialogInformatie InformationCDWritingDialogAantal kopienNumber of copiesCDWritingDialogSimulerenSimulateCDWritingDialogSnelheidSpeedCDWritingDialog"Schrijven starten Start WritingCDWritingDialog StatusStatusCDWritingDialog@Schrijf alle Werkbladen (Sheets)Write all SheetsCDWritingDialog>Schrijf huidig Werkblad (Sheet)Write current SheetCDWritingDialogautomatischautoCDWritingDialogSelecteer Clip Select Clip ClipSelection0Selectie: Clip toevoegenSelection: Add Clip ClipSelection4Selectie: Clip verwijderenSelection: Remove Clip ClipSelection4Importeer %n Audio bestand8Importeer %n Audio bestandenImport %n audiofile(s) ClipsViewPort&CurveNode toevoegen Add CurveNodeCurve*CurveNode verwijderenRemove CurveNodeCurveEr is al een node op precies deze locatie. Node wordt niet toegevoegdFThere is allready a node at this exact position, not adding a new nodeCurve"Nodes verwijderen Clear Nodes CurveViewVerplaats Node Drag Node CurveViewAnnulerenCancelDialogDialoogDialogDialogOKOKDialogDigitale klok Digital Clock DigitalClockHVerander Audio Apparaat instellingenChange Audio Device settings DriverInfo-- ExportDialogStop Exporteren Abort Export ExportDialogSluitenClose ExportDialogExporteerExport ExportDialog@Schrijf alle Werkbladen (Sheets)Export all Sheets ExportDialog2Exporteer huidig WerkbladExport current Sheet ExportDialogExporteer mapExport directory ExportDialog Exporteer status Export status ExportDialogAlgemene optiesGeneral Options ExportDialog Start Exporteren Start Export ExportDialog <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Deze optie reduceert de grote van het bestand bij sommige floating-point geluids-data tot wel 10%. Het heeft vrijwel geen effect op de kwaliteit van het geluid.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Technisch gesproken is de compressie niet langer lossless, maar behoud het wel al de voordelen van floating point audio (&gt;600 dB dynamisch bereik, geen clipping en 25 bit resolutie). </p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Het heeft ook effect bij comprimeren van 32 bit integer audio data door te comprimeren naar 24 bit resolutie.</p></body></html>B

This option reduces the storage of some floating-point data files by up to about 10% by eliminating some information that has virtually no effect on the audio data.

While this does technically make the compression lossy, it retains all the advantages of floating point data (>600 dB of dynamic range, no clipping, and 25 bits of resolution).

This also affects large integer compression by limiting the resolution to 24 bits.

ExportFormatOptionsWidgetAverage BitrateExportFormatOptionsWidget BesteBestExportFormatOptionsWidgetBit diepteBitdepthExportFormatOptionsWidgetBitrateBitrateExportFormatOptionsWidgetKanalenChannelsExportFormatOptionsWidgetCompressie typeCompression typeExportFormatOptionsWidget&Conversie kwaliteitConversion qualityExportFormatOptionsWidgetEncodingEncodingExportFormatOptionsWidget Encoding methodeEncoding MethodExportFormatOptionsWidget,Opties voor exporterenExport Format OptionsExportFormatOptionsWidgetSnelFastExportFormatOptionsWidgetBestands type File TypeExportFormatOptionsWidget Formateer optiesFormat OptionsExportFormatOptionsWidgetHoogHighExportFormatOptionsWidgetMP3 opties MP3 OptionsExportFormatOptionsWidgetMaximum BitrateMaximum BitrateExportFormatOptionsWidgetNormaalMediumExportFormatOptionsWidgetMinimum BitrateMinimum BitrateExportFormatOptionsWidget"Normalizeer AudioNormalize AudioExportFormatOptionsWidgetOgg opties Ogg OptionsExportFormatOptionsWidget:Kwaliteit (Snelste <-> Beste)Quality (Fastest <-> Best)ExportFormatOptionsWidget<Kwaliteit (Kleinste <-> Beste)Quality (Smallest <-> Best)ExportFormatOptionsWidgetSample rate Sample RateExportFormatOptionsWidgetdSla WVX over voor extra compressie (semi-lossless).Skip WVX for extra compression (semi-lossless)ExportFormatOptionsWidgetHWavPack opties (lossless compressie)&WavPack options (lossless compression)ExportFormatOptionsWidgetRBeschikbare opties voor het sox programma'Available arguments for the sox programExternalProcessingDialog8Programma <b>%1</b> crashte!Program %1 crashed!ExternalProcessingDialogProgramma <b>%1</b> is niet geinstalleerd, of u heeft onvoldoende rechten om het te starten!DProgram %1 not installed, or insufficient permissions to run!ExternalProcessingDialogU moet een argument opgeven voordat u het externe programma start!DYou have to supply an argument before starting the external process!ExternalProcessingDialog Fade In: Buiging Fade In: bendFadeBend"Fade Out: BuigingFade Out: bendFadeBend Fade Preset FadeCurveFade In: vormFade In: shapeFadeModeFade Uit: vormFade Out: shapeFadeModeFade In: lengteFade In: length FadeRange$Fade In: verwijderFade In: remove FadeRange Fade Uit: lengteFade Out: length FadeRange&Fade Uit: verwijderFade Out: remove FadeRange Fade In: SterkteFade In: strength FadeStrength"Fade Out: SterkteFade Out: strength FadeStrengthMijn Computer My Computer FileWidgetMijn Documenten My Documents FileWidget"Bovenliggende mapParent Directory FileWidget$Weergave verversenRefresh File View FileWidget$Alle bestanden (*) All files (*)ImportjAudio bestanden (*.wav *.flac *.ogg *.mp3 *.wv *.w64)1Audio files (*.wav *.flac *.ogg *.mp3 *.wv *.w64)Import.Importeer Audio BestandImport Audio FileImport.Importeer audio bestandImport audio sourceImportStilte invoegenInsert SilenceImport StilteSilenceImport Marker toevoegen Add MarkersImportClipsDialog*Importeer Audio ClipsImport Audio ClipsImportClipsDialog&Importeer in Track:Import to Track:ImportClipsDialog>CommandPlugin %1 niet gevonden!Command Plugin %1 not found! InputEngineTHoldacties werken niet vanuit Context Menu0Hold actions are not supported from Context Menu InputEnginebModificeertoetsen werken niet vanuit Context Menu8Modifier key actions are not supported from Context Menu InputEnginehCommand %2 wordt niet gemplementeerd door Plugin %1&Plugin %1 doesn't implement Command %2 InputEngineStilte invoegenInsert SilenceInsertSilenceDialog6Stilte invoegen (seconden):Insert Silence (seconds):InsertSilenceDialog%1: %2 Interface&Over Traverso&About Traverso Interface &CD Schrijven...&CD Writing... Interface&Edit Interface&Exporteren... &Export... InterfaceOm te be&ginnen&Getting Started Interface&Help Interface$&Project Beheer...&Manage Project... Interface&Nieuw...&New... Interface&Openen...&Open... Interface&Voorkeuren...&Preferences... Interface&Project&Project Interface&Afsluiten&Quit Interface0&Opname Bestands Formaat&Recording File Format Interface&&Resample Kwaliteit&Resample Quality Interface$&Herstel Backup...&Restore Backup... Interface&Opslaan&Save Interface &Sheet&Sheet Interface&Toon Effecten &Show Effects Interface &Snap&Snap Interface,Gebr&uikershandleiding &User Manual Interface &Beeld&View Interface&<b>Beschrijving</b>Description Interface0<b>Toetsencombinatie</b>Key Sequence InterfaceEen Project map is veranderd buiten Traverso om. Dit wordt NIET ondersteund, wilt u a.u.b. dit ongedaan maken! Als u de Project titel wilt veranderen kunt u daarvoor het Project Beheer Dialoog gebruiken!A Project directory changed outside of Traverso. This is NOT supported! Please undo this change now! If you want to rename a Project, use the Project Manager instead! InterfaceOver TraversoAbout Traverso InterfaceAlle bestanden (*);;Audio bestanden(*.wav *.flac *.ogg *.mp3 *.wv *.w64)1Audio files (*.wav *.flac *.ogg *.mp3 *.wv *.w64) Interface BesteBest InterfaceBOpname encoding veranderd naar %1$Changed encoding for recording to %1 InterfaceJResample kwaliteit veranderd naar: %1Changed resample quality to: %1 Interface Correlatie MeterCorrelation Meter InterfaceBewerkenEdit Interface FFT Spectrum InterfaceSnelFast InterfaceHoogHigh InterfaceGeschiedenisHistory Interface&Importeer &Audio...Import &Audio... Interface&Sti&lte invoegen...Insert Si&lence... InterfacevAfspeel cursor in beeld houden tijdens afspelen of opnemen.4Keep play cursor in view while playing or recording. Interface"Marker Manager...Marker Editor... InterfaceNormaalMedium Interface$Nieuw &Sheet(s)...New &Sheet(s)... Interface&Nieuwe &Track(s)...New &Track(s)... Interface$Open audio bestandOpen Audio Files InterfacelOpent de gebruikershandleiding in een externe browser!(Opening User Manual in external browser! InterfaceProjectProject InterfaceRedo InterfaceBronnen Bak Resources Bin Interface$Afspelen s&crollenS&croll Playback InterfaceOp&ties Se&ttings InterfaceXPlugins en automation curves tonen in Tracks3Show effect plugins and automation curves on tracks InterfaceTijdens verplaatsen randen laten snappen naar randen van andere objecten.2Snap items to edges of other items while dragging. Interface$Systeem InformatieSystem Information Interface8Het volgende Project '%1' kon niet geladen worden door volgende oorzaak: '%2' U krijgt nu een lijst met backups te zien om het Project mee te herstellen.The requested Project `%1` could not be loaded for the following reason: '%2' You will now be given a list of available backups (if any) to restore the Project from. InterfaceTransport Console InterfaceTraverso %1 (gebaseerd op Qt %2) Traverso is een Multitrack audio opname- en editingprogramma. Voor meer info, zie de Help file Traverso werd mogelijk gemaakt door de auteur, R. Sijrier en vele anderen, onder meer iedereen uit de Free Software world, door hun bijdragen aan de technologin waarop Traverso gebaseerd is (Gcc, Qt, Xorg, Linux, enz...)KTraverso %1 (built with Qt %2) A multitrack audio recording and editing program. Look in the Help menu for more info. Traverso is brought to you by R. Sijrier and others, including all the people from the Free Software world who contributed the important technologies on which Traverso is based (Gcc, Qt, Xorg, Linux, and so on) Interface*Traverso - BelangrijkTraverso - Important InterfaceBTraverso - Project laden mislukteTraverso - Project load failed InterfaceUndo InterfacedJack Driver: Verbinding met jack server succesvol!7Jack Driver: Connected successfully to the jack server! JackDriverJack Driver: Kon geen verbinding maken met de jack server, is deze geactiveerd ?BJack Driver: Couldn't connect to the jack server, is jack running? JackDriver<html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Bitstream Vera Sans; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Toetsenbord dubbel-klik interval (ms)</p></body></html>Z

Double fact timeout (ms)

KeyboardConfigPage<html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Bitstream Vera Sans; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Hold interval (ms)</p></body></html>S

Hold timeout (ms)

KeyboardConfigPage^<html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Keyboard dubbel klik interval:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">De maximum tijd (miliseconden) tussen 2 toetsaanslagen.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Deze bepaalt of 2 opeenvolgende toetsaanslagen een dubbelklik ( &lt;&lt; K &gt;&gt; of &lt;&lt; KK &gt;&gt;)</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> of 2 individuele acties vormen ( a &lt; K &gt; en &lt; K &gt; actie, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">of &lt; KK &gt; en &lt; KK &gt; actie, bijvoorbeeld).</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ervaren gebruikers kunnen waarden tot minimum 150 ms proberen, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">maar voor de meeste gebruikers volstaat de standaardwaarde, 180 ms.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Voor meer informatie, zie hoofdstuk 7: Key Actions. of the User Manual</p></body></html>

Double fact timeout:

The maximum time in miliseconds between 2 key presses

to determine if the 2 key presses are a double fact ( << K >> or << KK >>)

or 2 individual key presses ( a < K > and < K > action,

or < KK > and < KK > action for example).

Experienced users can set this value as low as 150 ms,

if you don't have much experience yet, please leave the default of 180 ms.

For more information, see chapter 7: Key Actions. of the User Manual

KeyboardConfigPage<html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Hold interval:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">De maximum tijd (miliseconden) van een enkele toetsaanslag, voor deze als hold actie beschouwd wordt., </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">zoals [ K ] of [ KK ].</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Hoe korter deze is, hoe sneller een ingedrukte toets </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">als hold actie beschouwd zal worden. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ervaren gebruikers kunnen waarden tot minimum 110 ms proberen, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">maar voor de meeste gebruikers is de standaardwaarde van 150 ms voldoende.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Voor meer informatie, zie hoofdstuk 7: "Key Actions" of the User Manual.</p></body></html>7

Hold timeout:

The maximum time to consider a pressed key a hold key fact,

like [ K ] or [ KK ].

The shorter this time, the sooner a pressed key will be

detected as a hold action.

Experienced users can set this value as low as 110 ms,

if you don't have much experience yet, please leave the default of 150 ms.

For more information, see chapter 7: "Key Actions" of the User Manual.

KeyboardConfigPage.Configureer ToetsenbordConfigure KeyboardKeyboardConfigPageExport Keymap Export KeymapKeyboardConfigPageFormFormKeyboardConfigPageKeyMap Export KeyMap ExportKeyboardConfigPageKeymapKeyboardConfigPageZGeen beschrijving voorhanden voor deze keymap"No description set for this keymapKeyboardConfigPage Keymap afdrukken Print KeymapKeyboardConfigPage Selecteer keymap Select keymapKeyboardConfigPagejDe ge-exporteerd keymap kan hier gevonden worden: %1+The exported keymap can be found here: %1KeyboardConfigPageNederlandsEnglish LanguageName&Cancel MarkerDialog&Exporteer&Export MarkerDialog&Ok MarkerDialog&Verwijder&Remove MarkerDialog...... MarkerDialog"Op alle toepassen Apply to all MarkerDialogArrangeur: Arranger: MarkerDialogCD-TekstCD-Text MarkerDialog$CD-Tekst optioneelCD-Text optional MarkerDialogComponist: Composer: MarkerDialogCopy protectieCopy protection MarkerDialog ISRC:ISRC: MarkerDialogMarkers MarkerDialogBericht:Message: MarkerDialog OptiesOptions MarkerDialogUitvoerder: Performer: MarkerDialogPositiePosition MarkerDialog.Positie: (MM:SS:75sten)Position: (MM:SS:75ths) MarkerDialogVoorversterking Pre-Emphasis MarkerDialogLied schrijver Songwriter MarkerDialog TitelTitle MarkerDialog Titel:Title: MarkerDialogClip kopieren Copy ClipMoveClip Fold MarkersMoveClip Fold SheetMoveClip Fold TrackMoveClip Clip verplaatsen Move ClipMoveClip6Clip naar einde verplaatsenMove Clip To EndMoveClip6Clip naar begin verplaatsenMove Clip To StartMoveClip(Cliprand verplaatsenMove Clip EdgeMoveEdge......NewProjectDialogjAudio bestanden (*.wav *.flac *.ogg *.mp3 *.wv *.w64)1Audio files (*.wav *.flac *.ogg *.mp3 *.wv *.w64)NewProjectDialogDCopieer bestanden naar Project mapCopy files to project directoryNewProjectDialog<Kon Project "%1" niet aanmakenCouldn't create project (%1)NewProjectDialogBeschrijving DescriptionNewProjectDialogLeeg Project Empty ProjectNewProjectDialogOpnameleiderEngineerNewProjectDialogBestandFileNewProjectDialog2Importeer Audio BestandenImport Audio FilesNewProjectDialogNaamNameNewProjectDialogNieuw Project New ProjectNewProjectDialogNeeNoNewProjectDialogAantal SheetsNumber of SheetsNewProjectDialog(Open audio bestandenOpen Audio FilesNewProjectDialoglProject "%1" bestaat reeds, vervangen door een nieuwe?YThe Project "%1" already exists, do you want to remove it and replace it with a new one ?NewProjectDialogTrack naam Track NameNewProjectDialog.Aantal tracks per SheetTracks per SheetNewProjectDialog Traverso - VraagTraverso - QuestionNewProjectDialog Gebruik sjabloon Use TemplateNewProjectDialogJaYesNewProjectDialogJU dient een Project naam op te geven!'You must supply a name for the project!NewProjectDialog&%n Sheet toegevoegd(%n Sheets toegevoegdAdded %n Sheet(s)NewSheetDialog|Kan geen nieuwe Sheet aanmaken als er geen Project geladen is!:I can't create a new Sheet if there is no Project loaded!!NewSheetDialog"Nieuwe Sheet naamNew Sheet nameNewSheetDialogNieuwe Sheet(s) New Sheet(s)NewSheetDialogAantal Sheets Sheet countNewSheetDialogAantal Tracks Track countNewSheetDialog Gebruik sjabloon Use TemplateNewSheetDialog&%n Track toegevoegd(%n Tracks toegevoegdAdded %n Track(s)NewTrackDialog|Kan geen nieuwe Track aanmaken als er geen Project geladen is!:I can't create a new Track if there is no Project loaded!!NewTrackDialogNieuwe Track(s) New Track(s)NewTrackDialogTrack aantal Track countNewTrackDialogTrack naam Track nameNewTrackDialog<p>Project map naam <b>%1</b> is niet gelijk aan Project titel <b>%2</b>!</p><p>Heeft u de Project map een andere naam gegeven?</p><p>Wilt u a.u.b. de map hernoemen naar <b>%1</b>, u kunt de Project titel veranderen met het Project Beheer Dialoog!</p>

Project directory name %1 is different from the Project title %2!

Did you rename the Project directory ?

Please rename the directory back to the Project title %1, and change the Project title with the Project Manager Dialog!

OpenProjectDialogWeet u zeker dat u Project "%1" wilt verwijderen? Het is niet mogelijk om dit ongedaan te maken!TAre you sure that you want to remove the project %1 ? It's not possible to undo it !OpenProjectDialognSelecteer een bestaande Project map, of maak een nieuwe4Choose an existing or create a new Project DirectoryOpenProjectDialogVDe volgende Project map werd aangemaakt: %1/Created new Project directory for you here: %1 OpenProjectDialogGemaakt op: Created on:OpenProjectDialogVerwijderenDeleteOpenProjectDialogBeschrijving: Description:OpenProjectDialog LadenLoadOpenProjectDialog4Geen Project geselecteerd!No Project selected!OpenProjectDialogProject openen Open ProjectOpenProjectDialogControleert u alstublieft de rechten voor deze map of kies een andere: %1FPlease check permission for this directory or choose another one: %1OpenProjectDialogXControleer toegangsrechten voor deze map: %1.Please check permission for this directory: %1OpenProjectDialogProject %1 bestaat niet, heeft u de map met deze naam hernoemt of verwijderd ?RProject %1 does not exist, did you rename or remove the directory what that name ?OpenProjectDialog4Project bestaat niet! (%1)Project does not exist! (%1)OpenProjectDialog*Selecteer Project mapSelect Project DirOpenProjectDialognSelecteer een project en klik opnieuw op de "Laad" knop2Select a project and click the 'Load' button againOpenProjectDialog"Selecteer ProjectSelected ProjectOpenProjectDialogIn deze map kunt u geen wijzigingen aanbrengen (Geen schrijfrechten)!(This directory is not writable by you! OpenProjectDialog*Traverso - InformatieTraverso - InformationOpenProjectDialog Traverso - VraagTraverso - QuestionOpenProjectDialog.Traverso - WaarschuwingTraverso - WarningOpenProjectDialog<Kon Project map niet aanmaken!%Unable to create Project directory! OpenProjectDialogHU dient een projectnaam op te geven!'You must supply a name for the project!OpenProjectDialog@PADriver:: fout in PortAudio: %1PADriver:: PortAudio error: %1PADriver`PADriver:: Portaudio kon hostapi %1 niet vinden!1PADriver:: hostapi %1 was not found by Portaudio!PADriverJ<html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">PortAudio Driver:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">De driver voor de PortAudio backend</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">PortAudio ondersteund verschillende driver backends. Voor sommige hiervan heeft Traverso ook rechtstreekse ondersteuning. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">In die gevallen is het aan te raden om voor Traverso's rechtstreekse drivers te kiezen, en niet deze van PortAudio. Soms, als de rechtstreekse drivers problemen geven, is het het proberen waard, om PortAudio samen met de onrechtstreekse drivers te proberen!</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">PortAudio zorgt voor transparente driverondersteuning voor verschillende platforumen, onder andere Windows (met de wmme, direct x en asio opties), en Mac OS X (met de CoreAudio en jack opties)</p></body></html>

PortAudio Driver:

The driver which should drive the PortAudio backend

PortAudio supports many driver backends, some of which Traverso has native support for too.

It is recommended to use Traverso's native drivers instead of using PortAudio's, however, if the native drivers give problems, you might try the ones supplied by PortAudio instead!

PortAudio provides transparent driver support for multiple platforms, including Windows (see the wmme, direct x and asio options), and Mac OS X (see the CoreAudio and jack options)

 PaDriverPage DriverDriver PaDriverPageFormForm PaDriverPagePortaudio drivers PaDriverPagen<html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Read buffer size:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">De hoeveelheid audio data die in de leesbuffers opgeslagen kan worden (sec).</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">De standaardwaarde van 1 seconde is een goede keuze.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Als uw computer over weinig geheugen beschikt, kunt u deze waarde verlagen.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Als u buffer-underruns ervaart, bijvoorbeeld wanneer de harde schijf (bijna) verzadigd is, </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">of wanneer u vaak buffer-underruns hebt, kunt u de waarde verhogen. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Waarden zoals 1.5 of 2.0 seconden zijn dan goede keuzes. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Het nadeel van grotere buffers, is dat het verplaatsen van de playhead naar andere posities </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">veel langer zal duren, daar alle buffers (n voor iedere audioclip * het aantal kanalen)</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> eerst volledig opnieuw gevuld moeten worden!</p></body></html> +

Read buffer size:

The amount of audio data that can be stored in the

read buffers in seconds.

The default value of 1 second should do just fine.

However, if you're tight on memory, you can make this value lower.

If you experience buffer underruns when the hard disk bandwidth is

(almost) saturated, or when buffer underruns happen regularly due

the hard disk can't keep up for some reason, you can try a larger

value, like 1.5 or 2.0 seconds.

Keep in mind that when using a larger buffer,

it will take considerably more time to move (i.e. seeking)

the playhead to another positions, since all the buffers

(one for each audioclip * channel count) need to be refilled!

PerformanceConfigPage<html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Versnelt het renderen van AudioClips en Tracks door gebruik te maken van</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">de 3D engine van uw grafische kaart.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Afhankelijk van uw type grafische kaart, en de driver support, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">kan dit het renderen duidelijk versnellen!</p></body></html>8

Accelerates the painting of AudioClips and Tracks by using

the 3D engine of your graphics card.

Depending on your graphics card and driver support, this

can speed up painting considerably!

PerformanceConfigPage<html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Het aantal maal per seconde dat Traverso de grafische elementen op uw scherm</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">hertekend, tijdens een drag &amp; drop actie, zoals het verplaatsen van een audioclip,</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">of het veranderen van de gain.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">De standaardwaarde van 35 maal per seconde is een goed compromis </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">tussen vloeiend beeld, en laag processorgebruik.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Als u het renderen niet vloeiend genoeg vindt,</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">kunt u deze waarde verhogen. Dit vergt echter een stuk meer van uw processor</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Indien het verplaatsen van een AudioClip nog teveel processoractiviteit veroorzaakt,</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">is het aangeraden om deze waarde wat te verlagen.</p></body></html> ~

The number of times per second at which the Graphical

Items are repainted during a jog action, like moving an

AudioClip, or changing the Gain.

The default frames per second of 35 is a perfect compromise

between smooth painting, and low cpu usage.

However, if you find the painting to be not smooth enough,

change this value to a higher one, but keep in mind that it

will consume considerably more cpu!

If for example moving an AudioClip still takes to much cpu,

you should consider to lower this value.

PerformanceConfigPage4Bufferen van Audio bestandAudio file bufferingPerformanceConfigPageHet veranderen van de buffer grootte wordt pas doorgevoerd na het opnieuw laden van het project.QChanging the buffer size only will take into effect after (re)loading a project.PerformanceConfigPageFormFormPerformanceConfigPage<Jog verversings snelheid (fps)Jog repaint speed (fps)PerformanceConfigPage"Grafisch renderenPaintingPerformanceConfigPage&Lees buffer grootteRead buffer size (seconds)PerformanceConfigPage8Gebruik hardware acceleratieUse hardware accelerationPerformanceConfigPage Informatie icoon info iconPerformanceConfigPage&Voeg Plugin toe aanAdd Plugin tooPluginSelectorDialogAnnuleerCancelPluginSelectorDialog In/OutIn/OutPluginSelectorDialogOKOKPluginSelectorDialogPlugin Naam Plugin NamePluginSelectorDialog&Plugin SelecteerderPlugin SelectorPluginSelectorDialogTypeTypePluginSelectorDialogImporting file %1 of %2: %p%ProgressToolBar(Voortgangs IndicatorProgress ToolbarProgressToolBar*Kan map %1 niet makenCannot create dir %1ProjectProject gegevensbestand kon niet met schrijfrechten worden geopend! (Bestand: %1, Reden: %2)HCouldn't open Project properties file for writing! (File %1. Reason: %2)Project*Project %1 aangemaaktCreated new Project %1ProjectlTe luid signaal gedecteerd in gexporteerde audio! (%1))Detected clipping in exported audio! (%1)ProjectHet export proces is reeds gestart, U kunt dit geen tweede maal starten!2Export already in progress, cannot start it twice!Project$Project %1 geladenProject %1 loadedProject*Project %1 opgeslagenProject %1 saved ProjectProject %1: project.tpf bestand kan niet worden geopend! (Reden: %2)6Project %1: Cannot open project.tpf file! (Reason: %2)ProjectProject %1: Interpreteren van bestand project.tpf is mislukt! (Reden: %2):Project %1: Failed to parse project.tpf file! (Reason: %2)ProjectpProject Bestand Versie ongelijk, kan Project niet laden!%1 bestanden moeten omgezet worden</b>Need to convert %1 filesProjectConverter:Omzetting met succes afgerondConversion finished succesfullyProjectConverterOmzetting stopgezet op verzoek van de gebruiker. U kunt het Project blijven gebruiken met Traverso <= 0.41.0, of het opnieuw openen met deze versie van Traverso om de omzetting opnieuw te startenConversion stopped on user request, you can continue to use this Project with Traverso <= 0.41.0, or reopen it with this version of Traverso and start the conversion againProjectConverterVConverteren project.tpf bestand..... Klaar!&Converting project.tpf file..... Done!ProjectConverterProject gegevensbestand kon niet met schrijfrechten worden geopend! (Bestand: %1, Reden: %2)HCouldn't open Project properties file for writing! (File %1. Reason: %2)ProjectConverterZOmschrijving voor omzetting niet beschikbaar!$No conversion description available!ProjectConverter$Project %1 omgezetProject %1 convertedProjectConverterProject %1: Interpreteren van bestand project.tpf is mislukt! (Reden: %2):Project %1: Failed to parse project.tpf file! (Reason: %2)ProjectConverterProject bestand met versie %1 kan niet worden omgezet, alleen mogelijk met versie 2 bestanden!PProject file with version %1 cannot be converted, only files with version 2 can!ProjectConverter`Opslaan omgezette project.tpf bestand.... Klaar!+Saving converted project.tpf file.... Done!ProjectConverterjStart met omzetten Project van versie 2 naar versie 37Starting to convert Project from version 2 to version 3ProjectConverterSluitenCloseProjectConverterDialog Omzet informatieConversion informationProjectConverterDialogOmzet voortgangConversion progressProjectConverterDialogLaad Project Load ProjectProjectConverterDialog Project OmzetterProject ConverterProjectConverterDialog#Project XXX (no translation needed)ProjectConverterDialogStart omzettingStart conversionProjectConverterDialogStop omzettingStop conversionProjectConverterDialog-ProjectInfoWidgetBit diepteBitdepthProjectInfoWidgetProjectProjectProjectInfoWidget4Project informatie vensterProject Information WidgetProjectInfoWidgetSample-rateRateProjectInfoWidgetSongsProjectInfoWidget*Kan map %1 niet makenCannot create dir %1ProjectManagerVKies een map om uw Projecten in op te slaan,Choose a directory to store your Projects inProjectManagerLKan Project map niet hernoemen naar %1(Could not rename Project directory to %1ProjectManagerVDe volgende Project map werd aangemaakt: %1/Created new Project directory for you here: %1 ProjectManagerTStandaard Project aangemaakt door Traverso#Default Project created by TraversoProjectManagerpWilt u voor het afsluiten het Project eerst nog opslaan?/Do you want to save the Project before quiting?ProjectManagerDEr is geen Project om op te slaan!3No Project to save, open or create a Project first!ProjectManageroNo directory was selected, to retry open the 'Open Project Dialog' and click 'Select Project Directory' button ProjectManagerControleert u alstublieft de rechten voor deze map of kies een andere:%1FPlease check permission for this directory or choose another one: %1ProjectManagerXControleer toegangsrechten voor deze map: %1.Please check permission for this directory: %1ProjectManager,Project %1 bestaat al!Project %1 already exists!ProjectManagerProject %1 kon niet gevonden worden! (Heeft u de Project map verwijderd of een andere naam gegeven ?)WProject %1 no longer could be found! (Did you remove or rename the Project directory ?)ProjectManagerProject bestand backup: Het Project bestand %1 kon niet voor lezen worden geopend (Reden: %2)TProjectfile backup: The project file %1 could not be opened for reading (Reason: %2)ProjectManagerProject opslaan Save ProjectProjectManagerIn deze map kunt u geen wijzigingen aanbrengen (Geen schrijfrechten)!(This directory is not writable by you! ProjectManager.Traverso - WaarschuwingTraverso - WarningProjectManager<Kon Project map niet aanmaken!%Unable to create Project directory! ProjectManager8Kan Project %1 niet aanmakenUnable to create new Project %1ProjectManager2Kan Project %1 niet ladenUnable to load Project %1ProjectManagerVMaakt gebruik van bestaande Project map: %1%Using existing Project directory: %1 ProjectManager"Opnieuw uitvoeren

Redo last change

ProjectManagerDialogOngedaan maken

Undo last change

ProjectManagerDialogAdult ContemporaryProjectManagerDialogAlternative RockProjectManagerDialog Arrangement doorArrangerProjectManagerDialogCD TekstCD TextProjectManagerDialog ChildrensProjectManagerDialog ClassicalProjectManagerDialogContemporary ChristianProjectManagerDialogHKan niet naar bestand %1 schrijven !"Couldn't open file %1 for writing!ProjectManagerDialogCountryProjectManagerDialog(Nieuw Sheet aanmakenCreate new SheetProjectManagerDialogDanceProjectManagerDialogVerwijderenDeleteProjectManagerDialogBeschrijving DescriptionProjectManagerDialogDialoogDialogProjectManagerDialogSchijf ID:Disc ID:ProjectManagerDialogEasy ListeningProjectManagerDialogEngineerEngineerProjectManagerDialog$Geef Sjabloon naamEnter Template nameProjectManagerDialogEroticProjectManagerDialogExporteerExportProjectManagerDialogFolkProjectManagerDialog Genre:Genre:ProjectManagerDialogGospelProjectManagerDialogHip HopProjectManagerDialogInformatief InformationalProjectManagerDialogJazzProjectManagerDialogLatinProjectManagerDialog LengteLengthProjectManagerDialogBerichtMessageProjectManagerDialogMusicalProjectManagerDialogNew AgeProjectManagerDialogNieuw Sheet New SheetProjectManagerDialogHGeen nieuwe Werkblad naam opgegeven!No new Sheet name was supplied!ProjectManagerDialogOperaProjectManagerDialogOperetteProjectManagerDialogUitvoerder PerformerProjectManagerDialog Pop MusicProjectManagerDialogProjectProjectProjectManagerDialogProject met titel '%1' bestaat al, wilt u a.u.b. een andere titel opgeven!IProject with title '%1' allready exists, please supply a different title!ProjectManagerDialogRapProjectManagerDialogReggaeProjectManagerDialogHernoemenRenameProjectManagerDialogRhythm and BluesProjectManagerDialog Rock MusicProjectManagerDialog Sjabloon opslaan Save TemplateProjectManagerDialog<Project Sjabloon %1 opgeslagenSaved Project Template: %1ProjectManagerDialog&Geselecteerde SheetSelected SheetProjectManagerDialogSheet naam Sheet NameProjectManagerDialogSheet(s)Sheet(s)ProjectManagerDialog SheetsSheetsProjectManagerDialogLied schrijver SongwriterProjectManagerDialog Sound EffectsProjectManagerDialog Spoken WordProjectManagerDialogSjabloonTemplateProjectManagerDialogtSjabloon met naam %1 bestaat al! Wilt u het overschrijven?CTemplate with name %1 already exists! Do you want to overwrite it?ProjectManagerDialog TitelTitleProjectManagerDialog TracksTracksProjectManagerDialog*Traverso - InformatieTraverso - InformationProjectManagerDialogUPC EAN:UPC EAN:ProjectManagerDialog2Kan map %1 niet aanmaken!Unable to create directory %1!ProjectManagerDialogNiet opgegeven UndefinedProjectManagerDialogOngebruiktUnusedProjectManagerDialog World MusicProjectManagerDialogredoteksredotextProjectManagerDialogUndotekstundotextProjectManagerDialog8Een fatale fout vond plaats.A fatal error occurred.QObjectFTijdsoverschrijding plaatsgevonden.A timeout occurred.QObjecttEr vond een fout plaats tijdens het lezen van het bestand.-An error occurred when reading from the file.QObjectvEen fout vond plaats tijdens het schrijven van het bestand.+An error occurred when writing to the file.QObjectZEen niet nader omschreven fout is opgetreden.An unspecified error occurred.QObject AudioClipQObjectCurveQObject CurveNodeQObject FadeCurveQObjectMarkerQObject Er was geen foutNo error occurredQObject Resourc errorQObjectWerkbladSheetQObject:Geen toegang tot het bestand.The file could not be accessed.QObjectJBestand kon niet worden gedupliceerd.The file could not be copied.QObjectHHet bestand kon niet worden geopend.The file could not be opened.QObjectNHet bestand kon niet worden verwijderd.The file could not be removed.QObject`Het bestand kon geen andere naam worden gegeven.The file could not be renamed.QObjectdGrootte van het bestand kon niet worden veranderd.The file could not be resized.QObject6De bewerking is afgebroken.The operation was aborted.QObjecthDe positie in het bestand kon niet worden veranderd..The position in the file could not be changed.QObjectTijdlijnTimeLineQObject TrackTrackQObjectOnbekende fout Unknown errorQObject

Traverso: Getting Started

When you record or import an audio file into Traverso, it shows up as an Audio Clip in one of the horizontal Tracks in the current Sheet. You can edit many aspects of these Clips by placing the mouse pointer over a Clip and pressing or holding different keys on your keyboard and mouse. You can also change settings of a Track, the Sheet as a whole, and other objects in the Sheet.

To see a list of what commands are available for any given object in the Sheet, move the mouse over that object, and Right-Click (or press Q). The keyboard shortcuts for each command are shown in the menu. The notation used is shown below.

< K > means press and release the K key. (Like a click.)

<< K >> means press the K key two times fast. (Like a double click.)

[ K ] means drag the mouse while holding down the K key.

< KL > means press the K and L keys at the same time.

[ KL ] means drag the mouse while holding down the K and L keys at the same time.

Here are some basic commands:

< SPACE > is Play/Stop.

< SHIFT > sets the Playhead. (Blue vertical line where playing starts.)

< W > sets the Work Cursor. (Red vertical line.)

< V > moves the Playhead back to the Work Cursor.

[ D ] move objects around (Audio Clip, Curve Nodes, etc)

[ Z ] zooms in and out.

[ TAB ] scroll omnidirectional (aka Shuttle)

And some Audio Clip Commands:

[ E ] drags a Clip's left or right edge.

[ F ] adjusts the length of a Clip's Fade In / Fade Out.

[ G ] addust the Gain of a clip (also works on Tracks, Sheet)

< X > splits the Clip at the cursor's position.

For more information, right-click on everything, or check out the Traverso manual.

QuickStartDialog0Traverso: Om te beginnenTraverso: Getting StartedQuickStartDialogHHet bestand kon niet worden geopend.Could not open file ReadSource.Bestand heeft 0 kanalenFile has zero channels ReadSource.Ongeldig aantal kanalenInvalid channel count ReadSourceNo ReadSource error set ReadSource StilteSilence ReadSource2Het bestand bestaat niet!The file does not exist! ReadSource k

WAV : A format without compression. Uses more hard disk space then compressed encoding formats, but needs very little cpu.

Limits : ~ 1.7 hours of recording time @ Stereo - 44.1 KHz

WavPack : A format with compression, up to 2 times smaller compared to WAV, and no quality loss. Uses significantly more cpu then WAV, but with modern (year 2005 and above) cpu's this shouldn't be a problem.

Using this format stresses the hard disk much less, increasing hard disk live, and less chance of saturating the hard disk bandwidth.

Limits : ~ 5 hours recording time @ Stereo - 44.1 KHz

WAV64 : WAV format with 64 bit header, support by other programs is currently limited.

Limits : None, thousands of hours of recording time, supposed that your hard disk can hold it.

RecordingConfigPage <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Deze optie reduceert de grote van het bestand bij sommige floating-point geluids-data tot wel 10%. Het heeft vrijwel geen effect op de kwaliteit van het geluid.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Technisch gesproken is de compressie niet langer lossless, maar behoud het wel al de voordelen van floating point audio (&gt;600 dB dynamisch bereik, geen clipping en 25 bit resolutie). </p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Het heeft ook effect bij comprimeren van 32 bit integer audio data door te comprimeren naar 24 bit resolutie.</p></body></html>B

This option reduces the storage of some floating-point data files by up to about 10% by eliminating some information that has virtually no effect on the audio data.

While this does technically make the compression lossy, it retains all the advantages of floating point data (>600 dB of dynamic range, no clipping, and 25 bits of resolution).

This also affects large integer compression by limiting the resolution to 24 bits.

RecordingConfigPage BesteBestRecordingConfigPageCompressie typeCompression typeRecordingConfigPageLStandaard exporteer resample kwaliteitDefault export resample qualityRecordingConfigPage6Activeer afspeel resampling,Enable on the fly resampling (Playback only)RecordingConfigPage Encoding formaatEncoding formatRecordingConfigPageSnelFastRecordingConfigPageFormRecordingConfigPageHoogHighRecordingConfigPageNormaalMediumRecordingConfigPage4Afspeel resample kwaliteitOn the fly resample qualityRecordingConfigPageOpnemen RecordingRecordingConfigPage ResamplingRecordingConfigPagedSla WVX over voor extra compressie (semi-lossless).Skip WVX for extra compression (semi-lossless)RecordingConfigPageWavPack optiesWavPack optionsRecordingConfigPageBronnenbeheerder: ontving aanvraag om Audio Bron %1 te verwijderen, maar het is nog steeds in gebruik door %2 AudioClips!! Aanvraag geweigerd!wResourcesManager: Received request to remove Audio Source %1but it is still in use by %2 AudioClips!!. NOT removing it!ResourcesManagerzBronnenbeheerder:: Kon Bron %1 niet initializeren (Reden: %2)CResourcesManager:: Failed to initialize ReadSource %1 (Reason: %2)ResourcesManager EindeEndResourcesWidgetBestandenFilesResourcesWidgetFormFormResourcesWidget LengteLengthResourcesWidgetNaamNameResourcesWidgetBronnenSourcesResourcesWidget StartStartResourcesWidget--RestoreProjectBackupDialog,Huidige datum en tijd:Current date and time:RestoreProjectBackupDialog DatumDateRestoreProjectBackupDialogLaatste backup: Last backup:RestoreProjectBackupDialog0Herstel vanaf een backupRestore from backup RestoreProjectBackupDialog^Selecteer de datum van de te herstellen backup.,Set the date to restore the selected backup.RestoreProjectBackupDialogTijdTimeRestoreProjectBackupDialogUiterlijk AppearanceSettingsDialogAudio Opties Audio OptionsSettingsDialogAlgemeenBehaviorSettingsDialogToetsenbordKeyboardSettingsDialogPrestaties PerformanceSettingsDialog*Voorkeuren - TraversoPreferences - TraversoSettingsDialogGeluids Systeem Sound SystemSettingsDialogTrack toevoegen Add TrackSheetnHet begin frame voor exporteren ligt n het eind frame!3Export start frame starts beyond export end frame!!SheetvProbeert te exporteren naar een wav-bestand met 0 kanalen??/Export tries to render to 0 channels wav file??SheetFKon WriteBuffer niet op tijd leggen#Failed to empty WriteBuffer in timeSheetDKon ReadBuffer niet op tijd vullen!Failed to fill ReadBuffer in timeSheet^Overbelasting van de harde schijf gedetecteerd!Hard Disk overload detected!SheetHGeen Tracks geactiveerd voor opname!No Tracks armed for recording!Sheet6Geen artiest naam opgegevenNo artists name setSheetZGeen audio te exporteren! (Is alles gemuted?)*No audio to export! (Is everything muted?)Sheet(Opnemen naar %n Clip*Opnemen naar %n ClipsRecording to %n Clip(s)Sheet"Track verwijderen Remove TrackSheetUntitledSheet--SongInfoWidgetGainGainSongInfoWidgetSMPTESongInfoWidgetSnapSongInfoWidgetLiedSongSongInfoWidgetSongInfoWidgetSongInfoWidgetZoomSongInfoWidgetHz HzSpectralMeterConfigWidget&Afsluiten&CloseSpectralMeterConfigWidget10241024SpectralMeterConfigWidget20482048SpectralMeterConfigWidget256256SpectralMeterConfigWidget40964096SpectralMeterConfigWidget512512SpectralMeterConfigWidget81928192SpectralMeterConfigWidgetGeavanceerdAdvancedSpectralMeterConfigWidget.Geavanceerde FFT OptiesAdvanced FFT OptionsSpectralMeterConfigWidgetToepassenApplySpectralMeterConfigWidgetBlackmanSpectralMeterConfigWidgetFFT Groote: FFT Size:SpectralMeterConfigWidget2FFT-Spectrum ConfiguratieFFT-Spectrum ConfigurationSpectralMeterConfigWidget"Frequencie BereikFrequency RangeSpectralMeterConfigWidgetHammingSpectralMeterConfigWidgetHanningHanningSpectralMeterConfigWidgetLage Limiet: Lower Limit:SpectralMeterConfigWidgetLage dB waarde:Lower dB value:SpectralMeterConfigWidgetAantal banden:Number of bands:SpectralMeterConfigWidgetRechthoek RectangleSpectralMeterConfigWidget:Gemiddelde spectrum weergevenShow average spectrumSpectralMeterConfigWidgetHoge Limiet: Upper Limit:SpectralMeterConfigWidgetHoge dB waarde:Upper dB value:SpectralMeterConfigWidget$Windowing functie:Windowing function:SpectralMeterConfigWidget:Exporteer gemiddelde dB curveExport average dB curveSpectralMeterViewFFT: Met < M > kunt gemiddelde curve activeren om data te genereren5FFT: Enable avarage curve with < M > to generate dataSpectralMeterViewFFT: Gemiddelde Curve niet in gebruik, er is geen data om te exporteren!/FFT: No avarage curve used, not data to export!SpectralMeterViewZFFT: Geen gemiddele waarden om te exporteren!FFT: No avarage data to export!SpectralMeterViewbFFT: Kon schermafdruk niet opslaan op hard schijf0FFT: Unable to write captured image to hard diskSpectralMeterView Uitvoer formaat:Output format:SpectralMeterView4Scherm afdruk bestand naamScreen Capture file nameSpectralMeterView2Selecteer uitvoer formaatSelect output formatSpectralMeterViewClip knippen Split Clip SplitClip$Systeem InformatieSystem InformationSysInfoToolBar - %SystemInfoWidget- GB- GBSystemInfoWidgetKaart Naam (na)Card Name (na)SystemInfoWidget4Systeem informatie vensterSystemInfoWidgetSystemInfoWidgetbitdepthSystemInfoWidgetBuffer grootebuffer size (na)SystemInfoWidget driver type (na)drivertype (na)SystemInfoWidgetAfbeeldingimageSystemInfoWidget latency (na)SystemInfoWidgetraterateSystemInfoWidget xruns (na)SystemInfoWidget$Lees Buffer StatusRead Buffer StatusSystemResources*Schrijf Buffer StatusWrite Buffer StatusSystemResources Marker toevoegen Add MarkerTimeLine$Marker verwijderen Remove MarkerTimeLine Marker toevoegen Add Marker TimeLineView&Markers verwijderen Clear Markers TimeLineView$Marker verplaatsen Drag Marker TimeLineView EindeEnd TimeLineViewbU moet eerst alle andere Markeerders verwijderen.+You have to remove all other markers first. TimeLineViewClip toevoegenAdd ClipTrackVerwijder Clip Remove ClipTrackAnderen mutenSilence OthersTrackTrack: AudioClip met id %1 niet gevonden in Resources database!BTrack: AudioClip with id %1 not found in Resources database!TrackTrack Pan Track PanTrackPanTrack Pan: %1 Track Pan: %1TrackPan2Geef de nieuwe Track naamEnter new Track name TrackView&Verander Track naamSet Track name TrackViewTrack %1: %2 Track %1: %2 TrackView*Volgende snap positieNext Snap PositionTransportConsoleWidgetStart / Stop Play / StopTransportConsoleWidget&Vorige snap positiePrevious Snap PositionTransportConsoleWidgetOpnemenRecordTransportConsoleWidgetXOpnemen naar %1 Tracks, encoding formaat: %2+Recording to %1 Tracks, encoding format: %2TransportConsoleWidget"Spring naar einde Skip to EndTransportConsoleWidget"Spring naar Start Skip to StartTransportConsoleWidget(Alles (De)Selecteren(De)Select AllTraversoCommands Arm TracksTraversoCommandsClip kopieren Copy ClipTraversoCommandsNaar benedenDownTraversoCommands Rand verplaatsen Drag EdgeTraversoCommands"Externe bewerkingExternal ProcessingTraversoCommandsFold Markers Fold MarkersTraversoCommands Fold SheetTraversoCommands Fold TrackTraversoCommandsGainGainTraversoCommands Gain: Herstellen Gain: ResetTraversoCommandsHorizontaal HorizontalTraversoCommandsHorizontaal In Horizontal InTraversoCommandsHorizontaal UitHorizontal OutTraversoCommandsImporteer Audio Import AudioTraversoCommandsStilte invoegenInsert SilenceTraversoCommands LinksLeftTraversoCommands Clip verplaatsen Move ClipTraversoCommandsJClip: Verplaatsen of grootte wijzigenMove Or Resize ClipTraversoCommandsNieuwe Track New TrackTraversoCommandsAlle kantenOmnidirectionalTraversoCommandsPanoramaTraversoCommands*Panorama:: HerstellenPanorama: ResetTraversoCommandsVerwijder Clip Remove ClipTraversoCommands"Track verwijderen Remove TrackTraversoCommands RechtsRightTraversoCommandsKnippenSplitTraversoCommandsNaar bovenUpTraversoCommandsVertikaalVerticalTraversoCommandsVertikaal In Vertical InTraversoCommandsVertikaal Uit Vertical OutTraversoCommandstraverso-0.49.4/resources/translations/traverso_cs.ts000644 001750 001750 00001042126 11430303020 023404 0ustar00remonremon000000 000000 AddRemoveClip Remove Clip Odstranit ukázku Remove Selected Clips Odstranit vybrané ukázky AlsaDevicesPage Form Formulář ALSA Device ALSA zařízení <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Device:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The real or virtual ALSA device to be used.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A real device is the audiocard installed in your system.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A virtual device is one created in the .asoundrc file, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">often located in your home folder.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If unsure, use either the default device, this will use the audiodevice </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">configured by your distribution, or the device that names your audio card.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">In the latter case, please make sure no application uses the audiocard, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">else the driver won't be able to initialize!</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">For more info see chapter 3.1: "The Driver Backend" of the User Manual</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Zařízení:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Použít skutečné nebo virtualní zařízení ALSA.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Skutečným zařízením je zvuková karta instalovaná ve Vašem systému.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Virtuální zařízení bylo vytvořeno v souboru: .asoundrc, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> který je často umístěn ve Vaší domovské složce.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Jestliže si nejste jistí, použijte výchozí zařízení. Toto bude použito jako zvukové zařízení. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Konfigurováno Vaší distribucí, nebo zařízením, které pojmenovává Vaši zvukovou kartu.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ve druhém případě se, prosím, ujistěte, že žádná aplikace nepoužívá Vaši zvukovou kartu, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">jinak by ovladač nebyl schopen inicializovat!</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Kvůli dalším informacím si prohlédněte kapitolu 3.1: "The Driver Backend - Backend (zadní část) ovladače" v uživatelské příručce</p></body></html> Device Zařízení <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Number of Periods:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Audio is managed in small chunks called periods. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This value determines how many of these chunks are </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">to be used by the driver of the audiocard.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The default should work just fine, and gives optimal latency behavior.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">However, some (buggy) alsa drivers don't work correctly </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">with the default of 2, if you experience very choppy audio, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">please try to use 3 periods.</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Číslo period:</span> </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Zvuk je spravován v malých kouscích nazývaných periody. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Tato hodnota určuje, kolik je těchto kousků, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">které může použít ovladač zvukové karty.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Výchozí hodnota by měla pracovat dobře, a podává optimální chování latence.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Bohužel některé ALSA ovladače obsahující programové chyby nepracují korektně </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">s výchozí hodnotou 2, pokud získáte velice kostrbatý zvuk, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">prosím, pokuste se použít hodnotu periody 3.</p></body></html> Nr. of periods Číslo periody 2 2 3 3 <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Dither is used to make the audio cleaner. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The best way to describe it is to imagine a painting with many dots. If you view it up close you can see each dot and the image is not very clear. If you view it from far away the image becomes clearer because your eyes/brain dither the dots to smooth out the image. It is a murky subject and obviously a very personal choice as to what dither is the best. For most people it is just plain magic. Anyone running at 16bit who cares about quality or has CPU cycles to spare should run with dither. Triangular is probably the best compromise of quality vs cpu cost (its very fast), but shaped is the best</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Rozmýšlení se je využíváno k tomu, aby byl zvuk čistější. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Nejlepším způsobem, jak to popsat, je představit si malování s mnoha tečkami. Jestliže se na ně podíváte zblízka, uvidíte každou tečku a obraz není moc jasný. Jestliže se na ně budete dívat z dálky, obraz se stane jasnějším, protože Vaše oči/mozek nechají tečky, aby se začaly třást, aby se tím uhladil celkový dojem. Jde potom o nejasnou předlohu a zvláště pak o velmi osobní volbu, jak určit, které roztřesení je nejlepší. Pro většinu lidí to představuje úplnou magii. Kdokoli běžící na 16bitech, jenž se stará o kvalitu nebo má nazbyt výpočetního času CPU by měl použít "třesení". Trojúhelníkové (Triangular) je pravděpodobně nejlepším kompromisem mezi kvalitou a velikostí použitých prostředků (CPU) (je velmi rychlé), ale tvarované je tím nejlepším</p></body></html> Dither Chvět se None Žádný Shaped Tvarovaný Rectangular Obdélníkový Triangular Trojúhelníkový AlsaDriver ALSA Driver: The playback device %1 is already in use. Please stop the application using it and run Traverso again ALSA ovladač: zařízení %1 umožňující playback se již používá. Prosím, zastavte aplikaci, která jej používá, a spusťte Traverso znovu ALSA Driver: You do not have permission to open the audio device %1 for playback ALSA ovladač: Namáte oprávnění otevřít zvukové zařízení %1 pro přehrávání snd_pcm_open(playback_handle, ..) failed with unknown error type snd_pcm_open(playback_handle, ..) selhalo (neznámý typ chyby) ALSA Driver: The capture device %1 is already in use. Please stop the application using it and run Traverso again ALSA ovladač: zachytávací zařízení %1 se již používá. Prosím, zastavte aplikaci, která jej používá, a spusťte Traverso znovu ALSA Driver: You do not have permission to open the audio device %1 for capture ALSA ovladač: Namáte oprávnění otevřít zvukové zařízení %1 pro zachytávání ALSA Driver: snd_pcm_open(capture_handle, ...) failed with unknown error type ALSA ovladač: snd_pcm_open(capture_handle, ...) selhalo (neznámý typ chyby) ALSA Driver: Cannot open PCM device %1 for playback. Falling back to capture-only mode ALSA ovladač: nelze otevřít PCM zařízení %1 pro playback. Ustoupilo se do zachytávání-pouze režimu ALSA: Cannot open PCM device %1 for capture. Falling back to playback-only mode ALSA ovladač: nelze otevřít PCM zařízení %1 pro zachytávání. Ustoupilo se do přehrávání-pouze režimu ALSA Driver: Unable to configure hardware, is it in use by another application? ALSA ovladač: neschopen konfigurovat technické vybavení počítače. Používá je jiná aplikace? AppearenceConfigPage Icons only Pouze ikony Text only Pouze text Text beside Icons Text vedle ikon Text below Icons Text pod ikonami Default Language Výchozí jazyk Select default project dir Vybrat výchozí adresář projektu Form Formulář Theme Téma Theme selector Volič témat Path to theme files Cesta k souborům tématu Available themes Dostupná témata Adjust theme color Nastavit barvu tématu Theme Options Volby tématu Paint audio rectified Barva pro zobrazení zvuku upravena <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Painting the waveform with an outline is more detailed, but requires more cpu.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If you experience slowness when painting many clips, or during animated scroll, unselect this option!</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Vykreslování časového průběhu vlny s obrysem je podrobnější, ale vyžaduje více výkonu procesoru.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Jestliže máte zkušenost se zpomalením při vykreslování mnoha ukázek, nebo během animovaného rolování, zrušte výběr této volby!</p></body></html> Paint audio with outline Barva pro zobrazení zvuku s obrysem Paint stereo audio as mono audio Barva pro zobrazení stereofonního zvuku jako u monofonního zvuku Draw lines at 0 and -6 dB Nakreslit čáry na 0 a -6 dB Style Options Volby stylu Select style Vybrat styl Use selected style's palette Použít paletu vybraného stylu Toolbars Nástrojové lišty Icon size Velikost ikon Button style Styl tlačítek Transport Console size Velikost transportní konzole Language Jazyk Interface Language Jazyk uživatelského rozhraní Changing the language of the Interface will take effect after restarting Traverso! Změna jazyka uživatelského rozhraní se projeví až po novém spuštění Traversa! ArmTracks Arm Tracks Aktivovat stopy AudioClip Unable to Record to Track Neschopen nahrávat do stopy AudioDevice doesn't have this Capture Bus: %1 (Track %2) Zvukové zařízení nemá tuto zachytávací sběrnici: %1 (Stopa %2) Toggle Mute Přepnout ztlumení Toggle Lock Přepnout uzamčení Remove Fades Odstranit prolínání Normalization Normalizace Set Normalization level: Nastavit úroveň normalizace: AudioClip: Normalize AudioClipEditDialog Dialog Dialog Clip Parameters Parametry ukázky External Processing Vnější zpracování hh:mm:ss.sss hh:mm:ss.sss TextLabel Textová jmenovka End Konec Length Délka Track start Začít stopu Gain Zesílení Name Název Fades Prolínání Fade In Postupné zesílení signálu Mode Režim Bending Ohýbání Strength Síla &Linear &Lineární &Default &Výchozí Fade Out Postupné slábnutí signálu Source AudioClipExternalProcessing Clip: External Processing Ukázka: vnější zpracování AudioClipManager Selection: Remove Clip Výběr: odstranit ukázku Selection: Add Clip Výběr: přidat ukázku Selection: Invert Výběr: invertovat AudioClipView Click to reset AudioFile ! Klepnout, aby mohl být zvukový soubor znovu nastaven! Reset Audio File for Clip: %1 Znovu nastavit zvukový soubor pro ukázku: %1 All files (*);;Audio files (*.wav *.flac) Všechny soubory (*);;Zvukové soubory (*.wav *.flac) No file selected! Nebyl vybrán žádný soubor! Succesfully set AudioClip file to %1 Soubor se zvukovou ukázkou byl úspěšně nastaven na %1 AudioDevice No Driver Loaded Nebyl nahrán žádný ovladač Audiodevice: Failed to create the Jack Driver Zvukové zařízení: došlo k selhání při vytváření ovladače Jack Audiodevice: Failed to create the ALSA Driver Zvukové zařízení: došlo k selhání při vytváření ovladače ALSA Audiodevice: Failed to create the PortAudio Driver Zvukové zařízení: došlo k selhání při vytváření ovladače PortAudio Audiodevice: Failed to create the PulseAudio Driver Zvukové zařízení: došlo k selhání při vytváření ovladače PulseAudio Audiodevice: Failed to create the CoreAudio Driver Zvukové zařízení: došlo k selhání při vytváření ovladače CoreAudio No Device Configured Nebylo uzpůsobeno žádné zařízení The Jack server has been shutdown! Jack server byl zastaven! AudioDevice:: Buffer underrun 'Storm' detected, switching to Null Driver Zvukové zařízení:: bylo zjištěno 'Storm' podtečení vyrovnávací paměťi. Přepíná se na nulový ovladač AudioDevice:: For trouble shooting this problem, please see Chapter 11 from the user manual! Zvukové zařízení:: Kvůli závadě způsobující tento problém, si, prosím, prohlédněte kapitolu 11 uživatelské příručky! AudioDeviceThread Unable to set Audiodevice Thread to realtime priority!!!This most likely results in unreliable playback/capture and lots of buffer underruns (== sound drops).In the worst case the program can even malfunction!Please make sure you run this program with realtime privileges!!! Neschopen nastavit vlákno zvukového zařízení na prioritu provádění v reálném čase! Toto je většinou výsledkem nespolehlivého zařízení umožňující přehrávání/zachytávání a mnoha podtečení vyrovnávací paměťi (== poklesy zvuku - sound drops). V nejhorším případě může dokonce dojít k selhání programu! Prosím, ujistěte se, že tento program spouštíte s privilegiem provádění v reálném čase! AudioDriverConfigPage System default Výchozí nastavení systému Form Formulář Driver Selection Výběr ovladače Driver: Ovladač: Configure driver Přizpůsobit ovladač <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Duplex mode:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Defines if both the Playback and Capture buses </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">of your soundcard are to be used, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">or only the Playback or Capture bus(es).</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;"> Duplexní režim:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Přesně stanovuje, jestli jsou používány obě sběrnice, přehrávání a zachycení, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Vaší zvukové karty současně, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">nebo pouze sběrnice přehrávání nebo pouze zachycení.</p></body></html> Duplex mode Duplexní režim (umožňující komunikaci oběma směry) Full Plný Playback Přehrávání Capture Zachytávání <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Sample rate:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The sample rate used by the audio card.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">New projects will use this samplerate as </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">the project's sample rate on creation.</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Vzorkovací kmitočet:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Vzorkovací kmitočet používaný zvukovou kartou.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Nové projekty budou používat tento vzorkovací kmitočet jako </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">svůj vzorkovací kmitočet při svém vytvoření.</p></body></html> Sample rate Vzorkovací kmitočet 22050 22050 32000 32000 44100 44100 48000 48000 88200 88200 96000 96000 <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Buffer latency:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The latency introduced by the size of the audio buffers.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Some people need low latencies, if you don't need it, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">or don't know what it means, please leave the default setting!</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> <span style=" font-weight:600;">Latence vyrovnávací paměťi:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Latence představovaná velikostí zvukové vyrovnávací paměťi.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Někteří lidé potřebují nízké latence. Jestliže toto nepotřebujete, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">nebo nevíte, co to znamená, prosím, opusťte za ponechání výchozího nastavení!</p></body></html> Buffer latency (ms) Latence vyrovnávací paměti (ms) Restart Driver Znovu spustit ovladač Jack Jack Enable Jack transport control Povolit Jack transportní ovladač AudioSourcesManagerWidget Form Formulář Remove sources Odstranit zdroje Remove source Odstranit zdroj Remove all sources Odstranit všechny zdroje Remove unused sources Odstranit nepoužívané zdroje AudioSources Zdroje zvuku BehaviorConfigPage Form Druh Project Settings Nastavení projektu On close: Na závěr: Save Uložit Ask Zeptat se Don't save Neukládat Load last used project at startup Nahrát naposledy používaný projekt na začátku New Sheet Settings Nastavení nového listu Number of tracks Počet stop Audio Clip Settings Nastavení zvukové ukázky Lock Audio Clips by default Uzamčít zvukové ukázky za použití výchozího nastavení Playback Settings Nastavení přehrávání <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Keep the play cursor in view while playing or recording.</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Při přehrávání nebo nahrávaní udržujte ukazatel (běžec) přehrávání před očima. .</p></body></html> Scroll playback Projíždět přehrávání Jump Skočit Stay Centered Zůstat ve středu Animated Kreslený Continuously adjust audio while dragging Souvisle upravovat zvuk při táhnutí BusSelectorDialog Bus Selector Volič sběrnice Track Stopa Capture Buses Zachytávací sběrnice Channels Kanály Both Oba Left Levý Right Pravý Playback Buses Sběrnice zařízení umožňujícího přehrávání CDWritingDialog CD Writing Zápis na CD General Options Všeobecné volby Write current Sheet Zapsat současný list Write all Sheets Zapsat všechny listy Calculate and apply normalization Vypočítat a použít normalizaci Export wav and toc files only (don't write CD) Exportovat pouze *.wav a *.toc soubory (nezapisovat na CD) Burning Device Vypalovací zařízení Number of copies Počet kopií Simulate Napodobit Speed Rychlost auto samočinně 1x 1x 2x 2x 4x 4x 8x 8x 12x 12x 16x 16x 20x 20x 24x 24x 28x 28x 32x 32x 36x 36x 40x 40x 44x 44x 48x 48x Status Stav Information Informace Start Writing Začít se zápisem Abort Přerušit Close Zavřít ClipSelection Selection: Remove Clip Výběr: odstranit ukázku Selection: Add Clip Výběr: přidat ukázku Select Clip Vybrat ukázku ClipsViewPort Import %n audiofile(s) Importovat %n zvukový soubor Importovat %n zvukové soubory Importovat %n zvukové soubory Crop AudioClip: Magnetic Cut Curve There is allready a node at this exact position, not adding a new node Přesně na této pozici je již uzel. Nebude přidán nový uzel Add CurveNode Přidat uzel křivky Remove CurveNode Odstranit uzel křivky CurveView Drag Node Táhnout uzel Clear Nodes Pročistit uzly Dialog Dialog Dialog OK OK Cancel Zrušit DigitalClock Digital Clock Digitální hodiny DriverInfo Change Audio Device settings Změnit nastavení zvukového zařízení ExportDialog Export Exportovat General Options Všeobecné volby Export current Sheet Exportovat současný list Export all Sheets Exportovat všechny listy Export directory Exportovat adresář Export status Exportovat stav - - Abort Export Zrušit export Start Export Zahájit export Close Zavřít ExportFormatOptionsWidget Best Nejlepší High Vysoká Medium Průměrná Fast Rychlý Bitrate Datový tok Average Bitrate Průměrný datový tok Maximum Bitrate Největší možný datový tok Export Format Options Volby exportu formátu Format Options Volby formátu Encoding Zakódování File Type Typ souboru Channels Kanály Normalize Audio Normalizovat zvuk Bitdepth Datová hloubka WavPack options (lossless compression) Volby WavPack (bezztrátová komprese) Compression type Druh komprese <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This option reduces the storage of some floating-point data files by up to about 10% by eliminating some information that has virtually no effect on the audio data. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">While this does technically make the compression lossy, it retains all the advantages of floating point data (&gt;600 dB of dynamic range, no clipping, and 25 bits of resolution). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This also affects large integer compression by limiting the resolution to 24 bits.</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Tato volba redukuje hromadění některých datových souborů s pohyblivou (desetinnou) čárkou až do asi 10% eliminací některých informací, které na zvuková data v podstatě nemají vliv. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">I když toto technicky způsobuje, že komprese je ztrátová, ponechává to všechny výhody dat s pohyblivou (desetinnou) čárkou (&gt;600 dB dynamického rozsahu, žádné stříhání, a rozlišení 25 bitů). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Také to rozsáhle ovlivní celkovou compresi omezením rozlišení na 24 bitů.</p></body></html> Skip WVX for extra compression (semi-lossless) Přeskočit WVX pro extra kompresi (na půl bezztrátová) Ogg Options Volby formátu Ogg Quality (Smallest <-> Best) Kvalita (nejmenší <-> nejlepší) Encoding Method Metoda zakódování MP3 Options Volby formátu MP3 Minimum Bitrate Nejmenší datový tok Quality (Fastest <-> Best) Kvalita (nejrychlejší <-> nejlepší) Sample Rate Vzorkovací kmitočet Conversion quality Kvalita převodu ExternalProcessingDialog You have to supply an argument before starting the external process! Předtím, než bude moci začít vnější proces, musíte doplnit nezávisle proměnnou! Program <b>%1</b> crashed! Program <b>%1</b> se zhroutil! Available arguments for the sox program Nezávisle proměnné, které jsou dostupné pro program sox Program <b>%1</b> not installed, or insufficient permissions to run! Program <b>%1</b> není nainstalován, nebo nemáte dostatečná oprávnění pro jeho spuštění! FadeBend Fade In: bend Postupné zesílení signálu: ohyb Fade Out: bend Postupné zeslabení signálu: ohyb FadeCurve Fade Preset Předvolba prolínání FadeMode Fade In: shape Postupné zesílení signálu: tvar Fade Out: shape Postupné zeslabení signálu: tvar FadeRange Fade In: length Postupné zesílení signálu: délka Fade Out: length Postupné zeslabení signálu: délka Fade In: remove Postupné zesílení signálu: odstranit Fade Out: remove Postupné zeslabení signálu: odstranit FadeStrength Fade In: strength Postupné zesílení signálu: síla Fade Out: strength Postupné zeslabení signálu: síla FileWidget My Computer Můj počítač My Documents Moje dokumenty Parent Directory Rodičovský adresář Refresh File View Obnovit náhled na soubor Import Import Audio File Importovat zvukový soubor Insert Silence Vložit ticho Silence Ticho All files (*) Všechny soubory (*) Audio files (*.wav *.flac *.ogg *.mp3 *.wv *.w64) Zvukové soubory (*.wav *.flac *.ogg *.mp3 *.wv *.w64) Import audio source Importovat zvukový zdroj ImportClipsDialog Import Audio Clips Importovat zvukové ukázky Import to Track: Importovat do stopy: Add Markers Přidat značky InputEngine Modifier key actions are not supported from Context Menu Akce podle blíže určujícího klíče nejsou podporovány z kontextového menu Hold actions are not supported from Context Menu Akce držení nejsou podporovány z kontextového menu Command Plugin %1 not found! Příkazový přídavný modul %1 nebyl nalezen! Plugin %1 doesn't implement Command %2 Přídavný modul %1 neprovádí příkaz %2 InsertSilenceDialog Insert Silence Vložit ticho Insert Silence (seconds): Vložit ticho (v sekundách): Interface History Historie Resources Bin Koš se zdroji Correlation Meter Měřič vzájemných vztahů FFT Spectrum FFT škála Traverso %1 (built with Qt %2) A multitrack audio recording and editing program. Look in the Help menu for more info. Traverso is brought to you by R. Sijrier and others, including all the people from the Free Software world who contributed the important technologies on which Traverso is based (Gcc, Qt, Xorg, Linux, and so on) Traverso %1 (sestaveno s Qt %2) Mnohastopý audionahrávací a upravovací program. Pro více informací se podívejte do nápovědy v hlavní nástrojové liště. Traverso Vám přináší R. Sijrier a další, v to zahrnuje všechny lidi ze světa svobodného softwaru, kteří přispěli důležitými technologiemi, na nichž je Traverso založeno (Gcc, Qt, Xorg, Linux, atd.) About Traverso O aplikaci Traverso &Project &Projekt &New... &Nový... &Open... &Otevřít... &Save &Uložit &Manage Project... &Spravovat projekt... &Export... &Exportovat... &CD Writing... &Zápis na CD... &Restore Backup... &Obnovit zálohu... &Quit &Ukončit &Edit &Upravovat Undo Vrátit zpět Redo Udělat znovu Import &Audio... Importovat &zvuk... Insert Si&lence... Vložit ti&cho... &Snap &Přichytit Snap items to edges of other items while dragging. Při přetahování přichytit položky k okrajům jiných položek. S&croll Playback P&rojíždět přehrávání Keep play cursor in view while playing or recording. Držet běžec označující pozici při přehrávání v dohledu, když se přehrává nebo nahrává. &Show Effects &Ukázat efekty Show effect plugins and automation curves on tracks Ukázat efektové přídavné moduly a křivky automatizace na stopách &View &Zobrazit Marker Editor... Upravovatel značek... Transport Console Transportní konzole Project Projekt Edit Upravovat System Information Informace o systému &Sheet &List New &Sheet(s)... Nový &list(y)... New &Track(s)... Nová &stopa(y)... Se&ttings Na&stavení &Recording File Format &Souborový formát používaný při nahrávání &Resample Quality &Kvalita převzorkování Best Nejlepší High Vysoká Medium Průměrná Fast Rychlý &Preferences... &Preference... &Help &Nápověda &Getting Started &Jak začít &User Manual &Uživatelská příručka &About Traverso &O aplikaci Traverso <b>Description</b> <b>Popis</b> <b>Key Sequence</b> <b>Klíčová sekvence</b> Open Audio Files Otevřít zvukové soubory Audio files (*.wav *.flac *.ogg *.mp3 *.wv *.w64) Zvukové soubory (*.wav *.flac *.ogg *.mp3 *.wv *.w64) %1: %2 %1: %2 Opening User Manual in external browser! Otevře uživatelskou příručku v externím prohlížeči! Traverso - Important Traverso - důležité A Project directory changed outside of Traverso. This is NOT supported! Please undo this change now! If you want to rename a Project, use the Project Manager instead! Adresář projektu se změnil na vně Traversa. To NENÍ podporováno! Prosím, vraťte nyní tuto změnu! Jestliže si přejete změnit název projektu, použijte místo toho projektový manažer! Traverso - Project load failed Traverso - selhalo nahrání projektu The requested Project `%1` could not be loaded for the following reason: '%2' You will now be given a list of available backups (if any) to restore the Project from. Požadovaný projekt `%1` nemohl být načten z následujících důvodů: '%2' Nyní dostanete seznam dostupných záloh (jestliže nějaké jsou), abyste z nich mohl projekt obnovit. Changed encoding for recording to %1 Způsob zakódování při nahrávání změněn na: %1 Changed resample quality to: %1 Kvalita převzorkování změněna na: %1 JackDriver Jack Driver: Couldn't connect to the jack server, is jack running? Ovladač Jack: Nebylo možné se spojit s Jack serverem. Je Jack spuštěn? Jack Driver: Connected successfully to the jack server! Ovladač Jack: Proběhlo úspěšné připojení k Jack serveru! KeyboardConfigPage No description set for this keymap Pro tuto mapu kláves není nastaven žádný popis KeyMap Export Export mapy kláves The exported keymap can be found here: %1 Exportovaná mapa kláves se nachází zde: %1 Form Formulář Configure Keyboard Přizpůsobit klávesnici <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Double fact timeout:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The maximum time in miliseconds between 2 key presses </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">to determine if the 2 key presses are a double fact ( &lt;&lt; K &gt;&gt; or &lt;&lt; KK &gt;&gt;)</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> or 2 individual key presses ( a &lt; K &gt; and &lt; K &gt; action, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">or &lt; KK &gt; and &lt; KK &gt; action for example).</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Experienced users can set this value as low as 150 ms, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">if you don't have much experience yet, please leave the default of 180 ms.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">For more information, see chapter 7: Key Actions. of the User Manual</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Dvojí skutečné přerušení:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Maximální čas v milisekundách mezi stisknutím dvou kláves: </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Je třeba rozhodnout, zda dva stisky kláves jsou skutečně dvojí stisknutí, ( &lt;&lt; K &gt;&gt; nebo &lt;&lt; KK &gt;&gt;)</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> nebo dvě individuální stisknutí klávesy ( a &lt; K &gt; a &lt; K &gt; akce, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">nebo &lt; KK &gt; a &lt; KK &gt; např. akce).</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Zkušení uživatelé mohou nastavit tuto hodnotu na 150 ms. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Jestliže ještě nemáte mnoho zkušeností, prosím, ponechejte výchozí hodnotu na 180 ms.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Abyste získal více informací, prohledněte si kapitolu 7: Key Actions (Klávesové akce) v Uživatelské příručce.</p></body></html> <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Bitstream Vera Sans; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Double fact timeout (ms)</p></body></html> <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Bitstream Vera Sans; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Dvojí skutečné přerušení (ms)</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Hold timeout:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The maximum time to consider a pressed key a hold key fact, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">like [ K ] or [ KK ].</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The shorter this time, the sooner a pressed key will be </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">detected as a hold action. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Experienced users can set this value as low as 110 ms, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">if you don't have much experience yet, please leave the default of 150 ms.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">For more information, see chapter 7: "Key Actions" of the User Manual.</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Držení přerušení:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Maximální čas, kdy je možno považovat stisknutou klávesu za skutečné držení klávesy, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">jako [ K ] nebo [ KK ].</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Čím je tento čas kratší, tím dříve bude stisknutá klávesa </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">zjištěna jako akce držení klávesy. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Zkušení uživatelé mohou nastavit tuto hodnotu na 110 ms, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Jestliže ještě nejste příliš zkušený, nastavte hodnotu na 150 ms.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Abyste získal více informací, prohledněte si kapitolu 7: Key Actions (Klávesové akce) v Uživatelské příručce.</p></body></html> <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Bitstream Vera Sans; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Hold timeout (ms)</p></body></html> <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Bitstream Vera Sans; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Držení přerušení (ms)</p></body></html> Keymap Mapa kláves Select keymap Vybrat mapu kláves Export Keymap Exportovat mapu kláves Print Keymap Tisknout mapu kláves LanguageName English The name of this Language, e.g. German would be Deutch Czech MarkerDialog Markers Značky Position Pozice Title Název Options Volby ISRC: ISRC: Apply to all Použít na vše ... ... Pre-Emphasis Před-zdůraznění Copy protection Ochrana proti kopírování Position: (MM:SS:75ths) Pozice: (MM:SS:75ths) CD-Text CD Text Title: Název: Performer: Účinkující: Composer: Skladatel: CD-Text optional Volitelný CD Text Songwriter Skladatel písní Arranger: Aranžér: Message: Vzkaz: &Remove &Odstranit &Export &Exportovat &Ok &OK &Cancel &Zrušit MoveClip Copy Clip Kopírovat ukázku Move Clip Přesunout ukázku Move Clip To Start Přesunout ukázku na začátek Move Clip To End Přesunout ukázku na konec Fold Sheet Přeložit list Fold Track Přeložit stopu Fold Markers Přeložit značky MoveEdge Move Clip Edge Přesunout okraj ukázky NewProjectDialog You must supply a name for the project! Musíte doplnit název projektu! Traverso - Question Traverso - dotaz The Project "%1" already exists, do you want to remove it and replace it with a new one ? Projekt "%1" již existuje. Chcete jej odstranit a nahradit novým? Yes Ano No Ne Couldn't create project (%1) Nelze vytvořit projekt (%1) Open Audio Files Otevřít zvukové soubory Audio files (*.wav *.flac *.ogg *.mp3 *.wv *.w64) Zvukové soubory (*.wav *.flac *.ogg *.mp3 *.wv *.w64) New Project Nový projekt Name Název Description Popis Engineer Připravit Import Audio Files Importovat zvukové soubory Empty Project Prázdný projekt ... ... Track Name Název stopy File Soubor Copy files to project directory Kopírovat soubory do adresáře projektu Number of Sheets Čísla listů Tracks per Sheet Stopy na jeden list Use Template Použít šablonu NewSheetDialog I can't create a new Sheet if there is no Project loaded!! Nemohu vytvořit nový list, jestliže nebyl nahrán žádný projekt! Added %n Sheet(s) Přidán %n list(y) Přidány %n list(y) Přidány %n listy New Sheet(s) Nový list(y) New Sheet name Nový název listu Sheet count Celkový počet listů Track count Celkový počet stop Use Template Použít šablonu NewTrackDialog I can't create a new Track if there is no Project loaded!! Nemohu vytvořit novou stopu, jestliže nebyl nahrán žádný projekt! Added %n Track(s) Přidána %n stopa Přidány %n stopy Přidány %n stopy New Track(s) Nová stopa(y) Track name Název stopy Track count Celkový počet stop OpenProjectDialog <p>Project directory name <b>%1</b> is different from the Project title <b>%2</b>!</p><p>Did you rename the Project directory ? </p><p>Please rename the directory back to the Project title <b>%1</b>, and change the Project title with the Project Manager Dialog!</p> <p>Název adresáře projektu <b>%1</b> se odlišuje od názvu projektu. <b>%2</b>!</p><p>Přejmenoval jste adresář projektu? </p><p>Prosím, přejmenujte název adresáře nazpět, aby se shodoval s názvem projektu <b>%1</b>, a změňte název projektu za využití dialogu správce projektu!</p> Description: Popis: Created on: Vytvořeno: No Project selected! Nebyl vybrán žádný projekt! Select a project and click the 'Load' button again Vybrat projekt a opět klepnout na tlačítko 'Nahrát' Project %1 does not exist, did you rename or remove the directory what that name ? Projekt "%1" neexistuje. Přejmenoval jste nebo odstranil adresář? Jaký je jeho název? You must supply a name for the project! Musíte doplnit název projektu! Project does not exist! (%1) Projekt neexistuje! (%1) Traverso - Question Traverso - dotaz Are you sure that you want to remove the project %1 ? It's not possible to undo it ! Jste si jistý, že chcete odstranit projekt (%1) ? Není možné vrátit tento krok zpět! Choose an existing or create a new Project Directory Vybrat nějaký stávající nebo vytvořit nový adresář pro projekt Traverso - Warning Traverso - varování This directory is not writable by you! Tento adresář není Vámi zapisovatelný! Please check permission for this directory or choose another one: %1 Prosím, zkontrolujte oprávnění pro tento adresář nebo vyberte jiný: %1 Unable to create Project directory! Neschopen vytvořit adresář projektu! Please check permission for this directory: %1 Prosím, zkontrolujte oprávnění pro tento adresář: %1 Traverso - Information Traverso - informace Created new Project directory for you here: %1 Nový adresář pro projekt byl pro Vás vytvořen zde: %1 Open Project Otevřít projekt Selected Project Vybraný projekt Load Nahrát Delete Smazat Select Project Dir Vybrat adresář projektu PADriver PADriver:: PortAudio error: %1 PA vladač:: PortAudio chyba: %1 PADriver:: hostapi %1 was not found by Portaudio! PA ovladač:: hostapi %1 nebylo nalezeno Portaudiem! PaDriverPage Form Formulář Portaudio drivers Portaudio ovladače <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">PortAudio Driver:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The driver which should drive the PortAudio backend</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">PortAudio supports many driver backends, some of which Traverso has native support for too. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It is recommended to use Traverso's native drivers instead of using PortAudio's, however, if the native drivers give problems, you might try the ones supplied by PortAudio instead!</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">PortAudio provides transparent driver support for multiple platforms, including Windows (see the wmme, direct x and asio options), and Mac OS X (see the CoreAudio and jack options)</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">PortAudio ovladač:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ovladač, který by měl ovládat PortAudio backend.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">PortAudio podporuje mnoho zvukových backendů Pro některé z nich má Traverso svoji vlastní podporu také. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Doporučuje se používat vlastní Traverso ovladače namísto těch od PortAudio. Ačkoli, pokud vlastní Traverso ovladače způsobují problémy, mohl byste namísto nich vyzkoušet ty, které poskytuje PortAudio!</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">PortAudio poskytuje jasnou podporu ovladačů pro četné platformy, včetně Windows (viz wmme, direct x a asio volby), a Mac OS X (viz CoreAudio a jack volby)</p></body></html> Driver Ovladač PerformanceConfigPage Form Druh Audio file buffering Ukládání zvukového souboru do vyrovnávací paměti <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Read buffer size:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The amount of audio data that can be stored in the </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">read buffers in seconds.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The default value of 1 second should do just fine.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">However, if you're tight on memory, you can make this value lower.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If you experience buffer underruns when the hard disk bandwidth is </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(almost) saturated, or when buffer underruns happen regularly due </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">the hard disk can't keep up for some reason, you can try a larger </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">value, like 1.5 or 2.0 seconds.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Keep in mind that when using a larger buffer, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">it will take considerably more time to move (i.e. seeking) </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">the playhead to another positions, since all the buffers </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(one for each audioclip * channel count) need to be refilled!</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Velikost vyrovnávací paměti určené pro čtení:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Množství zvukových dat, která mohou být ukládána ve </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">vyrovnávací paměti určené pro čtení v sekundách.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Výchozí hodnota, která je nastavena na jednu sekundu, by měla vyhovovat.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ačkoli, jestliže se Vám nedostává paměti, můžete tuto hodnotu snížit.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Jestliže se setkáte s podtečením vyrovnávací paměti, když bude šířka pásma </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">pevného disku (téměř) nasycena, nebo když se stane, že vyrovnávací paměť podteče </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> kvůli tomu, že pevný disk z nějakého důvodu nemůže stíhat, můžete vyzkoušet větší </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">hodnotu, jako 1.5 nebo 2.0 sekund.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mějte na mysli, že když použijete větší vyrovnávací paměť, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">zabere to výrazně více času (to jest hledání) </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">čtecí hlavě (playhead) přesunout se na jinou pozici, vzhledem ke všem vyrovnávacím pamětem. </p> <p style=" margin-top:0px; margin-bo Read buffer size (seconds) Velikost vyrovnávací paměti určené pro čtení (sekundy) info icon Informační ikona Changing the buffer size only will take into effect after (re)loading a project. Změna velikosti vyrovnávací paměti se uskuteční pouze po (znovu)načtení projektu. Painting Vykreslování <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The number of times per second at which the Graphical</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Items are repainted during a jog action, like moving an</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">AudioClip, or changing the Gain.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The default frames per second of 35 is a perfect compromise </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">between smooth painting, and low cpu usage.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">However, if you find the painting to be not smooth enough,</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">change this value to a higher one, but keep in mind that it</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">will consume considerably more cpu!</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If for example moving an AudioClip still takes to much cpu,</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">you should consider to lower this value.</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Číslo, kolikrát za sekundu jsou grafické detaily<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">znovu vykresleny během akce, kdy se jimi hýbe, jakou je přesun</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">zvukové ukázky, nebo změny koeficientu zesílení.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Výchozí nastavení hodnoty vykreslování rámečků za sekundu na 35 </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> je dokonalým kompromisem mezi hladkým vykreslováním a nízkým zatížením procesoru.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Samozřejmě, pokud Vám bude připadat, že vykreslování není dostatečně</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">hladké, zvyšte tuto hodnotu, ale stále mějte na paměti, že tento krok</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">povede k výrazně vyšším nárokům na procesor!</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Jestliže např. přesun zvukové ukázky stále bude vyžadovat příliš výkonu procesoru</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">měl byste zvážit snížení této hodnoty.</p></body></html> Jog repaint speed (fps) Rychlost vykreslování při pohybu (fps) <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Accelerates the painting of AudioClips and Tracks by using</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">the 3D engine of your graphics card.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Depending on your graphics card and driver support, this </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">can speed up painting considerably!</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Zrychluje vykreslování zvukových ukázek a stop</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">použitím 3D prostředků Vaší grafické karty.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">V závislosti na Vaší grafické kartě a podpoře ovladačů </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">toto může významně zvětšit rychlost vykreslování!</p></body></html> Use hardware acceleration Použít hardwarové zrychlení PluginSelectorDialog Plugin Selector Volič přídavných modulů Add Plugin too Přidat také přídavný modul Plugin Name Název přídavného modulu Type Druh In/Out Vstup/Výstup OK OK Cancel Zrušit ProgressToolBar Importing file %1 of %2: %p% Importuje se soubor %1 z (ze) %2: %p% Progress Toolbar Nástrojová lišta s průběhem Project Cannot create dir %1 Nelze vytvořit adresář (%1) Created new Project %1 Vytvořen nový projekt %1 Project %1: Cannot open project.tpf file! (Reason: %2) Projektt %1: Nelze otevřít soubor project.tpf! (Důvod: %2) Project %1: Failed to parse project.tpf file! (Reason: %2) Projektt %1: Selhalo provedení rozboru souboru project.tpf! (Důvod: %2) Project File Version does not match, unable to load Project! Neodpovídá verze souboru projektu. Neschopen načíst projekt! Project %1 loaded Projekt %1 nahrán Couldn't open Project properties file for writing! (File %1. Reason: %2) Nebylo možné otevřít soubor Vlastnosti projektu pro zápis (Soubor %1. Důvod: %2) Project %1 saved Projekt %1 uložen Project with title '%1' allready exists, not setting new title! Projekt s názvem '%1' již existuje. Nenastavuje nový název! Project directory %1 no longer exists, did you rename it? Shame on you! Please undo that, and come back later to rename your Project... Adresář projektu %1 nadále neexistuje. Přejmenoval jste jej? Vaše škoda! Prosím, vraťte tento krok zpět, a vraťte se později přejmenovat Váš projekt... Traverso - Information Traverso - informace Project title changed, Project will to be reloaded to ensure proper operation Název projektu byl změněn. Projekt bude načten znovu, aby byly zajištěna jeho správná činnost (fungování) Sheet %1 added List %1 přidán Sheet '%1' doesn't exist! List '%1' neexistuje! Remove Sheet %1 Odstranit list %1 Export already in progress, cannot start it twice! Export již probíhá. Nelze jej začít dvakrát! Detected clipping in exported audio! (%1) Detekováno stříhání v exportovaném zvuku! (%1) calculated norm factor: %1 Vypočítaný průměrný faktor: %1 You're still recording, please stop recording first to be able to exit the application! Ještě nahráváte. Prosím, nejprve zastavte nahrávání, abyste mohl opustit aplikaci! Unable to create export directory! Please check permissions for this directory: %1 Pro export nelze vytvořit adresář! Zkontrolujte, prosím, oprávnění pro tento adresář: %1 ProjectConverter Project file with version %1 cannot be converted, only files with version 2 can! Soubor projektu verze %1 nemůže být převeden. Pouze soubory verze 2 být mohou! Project %1: Failed to parse project.tpf file! (Reason: %2) Projekt %1: Selhalo provedení rozboru souboru project.tpf! (Důvod: %2) Starting to convert Project from version 2 to version 3 Začíná převod projektu z verze 2 na verzi 3 Converting project.tpf file..... Done! Převádí se soubor project.tpf ..... Hotovo! <b>Need to convert %1 files</b> <b>Je potřeba převést %1 souborů</b> Couldn't open Project properties file for writing! (File %1. Reason: %2) Nebylo možné otevřít soubor 'Vlastnosti projektu' pro zápis (Soubor %1. Důvod: %2) Project %1 converted Projekt %1 převeden Saving converted project.tpf file.... Done! Ukládá se převedený soubor project.tpf ..... Hotovo! Conversion finished succesfully Převod byl dokončen úspěšně No conversion description available! K dispozici není žádný popis převodu! Conversion stopped on user request, you can continue to use this Project with Traverso <= 0.41.0, or reopen it with this version of Traverso and start the conversion again Převod byl zastaven na žádost uživatele. Můžete pokračovat v používání tohoto projektu s Traverso <= 0.41.0, nebo jej znovu otevřít touto verzí Traversa a záčít s převodem znovu ProjectConverterDialog Project Converter Převodník projektu Project XXX (no translation needed) Projekt XXX (není potřeba žádného překladu) Conversion information Informace o převodu Conversion progress Průběh převodu Start conversion Začít s převodem Stop conversion Zastavit převod Load Project Nahrát projekt Close Zavřít ProjectInfoWidget Project Information Widget Udělátko informující o projektu Bitdepth Datová hloubka - - Rate Frekvence Songs Písně Project Projekt ProjectManager Save Project Uložit projekt Do you want to save the Project before quiting? Chcete uložit projekt předtím, než ukončíte aplikaci? Project %1 already exists! Projekt %1 již existuje! Unable to create new Project %1 Neschopen vytvořit nový projekt %1 Unable to load Project %1 Neschopen nahrát projekt %1 No Project to save, open or create a Project first! Není zde žádný projekt, který by mohl být uložen. Nejprve otevřete nebo vytvořte projekt! Choose a directory to store your Projects in Vyberte adresář, do kterého budete ukládat Vaše projekty Traverso - Warning Traverso - varování No directory was selected, to retry open the 'Open Project Dialog' and click 'Select Project Directory' button Nebyl vybrán žádný adresář. Chcete-li to zkusit znovu, otevřete dialog 'Otevřít projekt' a klepněte na tlačítko 'Vybrat adresář projektu' This directory is not writable by you! Tento adresář není Vámi zapisovatelný! Please check permission for this directory or choose another one: %1 Prosím, zkontrolujte oprávnění pro tento adresář nebo vyberte jiný: %1 Using existing Project directory: %1 Používá se stávající adresář projektu: %1 Unable to create Project directory! Neschopen vytvořit adresář projektu! Please check permission for this directory: %1 Prosím, zkontrolujte oprávnění pro tento adresář: %1 Created new Project directory for you here: %1 Nový adresář pro projekt byl pro Vás vytvořen zde: %1 Project %1 no longer could be found! (Did you remove or rename the Project directory ?) Projekt %1 nemohl být nalezen. (Odstranil jste nebo přejmenoval adresář projektu?) Default Project created by Traverso Výchozí projekt vytvořený aplikací Traverso Could not rename Project directory to %1 Adresář projektu nemohl být přejmenován na %1 Projectfile backup: The project file %1 could not be opened for reading (Reason: %2) Záloha souboru projektu: Soubor projektu %1 nemohl být otevřen pro čtení (Důvod: %2) Cannot create dir %1 Nelze vytvořit adresář %1 ProjectManagerDialog No new Sheet name was supplied! Nebyl doplněn nový název listu! Save Template Uložit šablonu Enter Template name Zadat název šablony Unable to create directory %1! Neschopen vytvořit adresář %1! Traverso - Information Traverso - informace Template with name %1 already exists! Do you want to overwrite it? Šablona s názvem %1 již existuje! Chcete ji přepsat? Saved Project Template: %1 Uložena šablona projektu: %1 Couldn't open file %1 for writing! Nebylo možné otevřít soubor %1 pro zápis! Project with title '%1' allready exists, please supply a different title! Projekt s názvem '%1' již existuje. Prosím, doplňte jiný název! Dialog Dialog Project Projekt Informational Informační Title Název Description Popis Engineer Připravit Export Exportovat Sheet(s) List(y) Template Šablona Sheets Listy Sheet Name Název listu Tracks Stopy Length Délka Selected Sheet Vybraný list Delete Smazat Rename Přejmenovat New Sheet Nový list Create new Sheet Vytvořit nový list CD Text CD Text Performer Účinkující Disc ID: ID disku (průkaz totožnosti disku): UPC EAN: UPC EAN (UPC Universal Product Code): Genre: Žánr: Unused Nepoužívaný Undefined Nestanovený Adult Contemporary Soudobý vyzrálý Alternative Rock Alternativní rock Childrens Děti Classical Klasický Contemporary Christian Křesťanský soudobý Country Country Dance Taneční Easy Listening Lehce poslouchatelný Erotic Erotický Folk Folk Gospel Gospelový Hip Hop Hip Hop Jazz Jazz Latin Románský (Latin) Musical Muzikálový New Age Nový věk (New Age) Opera Opera Operette Opereta Pop Music Pop (Pop music) Rap Rap Reggae Reggae Rock Music Rock Rhythm and Blues Rhythm and Blues Sound Effects Zvukové efekty Spoken Word Mluvené slovo World Music Světová hudba (World Music) Arranger Aranžér Songwriter Skladatel písní Message Vzkaz <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Undo last change</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Zpět: poslední změna</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Redo last change</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Znovu: poslední změna</p></body></html> undotext zpět text redotext znovu text QObject AudioClip Zvuková ukázka Curve Křivka CurveNode Uzel křivky FadeCurve Křivka prolínání No error occurred Nevyskytla se žádná chyba An error occurred when reading from the file. Při čtení ze souboru se vyskytla chyba. An error occurred when writing to the file. Při zapisování do souboru se vyskytla chyba. A fatal error occurred. Vyskytla se fatální chyba. The file could not be opened. Soubor nemohl být otevřen. Resourc error Chyba zdroje The operation was aborted. Operace byla zrušena. A timeout occurred. Vyskytlo se přerušení. An unspecified error occurred. Vyskytla se blíže neurčená chyba. The file could not be removed. Soubor nemohl být odstraněn. The file could not be renamed. Soubor nemohl být přejmenován. The position in the file could not be changed. Pozice v souboru nemohla být změněna. The file could not be resized. Nemohla být změněna velikost souboru. The file could not be accessed. Nebylo možné přistoupit k souboru. The file could not be copied. Soubor nemohl být zkopírován. Unknown error Neznámá chyba Marker Značka Sheet List TimeLine Časová přímka Track Stopa QuickStartDialog Traverso: Getting Started Traverso: Jak začít <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"><span style=" font-size:18pt; font-weight:600;">Traverso: Getting Started</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">When you record or import an audio file into Traverso, it shows up as an Audio Clip in one of the horizontal Tracks in the current Sheet. You can edit many aspects of these Clips by placing the mouse pointer over a Clip and pressing or holding different keys on your keyboard and mouse. You can also change settings of a Track, the Sheet as a whole, and other objects in the Sheet.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">To see a list of what commands are available for any given object in the Sheet, move the mouse over that object, and Right-Click (or press Q). The keyboard shortcuts for each command are shown in the menu. The notation used is shown below.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; K &gt; </span> means press and release the K key. (Like a click.)</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"><span style=" font-weight:600;">&lt;&lt; K &gt;&gt;</span> means press the K key two times fast. (Like a double click.)</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ K ]</span> means drag the mouse while holding down the K key.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; KL &gt; </span> means press the K and L keys at the same time.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ KL ] </span> means drag the mouse while holding down the K and L keys at the same time.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">Here are some basic commands:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; SPACE &gt;</span> is Play/Stop.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; SHIFT &gt;</span> sets the Playhead. (Blue vertical line where playing starts.)</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; W &gt;</span> sets the Work Cursor. (Red vertical line.)</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; V &gt; </span> moves the Playhead back to the Work Cursor.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ D ] </span> move objects around (Audio Clip, Curve Nodes, etc)</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ Z ]</span> zooms in and out.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ TAB ]</span> scroll omnidirectional (aka Shuttle) </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">And some Audio Clip Commands:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ E ] </span> drags a Clip's left or right edge.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ F ]</span> adjusts the length of a Clip's Fade In / Fade Out.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ G ] </span>addust the Gain of a clip (also works on Tracks, Sheet)</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; X &gt;</span> splits the Clip at the cursor's position.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">For more information, right-click on everything, or check out the Traverso manual.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"><span style=" font-size:18pt; font-weight:600;">Traverso: Jak začít</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">Když nahráváte nebo importujete nějaký zvukový soubor do aplikace Traverso, ukazuje se jako zvuková ukázka v jedné z vodorovných stop v současném listě. Můžete upravovat mnoho stránek těchto ukázek tím, že umístíte ukazatel myši nad ukázku a stisknete nebo budete držet různé klávesy na vaší klávesnici a myši. Můžete také měnit nastavení stopy, listu jako celku, a dalších objektů v listu.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">Abyste viděli seznam příkazů, které jsou dostupné pro kterýkoli vybraný objekt v listu, přesuňte myš nad objekt, a klepněte pravým tlačítkem myši (nebo stiskněte Q). Klávesové zkratky pro každý příkaz se zobrazují v nabídce. Používaný způsob zápisu je ukázán níže.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; K &gt; </span>Znamená, že máte stisknout a upustit klávesu K (jako klepnutí, klik).</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"><span style=" font-weight:600;">&lt;&lt; K &gt;&gt;</span> Znamená, že máte stisknout klávesu K dvakrát rychleji (jako dvojité klepnutí, klik).</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ K ]</span> Znamená, že máte táhnout myší zatímco podržíte klávesu K.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; KL &gt; </span>Znamená, že máte stisknout klávesy K a L současně.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ KL ] </span>Znamená, že máte táhnout myší zatímco podržíte klávesy K a L současně.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">Zde jsou některé základní příkazy:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; SPACE &gt;</span> Vykoná příkaz přehrávat/zastavit.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; SHIFT &gt;</span> Nastaví hrací hlavu (modrá svislá čára ukazující, kde začíná přehrávání).</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; W &gt;</span> Nastaví pracovní běžec (červená svislá čára).</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; V &gt; </span> Přesune hrací hlavu nazpět k pracovnímu běžci.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ D ] </span> Přesune objekt kolem (zvuková ukázka, uzel křivky, atd.).</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ Z ]</span> Přibližuje a oddaluje.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ TAB ]</span> Roluje všemi směry (také známé jako "jezdit tam a zpět", raketoplán - Shuttle). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">A Některé příkazy ke zvukovým ukázkám:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ E ] </span> Táhne ukázku k jeho levému nebo pravému okraji.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ F ]</span> Přizpůsobí délku zesílení/zeslabení signálu ukázky.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ G ] </span>Přizpůsobí koeficient zesílení ukázky (také funguje u stop, listů).</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; X &gt;</span> Rozdělí ukázku na pozici běžce.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">Abyste získali více informací, stačí abyste poklepali pravým tlačítkem myši na cokoli, nebo se mrkněte na nápovědu k aplikaci Traverso.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p></body></html> ReadSource Silence Ticho Could not open file Nebylo možné otevřít soubor Invalid channel count Neplatný počet kanálů File has zero channels Soubor má nulový počet kanálů The file does not exist! Soubor neexistuje! No ReadSource error set Není stanovena chyba čtení ze zdroje RecordingConfigPage Form Formulář Recording Nahrává <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">WAV</span> : A format without compression. Uses more hard disk space then compressed encoding formats, but needs very little cpu.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Limits : ~ 1.7 hours of recording time @ Stereo - 44.1 KHz</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">WavPack</span> : A format with compression, up to 2 times smaller compared to WAV, and no quality loss. Uses significantly more cpu then WAV, but with modern (year 2005 and above) cpu's this shouldn't be a problem.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Using this format stresses the hard disk much less, increasing hard disk live, and less chance of saturating the hard disk bandwidth.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Limits : ~ 5 hours recording time @ Stereo - 44.1 KHz</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">WAV64</span> : WAV format with 64 bit header, support by other programs is currently limited.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Limits : None, thousands of hours of recording time, supposed that your hard disk can hold it.</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">WAV</span> : Formát bez komprese. Používá více diskového prostoru než komprimované kódovací formáty, ale potřebuje velmi málo výkonu procesoru.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Omezení : ~ 1.7 hodin nahrávacího času; stereo - 44.1 kHz</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">WavPack</span> : Formát s kompresí je při srovnání s WAV dvakrát menší, a přitom netrpí žádnou ztrátou kvality. Používá daleko více výkonu procesoru než WAV, ale u moderních (rok 2005 a mladší) procesorů by toto neměl být problém.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Používání tohoto formátu zatěžuje pevný disk mnohem méně. Prodlužuje životnost pevného disku, a zmenšuje možnost, že bude nasycena šířka vlnového pásma pevného disku.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Omezení : ~ 5 hodin nahrávacího času; stereo - 44.1 kHz</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">WAV64</span> : WAV formát s 64 bit hlavičkou. Podpora jinými programy je v současné době omezená.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Omezení : Žádná. Tisíce hodin nahrávacího času, za předpokladu, že Váš pevný disk je bude schopen pojmout.</p></body></html> Encoding format Formát používaný pro zakódování WavPack options Volby WavPack Compression type Druh komprese <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This option reduces the storage of some floating-point data files by up to about 10% by eliminating some information that has virtually no effect on the audio data. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">While this does technically make the compression lossy, it retains all the advantages of floating point data (&gt;600 dB of dynamic range, no clipping, and 25 bits of resolution). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This also affects large integer compression by limiting the resolution to 24 bits.</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Tato volba zmenšuje hromadění některých datových souborů s pohyblivou desetinnou čárkou okolo až asi 10 % odstraněním některých informací, které v podstatě nemají žádný účinek na zvuková data. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Přestože toto technicky dělá kompresi ztrátovou, ponechává to všechny výhody datových souborů s pohyblivou desetinnou čárkou (&gt;600 dB dynamického rozsahu, žádné ošizení kvality, a 25 bitové rozlišení). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Toto také ovlivňuje rozsáhlou celočíselnou kompresi omezením rozlišení na 24 bitů.</p></body></html> Skip WVX for extra compression (semi-lossless) Přeskočit WVX pro zvláštní kompresi (napůl bezztrátová) Resampling Převzorkování Enable on the fly resampling (Playback only) Povolit převzorkování za běhu (pouze přehrávání) On the fly resample quality Kvalita převzorkování za běhu Default export resample quality Výchozí kvalita převzorkování při exportu Best Nejlepší High Vysoká Medium Průměrná Fast Rychlé ResourcesManager ResourcesManager:: Failed to initialize ReadSource %1 (Reason: %2) Správce zdrojů:: Selhalo při inicializaci zdroje pro čtení %1 (Důvod: %2) ResourcesManager: Received request to remove Audio Source %1but it is still in use by %2 AudioClips!!. NOT removing it! Správce zdrojů:: Byl přijat požadavek na odstranění zdroje zvuku %1, ale ten je stále používán %2 zvukovými ukázkami! NENÍ proto odstraňován! ResourcesWidget Form Druh Sources Zdroje Files Soubory Name Název Length Délka Start Začít End Ukončit RestoreProjectBackupDialog Restore from backup Obnovit ze zálohy Set the date to restore the selected backup. Nastavit datum, kdy má být obnovena vybraná záloha. Current date and time: Současné datum a čas: Last backup: Poslední záloha: - - Date Datum Time Čas SettingsDialog Behavior Chování Appearance Vzhled Sound System Zvukový systém Audio Options Volby zvuku Keyboard Klávesnice Performance Výkon Preferences - Traverso Traverso - preference Sheet Untitled Bez názvu No artists name set Nebylo stanoveno jméno umělce Add Track Přidat stopu Remove Track Odstranit stopu No audio to export! (Is everything muted?) Žádný zvuk, který by mohl být exportován (Všechno je ztlumeno?) Export start frame starts beyond export end frame!! Počáteční snímek exportu začíná za koncovým snímkem exportu! Export tries to render to 0 channels wav file?? Export se pokouší převádět do souboru wav s 0 kanály? Hard Disk overload detected! Bylo odhaleno přetížení pevného disku! Failed to fill ReadBuffer in time Došlo k selhání při pokusu naplnit vyrovnávací paměť určenou pro čtení včas Failed to empty WriteBuffer in time Došlo k selhání při pokusu vyprázdnit vyrovnávací paměť určenou pro zapisování včas No Tracks armed for recording! Pro nahrávání nebyly aktivovány žádné stopy! Recording to %n Clip(s) Nahrává do %n ukázky Nahrává do %n ukázek Nahrává do %n ukázek SongInfoWidget SongInfoWidget Udělátko, které podává informaci o písni Song Píseň - - Snap Přichytit Gain Zesílení SMPTE SMPTE Zoom Přiblížení SpectralMeterConfigWidget FFT-Spectrum Configuration Konfigurace FFT škály Frequency Range Frekvenční rozsah Show average spectrum Ukázat průměrnou škálu Number of bands: Počet pásem: Lower dB value: Spodní hodnota dB: Upper dB value: Horní hodnota dB: Hz Hz Lower Limit: Spodní mez: Upper Limit: Horní mez: Advanced FFT Options Pokročilé volby FFT FFT Size: Velikost FFT: 256 256 512 512 1024 1024 2048 2048 4096 4096 8192 8192 Rectangle Obdélníkový Hanning Hanning Hamming Hamming Blackman Blackman Windowing function: Funkce okénkování: Advanced Pokročilé Apply Použít &Close &Zavřít SpectralMeterView Screen Capture file name Název souboru se zachycením obrazovky FFT: Unable to write captured image to hard disk FFT: Neschopen zapsat zachycený obrázek na pevný disk FFT: No avarage curve used, not data to export! FFT: Nepoužívá se žádná průměrná křivka. Nejsou data pro export! FFT: Enable avarage curve with < M > to generate data FFT: Povoli průměrnou křivku s < M > pro generování dat FFT: No avarage data to export! FFT: Nejsou průměrná data pro export! Select output format Vybrat výstupní formát Output format: Výstupní formát: Export average dB curve Exportovat průměrnou křivku dB SplitClip Split Clip Rozdělit ukázku SysInfoToolBar System Information Informace o systému SystemInfoWidget SystemInfoWidget Udělátko, které podává informaci o systému Card Name (na) Název karty (na) image Obraz buffer size (na) Velikost vyrovnávací paměti (na) rate Frekvence - GB - GB drivertype (na) Druh disku (na) xruns (na) Xruns (na) latency (na) Latence (na) - % - % bitdepth Datová hloubka SystemResources Read Buffer Status Stav vyrovnávací paměti určené pro čtení Write Buffer Status Stav vyrovnávací paměti určené pro zapisování TimeLine Add Marker Přidat značku Remove Marker Odstranit značku TimeLineView End Konec Add Marker Přidat značku You have to remove all other markers first. Nejprve musíte odstranit všechny ostatní značky. Drag Marker Táhnout značku Clear Markers Vyčistit značky Track Track: AudioClip with id %1 not found in Resources database! Stopa: Zvuková ukázka s id %1 nebyla nalezena ve zdrojové databázi! Remove Clip Odstranit ukázku Add Clip Přidat ukázku Silence Others Ztišit ostatní TrackPan Track Pan: %1 Panoráma stopy: %1 Track Pan Panoráma stopy TrackView Set Track name Nastavit název stopy Enter new Track name Vložit nový název stopy Track %1: %2 Stopa %1: %2 TransportConsoleWidget Skip to Start Přeskočit na začátek Previous Snap Position Předchozí pozice přichytnutí Record Nahrát Play / Stop Přehrát/Zastavit Next Snap Position Další pozice přichytnutí Skip to End Přeskočit na konec Recording to %1 Tracks, encoding format: %2 Nahrává do %1 stop, kódovací formát: %2 TraversoCommands Gain Zesílení Gain: Reset Zesílení: znovu nastartovat Panorama Panoráma Panorama: Reset Panoráma: znovu nastartovat Import Audio Importovat zvuk Insert Silence Vložit ticho Copy Clip Kopírovat ukázku New Track Nová stopa Remove Clip Odstranit ukázku Remove Track Odstranit stopu External Processing Vnější zpracování (De)Select All (Od)značit vše Move Clip Přesunout ukázku Drag Edge Táhnout okraj Move Or Resize Clip Přesunout změnit velikost ukázky Split Rozdělit Arm Tracks Aktivovat stopy Fold Sheet Přeložit list Fold Track Přeložit stopu Fold Markers Přeložit značky Vertical In Svislý v Horizontal Out Vodorovný ven Horizontal In Vodorovný v Vertical Out Svislý ven Omnidirectional Všesměrový Horizontal Vodorovný Vertical Svislý Right Pravý Left Levý Up Nahoru Down Dolů (De)Select Magnetic Cut traverso-0.49.4/resources/translations/traverso_es.ts000644 001750 001750 00001045521 11430303020 023410 0ustar00remonremon000000 000000 AddRemoveClip Remove Clip Borrar Clip Remove Selected Clips Borrar Clips Seleccionados AlsaDevicesPage Form Formulario ALSA Device Dispositivo ALSA <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Device:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The real or virtual ALSA device to be used.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A real device is the audiocard installed in your system.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A virtual device is one created in the .asoundrc file, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">often located in your home folder.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If unsure, use either the default device, this will use the audiodevice </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">configured by your distribution, or the device that names your audio card.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">In the latter case, please make sure no application uses the audiocard, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">else the driver won't be able to initialize!</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">For more info see chapter 3.1: "The Driver Backend" of the User Manual</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Dispositivo:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">El dispositivo ALSA a usar (real o virtual).</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Un dispositivo real es la tarjeta de audio del ordenador.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Dispositivos virtuales son los creados en el archivo .asoundrc, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">que suele estar en la carpeta /home del usuario.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Si duda, puede usar el dispositivo por defecto. Se usará el dispositivo </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">configurado por su distribución, o el que corresponde a su tarjeta de audio.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">En el último caso, asegúrese de que ningún otro programa usa la tarjeta, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">si no, el driver no podrá iniciarse!</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Para más información vea 4.1: "Soporte de Drivers" en el Manual de Usuario.</p></body></html> Device Dispositivo <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Number of Periods:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Audio is managed in small chunks called periods. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This value determines how many of these chunks are </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">to be used by the driver of the audiocard.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The default should work just fine, and gives optimal latency behavior.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">However, some (buggy) alsa drivers don't work correctly </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">with the default of 2, if you experience very choppy audio, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">please try to use 3 periods.</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Número de Periodos:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">El audio se procesa en trozos pequeños, llamados periodos. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Este valor determina cuántos de éstos trozos van a ser</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">usados por el controlador de la tarjeta de audio.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">El valor por defecto debiera ser adecuado, y proporciona una latencia óptima.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Sin embargo algunos drivers de Alsa tienen errores y no funcionan bien </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">con este valor ( 2). Si el sonido se oye entrecortado, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">puede probar el valor de 3 periodos.</p></body></html> Nr. of periods N. de periodos 2 2 3 3 <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Dither is used to make the audio cleaner. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The best way to describe it is to imagine a painting with many dots. If you view it up close you can see each dot and the image is not very clear. If you view it from far away the image becomes clearer because your eyes/brain dither the dots to smooth out the image. It is a murky subject and obviously a very personal choice as to what dither is the best. For most people it is just plain magic. Anyone running at 16bit who cares about quality or has CPU cycles to spare should run with dither. Triangular is probably the best compromise of quality vs cpu cost (its very fast), but shaped is the best</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">El "dither" se usa para obtener un audio más limpio. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">La mejor manera de describirlo es pensar en una imagen hecha con muchos puntos. Si se mira muy de cerca, se puede ver cada punto y la imagen no es clara. Mirada desde lejos se vé más clara porque los ojos y el cerebro difuminan ("dither") los puntos suavizando la imagen. No está claro, y es una cuestión de preferencia personal, si usar dither es lo mejor, pero a la mayoría les parece mágico. Quien trabaje a 16bit y esté preocupado por la calidad, o le sobre velocidad de la CPU, debiera probar con dither. El "triangular" es probablemente la opción más equilibrada entre calidad y carga de la CPU, pero el "conformado" es el mejor.</p></body></html> Dither Dither None Ninguno Shaped Conformado Rectangular Rectangular Triangular Triangular AlsaDriver ALSA Driver: The playback device %1 is already in use. Please stop the application using it and run Traverso again Driver ALSA: El dispositivo de reproducción %1 está en uso. Detenga la aplicación que lo está usando y reinicie Traverso ALSA Driver: You do not have permission to open the audio device %1 for playback Driver ALSA: Usted no tiene permiso para abrir el dispositivo de audio %1 para reproducción snd_pcm_open(playback_handle, ..) failed with unknown error type snd_pcm_open(playback_handle, ..) ha fallado con un tipo de error desconocido ALSA Driver: The capture device %1 is already in use. Please stop the application using it and run Traverso again Driver ALSA: El dispositivo de grabación %1 está en uso. Detenga la aplicación que lo está usando y reinicie Traverso ALSA Driver: You do not have permission to open the audio device %1 for capture Driver ALSA: Usted no tiene permiso para abrir el dispositivo de audio %1 para grabación ALSA Driver: snd_pcm_open(capture_handle, ...) failed with unknown error type Driver ALSA: snd_pcm_open(capture_handle, ...) ha fallado con un error desconocido ALSA Driver: Cannot open PCM device %1 for playback. Falling back to capture-only mode Driver ALSA: No se puede abrir el dispositivo PCM %1 para reproducción. Habilitando modo de sólo grabación ALSA: Cannot open PCM device %1 for capture. Falling back to playback-only mode Driver ALSA: No se puede abrir el dispositivo PCM %1 para grabación. Habilitando modo de sólo reproducción ALSA Driver: Unable to configure hardware, is it in use by another application? Driver ALSA: No se puede configurar el hardware. ¿Lo está usando otra aplicación? AppearenceConfigPage Icons only Solo iconos Text only Solo texto Text beside Icons Texto junto a los iconos Text below Icons Texto debajo de los iconos Default Language Idioma por defecto Select default project dir Carpeta por defecto de proyectos Form Formulario Theme Tema Theme selector Selector de temas Path to theme files Ubicación de los archivos de temas Available themes Temas disponibles Adjust theme color Ajustar color del tema Theme Options Opciones del tema Paint audio rectified Dibujar audio rectificado <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Painting the waveform with an outline is more detailed, but requires more cpu.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If you experience slowness when painting many clips, or during animated scroll, unselect this option!</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Dibujar la onda con una linea queda más detallado, pero requiere más cpu.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Si aprecia que el dibujar muchos clips, o el scroll animado, resultan lentos ¡deshabilite esta opción!</p></body></html> Paint audio with outline Dibujar la onda con línea Paint stereo audio as mono audio Dibujar audio stereo como mono Draw lines at 0 and -6 dB Dibujar líneas a 0 y -6 dB Style Options Opciones de estilo Select style Seleccionar estilo Use selected style's palette Usar la paleta del estilo seleccionado Toolbars Barras de herramientas Icon size Tamaño de icono Button style Estilo de botón Transport Console size Tamaño de la consola clásica Language Idioma Interface Language Idioma de la interfaz Changing the language of the Interface will take effect after restarting Traverso! El cambio de idioma de la interface tendrá efecto al reiniciar Traverso! ArmTracks Arm Tracks Armar pistas AudioClip Unable to Record to Track No se puede grabar en la pista AudioDevice doesn't have this Capture Bus: %1 (Track %2) El dispositivo no tiene este Bus de grabación: %1 (Pista %2) Toggle Mute Cambiar estado mudo Toggle Lock Cambiar estado bloqueado Remove Fades Quitar fades Normalization Normalización Set Normalization level: NIvel de normalización: AudioClip: Normalize Normalizar clip de audio AudioClipEditDialog Dialog Ventana de diálogo Clip Parameters Parametros del clip Source Origen Name Nombre Gain Ganancia Track start Comienzo de pista Length Duración End Final hh:mm:ss.sss hh:mm:ss.sss TextLabel Etiqueta de texto External Processing Procesado externo Fades Fades Fade In Fade de entrada Mode Modo Bending Inclinación Strength Intensidad &Linear &Lineal &Default por &Defecto Fade Out Fade de salida AudioClipExternalProcessing Clip: External Processing Clip: procesado externo AudioClipManager Selection: Remove Clip Selección: quitar clip Selection: Add Clip Selección: añadir clip Selection: Invert Selección: invertir AudioClipView Click to reset AudioFile ! Clik para restaurar el archivo de audio ! Reset Audio File for Clip: %1 Restaurar el archivo de audio del Clip %1 All files (*);;Audio files (*.wav *.flac) Todos los archivos (*);;Archivos de audio (*.wav *.flac) No file selected! No se seleccionó ningún archivo! Succesfully set AudioClip file to %1 Archivo de AudioClip asignado correctamente a %1 AudioDevice No Driver Loaded No hay ningún Driver cargado Audiodevice: Failed to create the Jack Driver Dispositivo de Audio: Falló al crear el driver para Jack Audiodevice: Failed to create the ALSA Driver Dispositivo de Audio: Falló al crear el driver para ALSA Audiodevice: Failed to create the PortAudio Driver Dispositivo de Audio: Falló al crear el driver para PortAudio Audiodevice: Failed to create the PulseAudio Driver Dispositivo de Audio: Falló al crear el driver para PulseAudio Audiodevice: Failed to create the CoreAudio Driver Dispositivo de Audio: Falló al crear el driver para CoreAudio No Device Configured No hay ningún dispositivo configurado The Jack server has been shutdown! El servidor Jack ha sido detenido! AudioDevice:: Buffer underrun 'Storm' detected, switching to Null Driver Buffer=memoria intermedia de almacenamiento. Underrun=situación en la que, durante la reproducción, la tarjeta de sonido intenta leer datos del buffer, pero el programa todavía no los ha puesto ahí. Dispositivo de audio:: Detectada 'tormenta' de underruns en el buffer. Pasando al driver Null AudioDevice:: For trouble shooting this problem, please see Chapter 11 from the user manual! Dispositivo de audio:: Para resolver este problema, ¡consulte el Capítulo 11 del Manual de Usuario! AudioDeviceThread Unable to set Audiodevice Thread to realtime priority!!!This most likely results in unreliable playback/capture and lots of buffer underruns (== sound drops).In the worst case the program can even malfunction!Please make sure you run this program with realtime privileges!!! ¡ No se puede asignar prioridad de tiempo real al canal del dispositivo de audio ! Esto puede ocasionar que la reproducción/grabación no sea fiable, y muchos "underruns" (pequeñas interrupciones del sonido. ¡ En el peor caso, el programa puede incluso dejar de funcionar ! Por favor, asegúrese de que ejecuta este programa con privilegios de tiempo real ! AudioDriverConfigPage System default Por defecto (del sistema) Form Formulario Driver Selection Selección de Driver Driver: Driver: Configure driver Configurar Driver <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Duplex mode:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Defines if both the Playback and Capture buses </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">of your soundcard are to be used, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">or only the Playback or Capture bus(es).</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Modo Duplex:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Define si deben ser usados tanto el bus de grabación</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">como el de reproducción de la tarjeta de sonido, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">o solamente el bus de grabación o de reproducción.</p></body></html> Duplex mode duplex= capacidad de grabar y reproducir simultáneamente Modo duplex Full Completo Playback Reproducción Capture Grabación <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Sample rate:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The sample rate used by the audio card.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">New projects will use this samplerate as </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">the project's sample rate on creation.</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Frecuencia de Muestreo:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">La frecuencia de muestreo usada por la tarjeta de audio.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Los proyectos nuevos usarán esta frecuencia como</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">frecuencia de muestreo inicial del proyecto.</p></body></html> Sample rate Frecuencia de muestreo 22050 22050 32000 32000 44100 44100 48000 48000 88200 88200 96000 96000 <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Buffer latency:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The latency introduced by the size of the audio buffers.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Some people need low latencies, if you don't need it, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">or don't know what it means, please leave the default setting!</p></body></html> latencia=tiempo de retraso en el audio <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Latencia de buffer:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">La latencia introducida por el tamaño del buffer de audio.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">En algunas ocasiones se necesitan latencias bajas. Si no es su caso </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">o no sabe lo que ésto significa, es mejor que deje el valor por defecto!</p></body></html> Buffer latency (ms) Latencia de buffer (ms) Restart Driver Reiniciar el Driver Jack Jack Enable Jack transport control Habilitar el control desde Jack AudioSourcesManagerWidget Form Formulario Remove sources Eliminar orígenes Remove source Eliminar origen Remove all sources Eliminar todos los orígenes Remove unused sources Eliminar los orígenes no usados AudioSources Orígenes de Audio BehaviorConfigPage Form Formulario Project Settings Ajustes del Proyecto On close: Al cerrar: Save Guardar Ask Preguntarme Don't save No guardar Load last used project at startup Cargar el último usado al arrancar New Sheet Settings Ajustes para la nueva hoja Number of tracks Número de pistas Audio Clip Settings Ajustes del Clip de Audio Lock Audio Clips by default Bloquear los clips de audio por defecto Playback Settings Ajustes de reproducción <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Keep the play cursor in view while playing or recording.</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mantener el cursor de reproducción a la vista al grabar o reproducir</p></body></html> Scroll playback scroll=movimiento continuo de la imagen Scroll al reproducir Jump Saltar Stay Centered Mantener centrado Animated Animado Continuously adjust audio while dragging Ajustar el audio mientras se arrastra BusSelectorDialog Bus Selector Selector de Bus Track Pista Capture Buses Buses de grabación Channels Canales Both Ambos Left Izquierda Right Derecha Playback Buses Buses de reproducción CDWritingDialog CD Writing Grabación en el CD General Options Opciones generales Write current Sheet Escribir la hoja actual Write all Sheets Escribir todas las hojas Calculate and apply normalization Calcular y aplicar normalización Export wav and toc files only (don't write CD) Sólo exportar los archivos wav y toc (no escribir en el CD) Burning Device coloquialmente "la tostadora" Dispositivo de grabación Number of copies Número de copias Simulate Simular Speed Velocidad auto auto 1x 1x 2x 2x 4x 4x 8x 8x 12x 12x 16x 16x 20x 20x 24x 24x 28x 28x 32x 32x 36x 36x 40x 40x 44x 44x 48x 48x Status Estado Information Información Start Writing Comenzar a escribir Abort Cancelar Close Cerrar ClipSelection Selection: Remove Clip Selección: Borrar Clip Selection: Add Clip Selección: Añadir clip Select Clip SeleccionarClip ClipsViewPort Import %n audiofile(s) Importar %n archivo de audio Importar %n archivos de audio Crop AudioClip: Magnetic Cut Clip de Audio: corte magnético Curve There is allready a node at this exact position, not adding a new node Ya hay un nodo en esta misma posición. No se añade uno nuevo Add CurveNode Añadir nodo a la curva Remove CurveNode Quitar nodo de la curva CurveView Drag Node Mover nodo Clear Nodes Borrar nodos Dialog Dialog Diálogo OK OK Cancel Cancelar DigitalClock Digital Clock Reloj digital DriverInfo Change Audio Device settings Cambiar ajustes del dispositivo de audio ExportDialog Export Exportar General Options Opciones generales Export current Sheet Exportar hoja actual Export all Sheets Exportar todas las hojas Export directory Carpeta de destino Export status Progreso de la exportación - - Abort Export Cancelar exportación Start Export Comenzar exportación Close Cerrar ExportFormatOptionsWidget Best Mejor High Alta Medium Media Fast Rápida Bitrate Tasa de bits Average Bitrate Tasa de bits promedio Maximum Bitrate Tasa de bits máxima Export Format Options Opciones de formato para exportar Format Options Opciones de formato Encoding Codificación File Type Tipo de archivo Channels Canales Normalize Audio Normalizar el audio Bitdepth Profundidad de bits WavPack options (lossless compression) Opciones WavPack (compresión sin pérdidas) Compression type Tipo de compresión <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This option reduces the storage of some floating-point data files by up to about 10% by eliminating some information that has virtually no effect on the audio data. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">While this does technically make the compression lossy, it retains all the advantages of floating point data (&gt;600 dB of dynamic range, no clipping, and 25 bits of resolution). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This also affects large integer compression by limiting the resolution to 24 bits.</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Esta opción reduce el almacenamiento de algunos archivos de coma flotante hasta un 10% eliminando cierta información que no tiene prácticamente ningún efecto en el audio. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Aunque técnicamente esto sería "compresión con pérdidas", mantiene todas las ventajas de procesar en coma flotante (&gt;600 dB de rango dinámico, sin "clipping" (saturación), y 25 bits de resolución).</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Esto también afecta a la compresión al usar "enteros grandes", al limitar la resolución a 24 bits.</p></body></html> Skip WVX for extra compression (semi-lossless) Eludir WVX para mayor compresión (casi sin pérdidas) Ogg Options Opciones Ogg Quality (Smallest <-> Best) Calidad (Peor <-> Mejor) Encoding Method Método de codificación MP3 Options Opciones de MP3 Minimum Bitrate Tasa de bits mínima Quality (Fastest <-> Best) Calidad (Más rápida <-> Mejor) Sample Rate Frecuencia de muestreo Conversion quality Calidad de la conversión ExternalProcessingDialog You have to supply an argument before starting the external process! ¡ Debe proporcionar un argumento antes de lanzar el procesado externo ! Program <b>%1</b> crashed! El programa <b>%1</b> ha fallado! Available arguments for the sox program Argumentos disponibles para el programa Sox Program <b>%1</b> not installed, or insufficient permissions to run! El programa <b>%1</b> no está instalado, o tiene privilegios insuficientes para ejecutarlo! FadeBend Fade In: bend Fade de entrada: inclinación Fade Out: bend Fade de salida: inclinación FadeCurve Fade Preset Fades predefinidos FadeMode Fade In: shape Fade de entrada: forma Fade Out: shape Fade de salida: forma FadeRange Fade In: length Fade de entrada: duración Fade Out: length Fade de salida: duración Fade In: remove Fade de entrada: quitar Fade Out: remove Fade de salida: quitar FadeStrength Fade In: strength Fade de entrada: intensidad Fade Out: strength Fade de salida: intensidad FileWidget My Computer Mi Ordenador My Documents Mis Documentos Parent Directory Directorio Arriba Refresh File View Refrescar vista de archivos Import Import Audio File Importar archivo de audio Insert Silence Insertar Silencio Silence Silencio All files (*) Todos los archivos (*) Audio files (*.wav *.flac *.ogg *.mp3 *.wv *.w64) Archivos de Audio (*.wav *.flac *.ogg *.mp3 *.wv *.w64) Import audio source Importar origen de audio ImportClipsDialog Import Audio Clips Importar Clips de Audio Import to Track: Importar a la Pista: Add Markers Añadir Marcadores InputEngine Modifier key actions are not supported from Context Menu Los modificadores para acciones de teclado no están disponibles desde el Menú Contextual Hold actions are not supported from Context Menu Las acciones tipo "mantener presionado" no están disponibles desde el Menú Contextual Command Plugin %1 not found! ¡ El comando del Plugin %1 no ha sido encontrado ! Plugin %1 doesn't implement Command %2 El Plugin %1 no tiene implementado el Comando %2 InsertSilenceDialog Insert Silence Insertar silencio Insert Silence (seconds): Insertar Silencio (segundos): Interface History Historia Resources Bin Ventana de recursos Correlation Meter Medidor de Correlación FFT Spectrum Espectro de frecuencias (FFT) Traverso %1 (built with Qt %2) A multitrack audio recording and editing program. Look in the Help menu for more info. Traverso is brought to you by R. Sijrier and others, including all the people from the Free Software world who contributed the important technologies on which Traverso is based (Gcc, Qt, Xorg, Linux, and so on) Traverso %1 (construido con Qt %2) Un programa editor y grabador de audio multipista. Consulte la ayuda para más información. Traverso le es ofrecido a usted por R. Sijrier y otros, incluyendo a las personas del mundo del Software Libre que han aportado tecnologías importantes en las que Traverso está basado (Gcc, Qt, Xorg, Linux, etc.) About Traverso Acerca de Traverso &Project &Proyecto &New... &Nuevo... &Open... &Abrir... &Save &Guardar &Manage Project... Gestionar Pro&yecto... &Export... &Exportar... &CD Writing... &CD (grabar)... &Restore Backup... &Restaurar Backup... &Quit &Salir &Edit &Editar Undo Deshacer Redo Rehacer Import &Audio... &Importar Audio... Insert Si&lence... Insertar &Silencio... &Snap &Pegajoso Snap items to edges of other items while dragging. Ayuda a hacer coincidir los bordes del objeto con los de otros objetos, mientras se arrastra. S&croll Playback Cursor &visible siempre Keep play cursor in view while playing or recording. Mantiene a la vista el cursor al reproducir ó grabar. &Show Effects Mostrar &Efectos Show effect plugins and automation curves on tracks Muestra los plugins de efectos y las curvas de automatización en las pistas &View &Ver Marker Editor... Editor de marcadores... Transport Console Consola clásica de transporte Project Proyecto Edit Editar System Information Información del Sistema &Sheet &Hoja New &Sheet(s)... Hoja &nueva... New &Track(s)... &Pista nueva... Se&ttings Aj&ustes &Recording File Format &Formato de archivo para grabación &Resample Quality &Calidad del cambio de muestreo Best Mejor High Alta Medium Media Fast Rápida &Preferences... &Preferencias... &Help A&yuda &Getting Started Para &Comenzar &User Manual Manual de &Usuario &About Traverso &Acerca de Traverso <b>Description</b> <b>Descripción</b> <b>Key Sequence</b> <b>Secuencia de teclas</b> Open Audio Files Abrir archivos de audio Audio files (*.wav *.flac *.ogg *.mp3 *.wv *.w64) Archivos de Audio (*.wav *.flac *.ogg *.mp3 *.wv *.w64) %1: %2 %1: %2 Opening User Manual in external browser! ¡ Abriendo el Manual de Usuario en un navegador externo ! Traverso - Important Traverso - Importante A Project directory changed outside of Traverso. This is NOT supported! Please undo this change now! If you want to rename a Project, use the Project Manager instead! Un directorio de proyecto ha sido cambiado fuera de Traverso. Es una operación NO permitida. Por favor, deshaga ese cambio ahora. Si desea renombrar un Proyecto, ¡use el Gestor de Proyectos! Traverso - Project load failed Traverso - Carga del Proyecto fallida The requested Project `%1` could not be loaded for the following reason: '%2' You will now be given a list of available backups (if any) to restore the Project from. El Proyecto solicitado `%1` no ha podido ser cargado por la siguiente razón: '%2' Se le presentará ahora una lista de backups disponibles (si hay alguno), desde los que restaurar el Proyecto. Changed encoding for recording to %1 Ha cambiado la codificación de grabación a %1 Changed resample quality to: %1 La calidad de cambio de muestreo se establece a: %1 JackDriver Jack Driver: Couldn't connect to the jack server, is jack running? Driver Jack: No se puede conectar al servidor Jack. ¿Está funcionando Jack? Jack Driver: Connected successfully to the jack server! Driver Jack: Conectado con éxito al servidor Jack ! KeyboardConfigPage No description set for this keymap No se ha establecido descripción para este mapa de teclado KeyMap Export Exportación del Mapa de Teclado The exported keymap can be found here: %1 El mapa de teclado exportado se encuentra aquí: %1 Form Formulario Configure Keyboard Configurar teclado <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Double fact timeout:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The maximum time in miliseconds between 2 key presses </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">to determine if the 2 key presses are a double fact ( &lt;&lt; K &gt;&gt; or &lt;&lt; KK &gt;&gt;)</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> or 2 individual key presses ( a &lt; K &gt; and &lt; K &gt; action, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">or &lt; KK &gt; and &lt; KK &gt; action for example).</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Experienced users can set this value as low as 150 ms, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">if you don't have much experience yet, please leave the default of 180 ms.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">For more information, see chapter 7: Key Actions. of the User Manual</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Tiempo de pulsación doble:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">El máximo tiempo, en milisegundos, entre dos pulsaciones de tecla </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">para diferenciar si se trata una pulsación doble (una &lt;&lt; K &gt;&gt; )</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> o dos pulsaciones individuales ( una &lt; K &gt; y otra &lt; K &gt; </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">o acciones &lt; KK &gt; y &lt; KK &gt; por ejemplo).</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Los usuarios experimentados pueden usar un valor bajo, como 150 ms, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">pero si aún no tiene mucha experiencia, deje el vaor por defecto de 180 ms.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Para más informació, consulte el capítulo 3, Acciones de Teclado, del manual de usuario</p></body></html> <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Bitstream Vera Sans; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Double fact timeout (ms)</p></body></html> <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Bitstream Vera Sans; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Pulsación doble (ms)</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Hold timeout:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The maximum time to consider a pressed key a hold key fact, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">like [ K ] or [ KK ].</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The shorter this time, the sooner a pressed key will be </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">detected as a hold action. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Experienced users can set this value as low as 110 ms, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">if you don't have much experience yet, please leave the default of 150 ms.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">For more information, see chapter 7: "Key Actions" of the User Manual.</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:8pt; font-weight:400; font-style:normal;"> <table border="0" style="-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;"> <tr> <td style="border: none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; font-weight:600;">Tiempo de Pulsación Mantenida:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">El tiempo máximo para considerar una pulsación de tecla como mantenida, </span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">como [ K ] o [ KK ].</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">Cuanto más corto sea este valor, antes será considerada la pulsación </span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">como pulsación mantenida. </span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">Los usuarios experimentados pueden usar un valor bajo, como 130 ms, </span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">si Ud. aún no tiene mucha experiencia, mejor use el valor por defecto de 180 ms.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">Para más información, ver Cap. 3: "Acciones de Teclado" del Manual de Usuario.</span></p></td></tr></table></body></html> <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Bitstream Vera Sans; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Hold timeout (ms)</p></body></html> <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Bitstream Vera Sans; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Pulsación mantenida (ms)</p></body></html> Keymap Mapa de teclado Select keymap Seleccionar mapa de teclado Export Keymap Exportar mapa de teclado Print Keymap Imprimir mapa de teclado LanguageName English The name of this Language, e.g. German would be Deutch Español MarkerDialog Markers Marcadores Position Posición Title Titulo Options Opciones ISRC: ISRC: Apply to all Aplicar a todo ... ... Pre-Emphasis Pre-Emphasis Copy protection Protección de copia Position: (MM:SS:75ths) Posición: (MM:SS:75-avos) CD-Text Texto del CD Title: Titulo: Performer: Intérprete: Composer: Compositor: CD-Text optional Texto opcional del CD Songwriter Letrista Arranger: Arreglista: Message: Mensaje: &Remove &Eliminar &Export E&xportar &Ok &Ok &Cancel &Cancelar MoveClip Copy Clip Copiar Clip Move Clip Mover Clip Move Clip To Start Mover Clip al principio Move Clip To End Mover Clip al final Fold Sheet Desplazar hoja Fold Track Desplazar pista Fold Markers Desplazar marcadores MoveEdge Move Clip Edge Mover el borde del clip NewProjectDialog You must supply a name for the project! Debe proporcionar un nombre para el proyecto ! Traverso - Question Traverso - Pregunta The Project "%1" already exists, do you want to remove it and replace it with a new one ? El proyecto "%1" ya existe. ¿Quiere borrarlo y reemplazarlo por uno nuevo? Yes Si No No Couldn't create project (%1) No se puede crear el proyecto (%1) Open Audio Files Abrir archivos de audio Audio files (*.wav *.flac *.ogg *.mp3 *.wv *.w64) Archivos de Audio (*.wav *.flac *.ogg *.mp3 *.wv *.w64) New Project Proyecto nuevo Name Nombre Description Descripción Engineer Ingeniero Import Audio Files Importar archivo de audio Empty Project Proyecto vacío ... ... Track Name Nombre de la pista File Archivo Copy files to project directory Copiar archivos al directorio del proyecto Number of Sheets Número de hojas Tracks per Sheet Pistas por hoja Use Template Usar plantilla NewSheetDialog I can't create a new Sheet if there is no Project loaded!! No se puede crear una Hoja nueva si no hay un Proyecto cargado! Added %n Sheet(s) Se añadió %n Hoja Se añadieron %n Hojas New Sheet(s) Nuevas hoja(s) New Sheet name Nombre de la nueva Hoja Sheet count Número de hojas Track count Número de pistas Use Template Usar Plantilla NewTrackDialog I can't create a new Track if there is no Project loaded!! No se puede crear una Pista nueva si no hay un Proyecto cargado! Added %n Track(s) Se añadieron %n Pista(s) Se añadieron %n Pista(s) New Track(s) Nuevas pista(s) Track name Nombre de la pista Track count Número de pistas OpenProjectDialog <p>Project directory name <b>%1</b> is different from the Project title <b>%2</b>!</p><p>Did you rename the Project directory ? </p><p>Please rename the directory back to the Project title <b>%1</b>, and change the Project title with the Project Manager Dialog!</p> <p>El nombre del directorio del Proyecto <b>%1</b> es diferente del título del Proyecto <b>%2</b>!</p><p>¿Ha renombrado Ud. el directorio del Proyecto? </p><p>Por favor, vuelva a nombrar el directorio con el título del Proyecto <b>%1</b>, y cambie el título del Proyecto usando el gestor Proyectos!</p> Description: Descripción: Created on: Creado el: No Project selected! No hay proyecto seleccionado! Select a project and click the 'Load' button again Seleccione un proyecto y pulse el botón 'Cargar' de nuevo Project %1 does not exist, did you rename or remove the directory what that name ? El Proyecto %1 no existe. ¿Lo ha renombrado, o borrado el directorio de ese nombre? You must supply a name for the project! Debe proporcionar un nombre para el proyecto ! Project does not exist! (%1) El Proyecto no existe (%1) Traverso - Question Traverso - Pregunta Are you sure that you want to remove the project %1 ? It's not possible to undo it ! ¿Está seguro de querer borrar el proyecto %1 ? No se puede deshacer! Choose an existing or create a new Project Directory Cree un directorio de proyecto nuevo, o elija uno existente Traverso - Warning Traverso - Advertencia This directory is not writable by you! Usted no puede escribir en este directorio! Please check permission for this directory or choose another one: %1 Compruebe los permisos de este directorio, o elija uno distinto %1 Unable to create Project directory! No se puede crear el directorio del Proyecto! Please check permission for this directory: %1 Compruebe los permisos de este directorio: %1 Traverso - Information Traverso - Información Created new Project directory for you here: %1 Traverso ha creado el nuevo directorio de Proyecto aquí: %1 Open Project Abrir Proyecto Selected Project Proyecto Seleccionado Load Cargar Delete Borrar Select Project Dir Seleccionar directorio de Proyecto PADriver PADriver:: PortAudio error: %1 PADriver:: Error de PortAudio: %1 PADriver:: hostapi %1 was not found by Portaudio! PADriver:: hostapi %1 no fué encontrado por Portaudio! PaDriverPage Form Formulario Portaudio drivers Drivers de Portaudio <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">PortAudio Driver:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The driver which should drive the PortAudio backend</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">PortAudio supports many driver backends, some of which Traverso has native support for too. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It is recommended to use Traverso's native drivers instead of using PortAudio's, however, if the native drivers give problems, you might try the ones supplied by PortAudio instead!</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">PortAudio provides transparent driver support for multiple platforms, including Windows (see the wmme, direct x and asio options), and Mac OS X (see the CoreAudio and jack options)</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;"> Driver PortAudio:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">El driver que debiera controlar el motor de PortAudio</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">PortAudio admite muchos drivers, para varios de los cuales Traverso tembién tiene soporte nativo. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Se recomienda usar los drivers nativos de Traverso en vez de los de PortAudio. Sin embargo, puede probar los de PortAudio si encuentra problemas con los drivers nativos!</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">PortAudio proporciona soporte transparente para los drivers en varias plataformas, incluyendo Windows (ver las opciones de wmme, directx y asio), y Mac OS X (ver las opciones de CoreAudio y Jack))</p></body></html> Driver Driver PerformanceConfigPage Form Formulario Audio file buffering Archivo del buffer de audio <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Read buffer size:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The amount of audio data that can be stored in the </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">read buffers in seconds.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The default value of 1 second should do just fine.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">However, if you're tight on memory, you can make this value lower.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If you experience buffer underruns when the hard disk bandwidth is </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(almost) saturated, or when buffer underruns happen regularly due </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">the hard disk can't keep up for some reason, you can try a larger </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">value, like 1.5 or 2.0 seconds.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Keep in mind that when using a larger buffer, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">it will take considerably more time to move (i.e. seeking) </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">the playhead to another positions, since all the buffers </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(one for each audioclip * channel count) need to be refilled!</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Tamaño del buffer de lectura (s):</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">La cantidad de datos de audio que pueden guardarse en </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">los buffers de lectura, en segundos.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">El valor por defecto de 1 segundo debiera ser adecuado.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Sin embargo, si está escaso de memoria, puede usar un valor menor.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Si nota underruns (pequeñas interrupciones) cuando el diso duro está transmitiendo a </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(casi) plena velocidad, o cuando ocurren frecuentes underruns debido </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">a que el disco no puede "seguir el ritmo" por cualquier motivo, puede probar </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">un valor mayor, como 1.5 o 2.0 segundos.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Nótese que cuando se usa un buffer mayor, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">llevará más tiempo el mover el cursor a otras posiciones</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> (por ej. en búsquedas), ya que todos los buffers </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(uno por cada clip de audio * número de canales) necesitan volver a llenarse!</p></body></html> Read buffer size (seconds) Tamaño del buffer de lectura (seg) info icon Icono de información Changing the buffer size only will take into effect after (re)loading a project. El cambio del tamaño del buffer tendrá efecto sólo tras (re)cargar el Proyecto. Painting Cómo dibujar <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The number of times per second at which the Graphical</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Items are repainted during a jog action, like moving an</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">AudioClip, or changing the Gain.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The default frames per second of 35 is a perfect compromise </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">between smooth painting, and low cpu usage.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">However, if you find the painting to be not smooth enough,</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">change this value to a higher one, but keep in mind that it</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">will consume considerably more cpu!</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If for example moving an AudioClip still takes to much cpu,</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">you should consider to lower this value.</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">El número de veces por segundo que los objetos gráficos</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">son redibujados durante una acción de movimiento, como mover</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">un Clip, o cambiar una ganancia.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">El valor por defecto de 35 cuadros/seg. consigue un buen equilibrio </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">entre continuidad al dibujar y un uso moderado de CPU.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">No obstante, si aprecia que el dibujado no es lo bastante continuo,</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">cambie este valor por uno más alto, pero recordando </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">que consumirá bastante más CPU!</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Si por ejemplo, mover un Clip aún consume demasiada CPU, puede </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">considerar reducir este valor.</p></body></html> Jog repaint speed (fps) Velocidad de redibujado al mover (fps) <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Accelerates the painting of AudioClips and Tracks by using</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">the 3D engine of your graphics card.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Depending on your graphics card and driver support, this </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">can speed up painting considerably!</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Acelera el dibujado de los Clips y las pistas, usando </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">el motor 3D de la tarjeta gráfica.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Dependiendo de su trajeta gráfica y del soporte del </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">driver, ésto puede acelerar el dibujado considerablemente!</p></body></html> Use hardware acceleration Usar aceleración por hardware PluginSelectorDialog Plugin Selector Selector de plugins Add Plugin too Añadir también Plugin Plugin Name Nombre del plugin Type Tipo In/Out Entrada/Salida OK OK Cancel Cancelar ProgressToolBar Progress Toolbar Barra de progreso Importing file %1 of %2: %p% Importando archivo %1 de %2: %p% Project Cannot create dir %1 No se puede crear el directorio %1 Created new Project %1 Creado el nuevo Proyecto %1 Project %1: Cannot open project.tpf file! (Reason: %2) Proyecto %1: No se puede abrir el archivo project.tfp (razón: %2) Project %1: Failed to parse project.tpf file! (Reason: %2) Proyecto %1: Fallo al procesar el archivo project.tfp (razón: %2) Project File Version does not match, unable to load Project! La versión del archivo de proyecto no corresponde. No se puede cargar el Proyecto! Project %1 loaded Proyecto %1 cargado Couldn't open Project properties file for writing! (File %1. Reason: %2) No se puede abrir el fichero de propiedades del Proyecto para escritura (Archivo %1. Razón: %2) Project %1 saved Proyecto %1 guardado Project with title '%1' allready exists, not setting new title! El Proyecto de título '%1' ya existe. No se asigna un título nuevo! Project directory %1 no longer exists, did you rename it? Shame on you! Please undo that, and come back later to rename your Project... El directorio del Proyecto %1 ya no existe. ¿Lo ha renombrado? En ese caso deshaga esa acción y vuelva aquí para renombrar el Proyecto... Traverso - Information Traverso - Información Project title changed, Project will to be reloaded to ensure proper operation El Proyecto se volverá a cargar, porque su nombre ha cambiado Sheet %1 added Hoja %1 añadida Sheet '%1' doesn't exist! La hoja '%1' no existe! Remove Sheet %1 Quitar la Hoja %1 Export already in progress, cannot start it twice! La exportación ya se está realizando. No puede iniciarse dos veces! Unable to create export directory! Please check permissions for this directory: %1 No se puede crear el directorio de exportación. Compruebe los permisos de este directorio: %1 Detected clipping in exported audio! (%1) clipping=saturación, apmplitud fuera de rango Detectada saturación en el audio exportado (%1) calculated norm factor: %1 Factor de normalización calculado: %1 You're still recording, please stop recording first to be able to exit the application! Todavía está grabando. Detenga la grabación para poder salir de la aplicación! ProjectConverter Project file with version %1 cannot be converted, only files with version 2 can! El archivo de proyecto con versión %1 no puede ser convertido. Sólo se puede con archivos de versión 2 ! Project %1: Failed to parse project.tpf file! (Reason: %2) Proyecto %1: Fallo al procesar el archivo project.tfp (razón: %2) Starting to convert Project from version 2 to version 3 Iniciando la conversión del Proyecto desde la versión 2 a la 3 Converting project.tpf file..... Done! Convirtiendo el archivo project.tfp... ¡Hecho! <b>Need to convert %1 files</b> <b>Es necesario convertir %1 archivos</b> Couldn't open Project properties file for writing! (File %1. Reason: %2) No se puede abrir el fichero de propiedades del Proyecto para escritura (Archivo %1. Razón: %2) Project %1 converted Proyecto %1 convertido Saving converted project.tpf file.... Done! Guardando el archivo project.tfp convertido... ¡Hecho! Conversion finished succesfully La conversión finalizó con éxito No conversion description available! No está disponible la descripción de la conversión! Conversion stopped on user request, you can continue to use this Project with Traverso <= 0.41.0, or reopen it with this version of Traverso and start the conversion again Conversión detenida a petición del usuario. Puede continuar usando este proyecto con Traverso <= 0.41.0, o volverlo a abrir con esta versión de Traverso y comenzar de nuevo la conversión ProjectConverterDialog Project Converter Convertidor de Proyectos Project XXX (no translation needed) Proyecto XXX (no necesita traducción) Conversion information Información de la conversión Conversion progress Progreso de la conversión Start conversion Comenzar conversión Stop conversion Detener conversión Load Project Cargar Proyecto Close Cerrar ProjectInfoWidget Project Information Widget Accesorio para Información del Proyecto Bitdepth Profundidad de bits - - Rate Tasa Songs Canciones Project Proyecto ProjectManager Save Project Guardar Proyecto Do you want to save the Project before quiting? ¿Guardar el proyecto antes de salir? Project %1 already exists! El Proyecto %1 ya existe! Unable to create new Project %1 No se puede crear el nuevo Proyecto %1 Unable to load Project %1 No se puede cargar el nuevo Proyecto %1 No Project to save, open or create a Project first! No hay un Proyecto que guardar. Abra o cree un Proyecto antes! Choose a directory to store your Projects in Elija un directorio donde guardar los proyectos Traverso - Warning Traverso - Advertencia No directory was selected, to retry open the 'Open Project Dialog' and click 'Select Project Directory' button No hay ningún directorio selecionado. Para reintentar, en la ventana 'Abrir Proyecto' pulse el botón 'Seleccionar Directorio de Proyectos' This directory is not writable by you! Usted no puede escribir en este directorio! Please check permission for this directory or choose another one: %1 Compruebe los permisos de este directorio, o seleccione otro distinto. %1 Using existing Project directory: %1 Usando el directorio de proyectos existente: %1 Unable to create Project directory! No se puede crear el directorio del Proyecto! Please check permission for this directory: %1 Compruebe los permisos de este directorio: %1 Created new Project directory for you here: %1 Traverso ha creado el nuevo directorio de Proyecto aquí: %1 Project %1 no longer could be found! (Did you remove or rename the Project directory ?) Ya no puede encontrarse el directorio %1 (¿ha borrado o renombrado Ud. el directorio del proyecto?) Default Project created by Traverso Proyecto por defecto creado por Traverso Could not rename Project directory to %1 No se puede renombrar el directorio del Proyecto como %1 Projectfile backup: The project file %1 could not be opened for reading (Reason: %2) Backup del archivo del Proyecto. El archivo de proyecto %1 no se puede abrir para lectura (razón: %2) Cannot create dir %1 No se puede crear el directorio %1 ProjectManagerDialog No new Sheet name was supplied! ¡No se ha proporcionado un nombre pata la nueva Hoja! Save Template Guardar plantilla Enter Template name Ponga el nombre de la Pantilla Unable to create directory %1! No se puede crear el directorio %1 ! Traverso - Information Traverso - Información Template with name %1 already exists! Do you want to overwrite it? La plantilla de nombre %1 ya existe. ¿Desea sobreescribirla? Saved Project Template: %1 Plantilla de Proyecto guardada: %1 Couldn't open file %1 for writing! No se puede abrir el fichero %1 para escritura! Project with title '%1' allready exists, please supply a different title! El Proyecto de título '%1' ya existe. Ponga un título distinto! Dialog Diálogo Project Proyecto Informational Informativo Title Titulo Description Descripción Engineer Ingeniero Export Exportar Sheet(s) Hoja(s) Template Plantilla Sheets Hojas Sheet Name Nombre de la Hoja Tracks Pistas Length Duración Selected Sheet Hoja seleccionada Delete Borrar Rename Cambiar nombre New Sheet Hoja nueva Create new Sheet Crear Hoja nueva CD Text Texto del CD Performer Intérprete Disc ID: ID del disco: UPC EAN: UPC EAN: Genre: Género: Unused Sin usar Undefined Sin definir Adult Contemporary Música moderna Alternative Rock Rock alternativo Childrens Niños Classical Clásica Contemporary Christian Música Cristiana Country Música Country Dance Música Dance Easy Listening Música ligera Erotic Música Erotica Folk Música Folk Gospel Música Gospel Hip Hop Hip Hop Jazz Jazz Latin Música Latina Musical Musicales New Age New Age Opera Opera Operette Opereta Pop Music Música Pop Rap Rap Reggae Reggae Rock Music Música rock Rhythm and Blues Rhythm and Blues clásico Sound Effects Efectos sonoros Spoken Word Palabra hablada World Music Músicas del mundo Arranger Arreglista Songwriter Letrista Message Mensaje <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Undo last change</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Deshacer el último cambio</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Redo last change</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Rehacer el último cambio</p></body></html> undotext deshacer texto redotext rehacer texto QObject AudioClip Clip de Audio Curve Curva CurveNode Nodo de Curva FadeCurve Curva de Fade No error occurred No hubo errores An error occurred when reading from the file. Hubo un error al leer del archivo. An error occurred when writing to the file. Hubo un error al escribir en el archivo. A fatal error occurred. Ha habido un error fatal. The file could not be opened. No se puede abrir el fichero. Resourc error Resourc error The operation was aborted. La operación fué cancelada. A timeout occurred. Se sobrepasó el tiempo límite. An unspecified error occurred. Hubo un error no especificado. The file could not be removed. No se puede borrar el fichero. The file could not be renamed. No se puede renombrar el fichero. The position in the file could not be changed. La posición no se puede cambiar dentro del archivo. The file could not be resized. El archivo no puede ser redimensionado. The file could not be accessed. No se puede acceder al archivo. The file could not be copied. No se puede copiar el fichero. Unknown error Error desconocido Marker Marcador Sheet Hoja TimeLine Línea de tiempo Track Pista QuickStartDialog Traverso: Getting Started Traverso: Para comenzar <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"><span style=" font-size:18pt; font-weight:600;">Traverso: Getting Started</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">When you record or import an audio file into Traverso, it shows up as an Audio Clip in one of the horizontal Tracks in the current Sheet. You can edit many aspects of these Clips by placing the mouse pointer over a Clip and pressing or holding different keys on your keyboard and mouse. You can also change settings of a Track, the Sheet as a whole, and other objects in the Sheet.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">To see a list of what commands are available for any given object in the Sheet, move the mouse over that object, and Right-Click (or press Q). The keyboard shortcuts for each command are shown in the menu. The notation used is shown below.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; K &gt; </span> means press and release the K key. (Like a click.)</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"><span style=" font-weight:600;">&lt;&lt; K &gt;&gt;</span> means press the K key two times fast. (Like a double click.)</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ K ]</span> means drag the mouse while holding down the K key.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; KL &gt; </span> means press the K and L keys at the same time.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ KL ] </span> means drag the mouse while holding down the K and L keys at the same time.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">Here are some basic commands:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; SPACE &gt;</span> is Play/Stop.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; SHIFT &gt;</span> sets the Playhead. (Blue vertical line where playing starts.)</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; W &gt;</span> sets the Work Cursor. (Red vertical line.)</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; V &gt; </span> moves the Playhead back to the Work Cursor.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ D ] </span> move objects around (Audio Clip, Curve Nodes, etc)</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ Z ]</span> zooms in and out.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ TAB ]</span> scroll omnidirectional (aka Shuttle) </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">And some Audio Clip Commands:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ E ] </span> drags a Clip's left or right edge.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ F ]</span> adjusts the length of a Clip's Fade In / Fade Out.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ G ] </span>addust the Gain of a clip (also works on Tracks, Sheet)</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; X &gt;</span> splits the Clip at the cursor's position.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">For more information, right-click on everything, or check out the Traverso manual.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:18pt; font-weight:600;">Traverso: Para comenzar</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2';"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2';">Cuando graba o importa un archivo de audio en Traverso, éste lo muestra como un Clip de Audio en una de las Pistas horizontales de la hoja activa. Puede editar muchos aspectos de estos Clips situando el ratón sobre un Clip, y presionando (o manteniendo presionadas) diferentes teclas de su teclado o ratón. También se pueden cambiar los ajustes de una Pista, de la Hoja completa, y de otros objetos de la Hoja.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2';"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2';">Para ver una lista completa de los comandos que están disponibles para un objeto determinado de la hoja, ponga el ratón sobre ese objeto y pulse el botón derecho (o la tecla Q). Los atajos de teclado para cada comando se muestran en el menú. La notación se indica a continuación.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2';"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2';"> </span><span style=" font-family:'MS Shell Dlg 2'; font-weight:600;">&lt; K &gt; </span><span style=" font-family:'MS Shell Dlg 2';">significa presionar y liberar la tecla K (como un click).</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-weight:600;">&lt;&lt; K &gt;&gt;</span><span style=" font-family:'MS Shell Dlg 2';"> significa presionar la tecla K dos veces, rápidamente (como un doble click)</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2';"> </span><span style=" font-family:'MS Shell Dlg 2'; font-weight:600;">[ K ]</span><span style=" font-family:'MS Shell Dlg 2';"> significa mover el ratón mientras se mantiene presionada la tecla K.</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2';"> </span><span style=" font-family:'MS Shell Dlg 2'; font-weight:600;">&lt; KL &gt; </span><span style=" font-family:'MS Shell Dlg 2';"> significa presionar las teclas K y L al mismo tiempo.</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2';"> </span><span style=" font-family:'MS Shell Dlg 2'; font-weight:600;">[ KL ] </span><span style=" font-family:'MS Shell Dlg 2';"> significa mover el ratón mientras se mantienen pulsadas las teclas K y L.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2';"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2';">Estos son algunos comandos básicos:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2';"> </span><span style=" font-family:'MS Shell Dlg 2'; font-weight:600;">&lt; ESPACIO &gt;</span><span style=" font-family:'MS Shell Dlg 2';"> para Reproducir/Detener.</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2';"> </span><span style=" font-family:'MS Shell Dlg 2'; font-weight:600;">&lt; MAYUSCULAS &gt;</span><span style=" font-family:'MS Shell Dlg 2';"> coloca el Cursor de Reproducción (línea roja vertical).</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2';"> </span><span style=" font-family:'MS Shell Dlg 2'; font-weight:600;">&lt; W &gt;</span><span style=" font-family:'MS Shell Dlg 2';"> coloca el Cursor de Trabajo (línea vertical de puntos grises).</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2';"> </span><span style=" font-family:'MS Shell Dlg 2'; font-weight:600;">&lt; V &gt; </span><span style=" font-family:'MS Shell Dlg 2';"> Lleva el Cursor de Reproducción a la posición del Cursor de Trabajo.</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2';"> </span><span style=" font-family:'MS Shell Dlg 2'; font-weight:600;">[ D ] </span><span style=" font-family:'MS Shell Dlg 2';"> mueve los objetos (Clips de Audio, Nodos de Curvas, etc)</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2';"> </span><span style=" font-family:'MS Shell Dlg 2'; font-weight:600;">[ Z ]</span><span style=" font-family:'MS Shell Dlg 2';"> acerca y aleja la imagen (zoom).</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2';"> </span><span style=" font-family:'MS Shell Dlg 2'; font-weight:600;">[ TAB ]</span><span style=" font-family:'MS Shell Dlg 2';"> scroll omnidireccional (de tipo "shuttle"). </span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2';"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2';">Y algunos comandos para Clips de Audio:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2';"> </span><span style=" font-family:'MS Shell Dlg 2'; font-weight:600;">[ E ] </span><span style=" font-family:'MS Shell Dlg 2';"> amplía el Clip por el extremo derecho o izquierdo.</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2';"> </span><span style=" font-family:'MS Shell Dlg 2'; font-weight:600;">[ F ]</span><span style=" font-family:'MS Shell Dlg 2';"> ajusta la duración del Fade de entrada o salida del Clip.</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2';"> </span><span style=" font-family:'MS Shell Dlg 2'; font-weight:600;">[ G ] </span><span style=" font-family:'MS Shell Dlg 2';">ajusta la ganancia de un Clip (también funciona con Pistas y Hojas)</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2';"> </span><span style=" font-family:'MS Shell Dlg 2'; font-weight:600;">&lt; X &gt;</span><span style=" font-family:'MS Shell Dlg 2';"> divide el Clip en la posición del ratón.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2';"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2';">Para más información, pulse con el botón derecho en cualquier elemento, o consulte el manual de Traverso.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2';"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2';"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2';"></p></body></html> ReadSource Silence Silencio Could not open file No se puede abrir el fichero Invalid channel count Número de canales inválido File has zero channels El archivo tiene cero canales The file does not exist! El archivo no existe! No ReadSource error set No se estableció un error de Lectura del Origen RecordingConfigPage Form Formulario Recording Grabación <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">WAV</span> : A format without compression. Uses more hard disk space then compressed encoding formats, but needs very little cpu.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Limits : ~ 1.7 hours of recording time @ Stereo - 44.1 KHz</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">WavPack</span> : A format with compression, up to 2 times smaller compared to WAV, and no quality loss. Uses significantly more cpu then WAV, but with modern (year 2005 and above) cpu's this shouldn't be a problem.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Using this format stresses the hard disk much less, increasing hard disk live, and less chance of saturating the hard disk bandwidth.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Limits : ~ 5 hours recording time @ Stereo - 44.1 KHz</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">WAV64</span> : WAV format with 64 bit header, support by other programs is currently limited.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Limits : None, thousands of hours of recording time, supposed that your hard disk can hold it.</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">WAV</span> : Un formato sin compresión. Usa más disco duro que los formatos comprimidos, pero carga muy poco a la CPU.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Límites : ~ 1.7 horas de tiempo de grabación en Stereo - 44.1 KHz</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">WavPack</span> : Un formato con compresión. Puede reducir el tamaño hasta la mitad que un WAV, sin pérdida de calidad. Aunque requiere bastante más CPU, eso no debiera ser un problema en un ordenador moderno (año 2005 en adelante).</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">El uso de este formato hace trabajar mucho menos al disco duro, aumentando su vida útil y disminuyendo la probabilidad de que su ancho de banda se sature.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Límites : ~ 5 horas de tiempo de grabación en Stereo - 44.1 KHz</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">WAV64</span> : formato WAV con cabecera de 64 bit. Actualmente soportado por pocos programas.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Límites : Ninguno, miles de horas de grabación, suponiendo que quepan en su disco duro.</p></body></html> Encoding format Formato de codificación WavPack options Opciones WavPack Compression type Tipo de compresión <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This option reduces the storage of some floating-point data files by up to about 10% by eliminating some information that has virtually no effect on the audio data. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">While this does technically make the compression lossy, it retains all the advantages of floating point data (&gt;600 dB of dynamic range, no clipping, and 25 bits of resolution). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This also affects large integer compression by limiting the resolution to 24 bits.</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Esta opción reduce el almacenamiento de algunos archivos de coma flotante hasta un 10% eliminando cierta información que no tiene prácticamente ningún efecto en el audio. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Aunque técnicamente esto sería "compresión con pérdidas", mantiene todas las ventajas de procesar en coma flotante (&gt;600 dB de rango dinámico, sin "clipping" (saturación), y 25 bits de resolución).</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Esto también afecta a la compresión al usar "enteros grandes", al limitar la resolución a 24 bits.</p></body></html> Skip WVX for extra compression (semi-lossless) Eludir WVX para mayor compresión (casi sin pérdidas) Resampling Cambio de muestreo Enable on the fly resampling (Playback only) Habilitar cambio de muestreo "al vuelo" (durante la reproducción) On the fly resample quality Calidad del cambio de muestreo "al vuelo" Default export resample quality Calidad por defecto del cambio de muestreo al exportar Best Mejor High Alta Medium Media Fast Rápida ResourcesManager ResourcesManager:: Failed to initialize ReadSource %1 (Reason: %2) Gestor de Recursos:: Falló al inicializar el Origen de Lectura %1 (razón %2) ResourcesManager: Received request to remove Audio Source %1but it is still in use by %2 AudioClips!!. NOT removing it! Gestor de Recursos: Recibió petición de borrar la Fuente de Audio %1 pero aún está en uso por %2 Clips de Audio. ¡NO se borra! ResourcesWidget Form Formulario Sources Origenes Files Archivos Name Nombre Length Duración Start Comienzo End Final RestoreProjectBackupDialog Restore from backup Restaurar desde backup Set the date to restore the selected backup. Seleccionar la fecha del backup a restaurar. Current date and time: Fecha y hora actuales: Last backup: Ultimo backup: - - Date Fecha Time Hora SettingsDialog Preferences - Traverso Preferencias - Traverso Behavior Proyecto Appearance Aspecto Sound System Driver Audio Options Opciones Keyboard Teclado Performance Rendimiento Sheet No artists name set No se estableció nombre de artista No audio to export! (Is everything muted?) No hay audio que exportar (¿está todo silenciado?) Export start frame starts beyond export end frame!! ¡ El comienzo de la exportación está después de su final ! Export tries to render to 0 channels wav file?? ¿La exportación intenta hacerse a un archivo wav de 0 canales? Untitled Sin Titulo Add Track Añdir Pista Remove Track Eliminar Pista Hard Disk overload detected! ¡ Se detectó sobrecarga del disco duro ! Failed to fill ReadBuffer in time No se pudo llenar a tiempo el Buffer de Lectura Failed to empty WriteBuffer in time No se pudo vaciar a tiempo el Buffer de Escritura No Tracks armed for recording! ¡No hay Pistas armadas para grabación! Recording to %n Clip(s) Grabando en %n Clip Grabando en %n Clips SongInfoWidget SongInfoWidget Accesorio de Info de Canción Song Canción - - Snap Pegajoso Gain Ganancia SMPTE SMPTE Zoom Zoom SpectralMeterConfigWidget FFT-Spectrum Configuration Configuración del espectro FFT Frequency Range Rango de frecuencias Show average spectrum Mostrar espectro promedio Number of bands: Número de bandas: Lower dB value: Valor inferior dB: Upper dB value: Valor superior dB: Hz Hz Lower Limit: Límite inferior: Upper Limit: Límite superior: Advanced FFT Options Opciones FFT avanzadas FFT Size: Tamaño FFT: 256 256 512 512 1024 1024 2048 2048 4096 4096 8192 8192 Rectangle Rectángulo Hanning Hanning Hamming Hamming Blackman Blackman Windowing function: Función ventana: Advanced Avanzado Apply Aplicar &Close &Cerrar SpectralMeterView Screen Capture file name Nombre de archivo para la Captura de Pantalla FFT: Unable to write captured image to hard disk FFT: No se puede escribir la imagen capturada al disco duro FFT: No avarage curve used, not data to export! FFT: No se usó ninguna curva de promedio. ¡No hay datos que exportar! FFT: Enable avarage curve with < M > to generate data FFT: Habilite curva promedio con < M > para generar datos FFT: No avarage data to export! FFT: No hay datos promedio que exportar! Select output format Selección de formato de salida Output format: Formato de salida: Export average dB curve Exportar curva dB promedio SplitClip Split Clip Dividir Clip SysInfoToolBar System Information Información del Sistema SystemInfoWidget SystemInfoWidget Utilidad de Info del Sistema Card Name (na) Nombre de la Tarjeta (na) image Imagen buffer size (na) Tamaño de buffer (na) rate Tasa - GB - GB drivertype (na) Tipo de driver (na) xruns (na) xruns (na) latency (na) Latencia (na) - % - % bitdepth Profundidad de bits SystemResources Read Buffer Status Estado del buffer de lectura Write Buffer Status Estado del buffer de escritura TimeLine Add Marker Añadir Marcador Remove Marker Quitar Marcador TimeLineView End Final Add Marker Añadir marcador You have to remove all other markers first. Debe quitar primero los demás marcadores. Drag Marker Mover marcador Clear Markers Borrar Marcadores Track Track: AudioClip with id %1 not found in Resources database! Pista: el AudioClip con id. %1 no fué encontrado en la base de datos! Remove Clip Borrar Clip Add Clip Añadir Clip Silence Others Silenciar los otros TrackPan Track Pan: %1 Panorama de la Pista: %1 Track Pan Panorama de la Pista TrackView Set Track name Nombre de la pista Enter new Track name Ponga el nuevo nombre de la pista Track %1: %2 Pista %1: %2 TransportConsoleWidget Skip to Start Saltar al principio Previous Snap Position Posición pejagosa anterior Record Grabar Play / Stop Reproducir / Detener Next Snap Position Posición pegajosa siguiente Skip to End Saltar al final Recording to %1 Tracks, encoding format: %2 Grabando en %1 Pistas, formato de codificación: %2 TraversoCommands Gain Ganancia Gain: Reset Ganancia: restaurar Panorama Panorama Panorama: Reset Panorama: restaurar Import Audio Importar Audio Insert Silence Insertar Silencio Copy Clip Copiar Clip New Track Nueva pista Remove Clip Borrar Clip External Processing Procesado externo (De)Select (De)selecccionar (De)Select All (De)selecccionar todo Move Clip Mover Clip Remove Track Eliminar Pista Drag Edge Arrastrar borde Move Or Resize Clip Mover o redimensionar Clip Split Dividir Magnetic Cut Corte magnético Arm Tracks Armar Pistas Fold Sheet Desplazar hoja Fold Track Desplazar pista Fold Markers Desplazar marcadores Vertical In Vertical - más Horizontal Out Horizontal - menos Horizontal In Horizontal - más Vertical Out Vertical - menos Omnidirectional Omnidireccional Horizontal Horizontal Vertical Vertical Right Derecha Left Izquierda Up Arriba Down Abajo traverso-0.49.4/resources/translations/traverso_nl.ts000644 001750 001750 00000762374 11430303017 023433 0ustar00remonremon000000 000000 AddRemoveClip Remove Clip Verwijder Clip Remove Selected Clips Verwijder Clip Selectie AlsaDevicesPage Form Form ALSA Device ALSA Apparaat <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Device:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The real or virtual ALSA device to be used.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A real device is the audiocard installed in your system.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A virtual device is one created in the .asoundrc file, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">often located in your home folder.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If unsure, use either the default device, this will use the audiodevice </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">configured by your distribution, or the device that names your audio card.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">In the latter case, please make sure no application uses the audiocard, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">else the driver won't be able to initialize!</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">For more info see chapter 3.1: "The Driver Backend" of the User Manual</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Apparaat:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">De echte of virtuele ALSA geluidskaart die wordt gebruikt.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Een echte ALSA geluidskaart is fysiek aanwezig in uw computersysteem.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Een virtuele geluidskaart werd in het .asoundrc bestand aangemaakt. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Dit bestand bevindt zich meestal in uw home folder.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Bij twijfel, kies de standaard-geluidskaart, dus de geluidskaart door uw distributie ingesteld, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">of het apparaat dat naar uw geluidskaart is vernoemd.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">In het laatste geval, verzeker u ervan dat geen andere applicaties van de geluidskaart gebruikmaken, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">zoniet zal de driver niet kunnen starten!</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Voor meer info, zie hoofdstuk 3.1: "The Driver Backend" van de gebruikershandleiding.</p></body></html> Device Apparaat <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Number of Periods:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Audio is managed in small chunks called periods. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This value determines how many of these chunks are </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">to be used by the driver of the audiocard.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The default should work just fine, and gives optimal latency behavior.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">However, some (buggy) alsa drivers don't work correctly </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">with the default of 2, if you experience very choppy audio, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">please try to use 3 periods.</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Aantal perioden:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Audiodata wordt verwerkt in kleine deeltjes, de zogenaamde periods. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Deze waarde bepaalt hoeveel van deze deeltjes je audio kaart tegelijk behandelt</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">De standaardwaarde voldoet in de meeste gevallen, en geeft in ieder geval de laagste latency.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Sommige (slechtgeschreven) alsa drivers werken echter niet zoals het hoort</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">met de standaardwaarde van 2, dus indien audio op uw geluidskaart niet vlot speelt, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">probeer deze waarde eens op 3 te zetten.</p></body></html> Nr. of periods Aantal perioden 2 2 3 3 <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Dither is used to make the audio cleaner. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The best way to describe it is to imagine a painting with many dots. If you view it up close you can see each dot and the image is not very clear. If you view it from far away the image becomes clearer because your eyes/brain dither the dots to smooth out the image. It is a murky subject and obviously a very personal choice as to what dither is the best. For most people it is just plain magic. Anyone running at 16bit who cares about quality or has CPU cycles to spare should run with dither. Triangular is probably the best compromise of quality vs cpu cost (its very fast), but shaped is the best</p></body></html> Dither None Geen Shaped Rectangular Triangular AlsaDriver ALSA Driver: The playback device %1 is already in use. Please stop the application using it and run Traverso again ALSA Driver: Het afspeel apparaat %1 is al in gebruik. Stop de applicatie die het in gebruik heeft a.u.b., en start Traverso opnieuw ALSA Driver: You do not have permission to open the audio device %1 for playback ALSA Driver: U heeft geen toestemming om audio apparaat %1 te openen om af te spelen snd_pcm_open(playback_handle, ..) failed with unknown error type ALSA Driver: The capture device %1 is already in use. Please stop the application using it and run Traverso again ALSA Driver: Opname apparaat %1 is al in gebruik. Stop de applicatie die het in gebruik heeft a.u.b., en start Traverso opnieuw ALSA Driver: You do not have permission to open the audio device %1 for capture ALSA Driver: U heeft geen toestemming om apparaat %1 te openen om op te nemen ALSA Driver: snd_pcm_open(capture_handle, ...) failed with unknown error type ALSA Driver: Cannot open PCM device %1 for playback. Falling back to capture-only mode ALSA Driver: Kan PCM apparaat %1 niet openen om af te spelen. Er wordt terug gevallen op alleen opnemen modus ALSA: Cannot open PCM device %1 for capture. Falling back to playback-only mode ALSA Driver: Kan PCM apparaat %1 niet openen om op te nemen. Er wordt terug gevallen naar alleen afspelen modus ALSA Driver: Unable to configure hardware, is it in use by another application? ALSA Driver: Kan hardware niet configureren, wordt het gebruikt door een andere applicatie ? AppearenceConfigPage Icons only Alleen Iconen Text only Alleen tekst Text beside Icons Tekst naast Iconen Text below Icons Tekst naast Iconen Default Language Select default project dir Selecteer de standaard project map Form Form Theme Theme selector Thema selecteerder Path to theme files Pad naar thema bestanden Available themes Beschikbare themas Adjust theme color Thema kleur aanpassen Theme Options Thema opties Paint audio rectified Geluid positief weergeven <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Painting the waveform with an outline is more detailed, but requires more cpu.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If you experience slowness when painting many clips, or during animated scroll, unselect this option!</p></body></html> Paint audio with outline Teken geluidsvorm met rand Paint stereo audio as mono audio Stereo geluid als mono weergeven Draw lines at 0 and -6 dB Teken lijnen op 0 en -6 dB Style Options Style opties Select style Selecteer style Use selected style's palette Gebruik palet van de geselecteerde stijl Toolbars Werkbalken Icon size Icoon grootte Button style Knop stijl Transport Console size Language Taal Interface Language Interface taal Changing the language of the Interface will take effect after restarting Traverso! ArmTracks Arm Tracks AudioClip Unable to Record to Track Kan niet opnemen naar Track AudioDevice doesn't have this Capture Bus: %1 (Track %2) AudioApparaat heeft deze Opname Bus niet: %1 (Track %2) Normalization Normalizatie Set Normalization level: Geef normalizatie niveau: Toggle Mute Schakel Mute Toggle Lock Vergrendeling aan/uit Remove Fades Verwijder Fades AudioClip: Normalize AudioClipEditDialog Dialog Dialoog Clip Parameters External Processing Externe bewerking hh:mm:ss.sss TextLabel Text Label End Einde Length Lengte Track start Track start Gain Gain Name Naam Fades Fade In Mode Bending Buigen Strength Sterkte &Linear &Default Standaard Fade Out Source AudioClipExternalProcessing Clip: External Processing Clip: Externe bewerking AudioClipManager Selection: Add Clip Selectie: Clip toevoegen Selection: Remove Clip Selectie: Clip verwijderen Selection: Invert Selectie: Omkeren AudioClipView Click to reset AudioFile ! Click om AudioFile opnieuw toe te wijzen ! Reset Audio File for Clip: %1 Zet bestand voor Clip: %1 All files (*);;Audio files (*.wav *.flac) Alle bestanden (*);;Audio bestanden (*.wav *.flac) No file selected! Geen file geselecteerd! Succesfully set AudioClip file to %1 Bestand %1 succesvol toegewezen aan AudioClip AudioDevice No Driver Loaded Geen Driver geladen No Device Configured Geen Apparaat geconfigureerd The Jack server has been shutdown! De Jack server is afgesloten! AudioDevice:: Buffer underrun 'Storm' detected, switching to Null Driver AudioApparaat:: Lange serie 'buffer underruns' ervaren, schakelt over op de Null Driver AudioDevice:: For trouble shooting this problem, please see Chapter 11 from the user manual! AudioApparaat:: Om dit probleem op te lossen, zie Hoofdstuk 11 van de gebuikershandleiding! Audiodevice: Failed to create the Jack Driver Audio apparaat: Maken van de Jack Driver mislukte Audiodevice: Failed to create the ALSA Driver Audio apparaat: Maken van de ALSA Driver mislukte Audiodevice: Failed to create the PortAudio Driver Audio apparaat: Maken van de PortAudio Driver mislukte Audiodevice: Failed to create the PulseAudio Driver Audiodevice: Failed to create the CoreAudio Driver AudioDeviceThread Unable to set Audiodevice Thread to realtime priority!!!This most likely results in unreliable playback/capture and lots of buffer underruns (== sound drops).In the worst case the program can even malfunction!Please make sure you run this program with realtime privileges!!! Kon de Audio bewerkings stroom proriteit niet naar hoogste wijzigen!! Dit heeft zeer waarschijnlijk tot gevolg dat opname and afpelen niet goed werkt, zoals het kort wegvallen van het geluid. Het kan zelfs zorgen voor het niet functioneren van het programma. Zorgt u er a.u.b. voor dat het programma bevoegd is voor Real Time operatie!! AudioDriverConfigPage System default Systeem standaard Form Form Driver Selection Selecteer Driver Driver: Driver: Configure driver Configureer Driver <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Duplex mode:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Defines if both the Playback and Capture buses </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">of your soundcard are to be used, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">or only the Playback or Capture bus(es).</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Duplex mode:</span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Bepaalt of zowel de Playback- als de Capturebus </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">van uw geluidskaart gebruikt worden, </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">or slechts één van de twee.</p></body></html> Duplex mode Duplex modus Full Afspelen én Opnemen Playback Afspelen Capture Opnemen <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Sample rate:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The sample rate used by the audio card.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">New projects will use this samplerate as </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">the project's sample rate on creation.</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Sample rate:</span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">De sample rate die de geluidskaart gebruikt.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Nieuwe projecten gebruiken deze standaard, </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">bij het aanmaken.</p></body></html> Sample rate Sample rate 22050 22050 32000 32000 44100 44100 48000 48000 88200 88200 96000 96000 <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Buffer latency:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The latency introduced by the size of the audio buffers.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Some people need low latencies, if you don't need it, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">or don't know what it means, please leave the default setting!</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Buffer latency:</span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">De vertraging, bepaalt door de grootte van de audio buffers.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Soms is een lage vertraging gewenst. Zoniet, kunt U best</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">de standaardkeuze behouden.</p></body></html> Buffer latency (ms) Buffer vertraging (ms) Restart Driver Driver herstarten Jack Enable Jack transport control Jack transport control inschakelen AudioSourcesManagerWidget Form Form AudioSources Audio Bronnen Remove sources Verwijder bronnen Remove source Verwijder bron Remove all sources Verwijder alle bronnen Remove unused sources Verwijder niet gebruikte bronnen BehaviorConfigPage Form Form Project Settings Project instellingen Load last used project at startup Laatst geopende project laden tijdens start Ask Vraag Don't save Niet opslaan New Sheet Settings Nieuwe Sheet instellingen Playback Settings Afspeel instellingen <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Keep the play cursor in view while playing or recording.</p></body></html> Gedurende afspelen of opnemen de afspeel cursor in beeld houden Scroll playback Afspelen scrollen Jump Spring Stay Centered Centreren Animated Geanimeerd Continuously adjust audio while dragging Geluid synchronizeren tijdens verplaatsen Lock Audio Clips by default Vergrendel standaard de audio clips Audio Clip Settings Audio Clip Instellingen On close: Bij afsluiten: Save Opslaan Number of tracks Aantal Tracks BusSelectorDialog Bus Selector Bus Selecteerder Track Track Capture Buses Opname Bussen Channels Kanalen Both Beide Left Links Right Rechts Playback Buses Afspeel Bussen CDWritingDialog CD Writing CD Schrijven General Options Algemene opties Write current Sheet Schrijf huidig Werkblad (Sheet) Write all Sheets Schrijf alle Werkbladen (Sheets) Calculate and apply normalization Bereken en pas normalizatie toe Export wav and toc files only (don't write CD) Exporteer aleen wave en toc bestanden (CD niet schrijven) Burning Device CD brander Number of copies Aantal kopieën Simulate Simuleren Speed Snelheid auto automatisch 1x 1x 2x 2x 4x 4x 8x 8x 12x 12x 16x 16x 20x 20x 24x 24x 28x 28x 32x 32x 36x 36x 40x 40x 44x 44x 48x 48x Status Status Information Informatie Start Writing Schrijven starten Abort Afbreken Close Sluiten ClipSelection Selection: Remove Clip Selectie: Clip verwijderen Selection: Add Clip Selectie: Clip toevoegen Select Clip Selecteer Clip ClipsViewPort Import %n audiofile(s) Importeer %n Audio bestand Importeer %n Audio bestanden Crop AudioClip: Magnetic Cut Curve Add CurveNode CurveNode toevoegen Remove CurveNode CurveNode verwijderen There is allready a node at this exact position, not adding a new node Er is al een node op precies deze locatie. Node wordt niet toegevoegd CurveView Drag Node Verplaats Node Clear Nodes Nodes verwijderen Dialog Dialog Dialoog OK OK Cancel Annuleren DigitalClock Digital Clock Digitale klok DriverInfo Change Audio Device settings Verander Audio Apparaat instellingen ExportDialog Export Exporteer General Options Algemene opties Export current Sheet Exporteer huidig Werkblad Export all Sheets Schrijf alle Werkbladen (Sheets) Export directory Exporteer map Export status Exporteer status - - Abort Export Stop Exporteren Start Export Start Exporteren Close Sluiten ExportFormatOptionsWidget Best Beste High Hoog Medium Normaal Fast Snel Bitrate Bitrate Average Bitrate Maximum Bitrate Maximum Bitrate Export Format Options Opties voor exporteren Format Options Formateer opties Encoding Encoding File Type Bestands type Channels Kanalen Normalize Audio Normalizeer Audio Bitdepth Bit diepte WavPack options (lossless compression) WavPack opties (lossless compressie) Compression type Compressie type <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This option reduces the storage of some floating-point data files by up to about 10% by eliminating some information that has virtually no effect on the audio data. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">While this does technically make the compression lossy, it retains all the advantages of floating point data (&gt;600 dB of dynamic range, no clipping, and 25 bits of resolution). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This also affects large integer compression by limiting the resolution to 24 bits.</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Deze optie reduceert de grote van het bestand bij sommige floating-point geluids-data tot wel 10%. Het heeft vrijwel geen effect op de kwaliteit van het geluid.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Technisch gesproken is de compressie niet langer lossless, maar behoud het wel al de voordelen van floating point audio (&gt;600 dB dynamisch bereik, geen clipping en 25 bit resolutie). </p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Het heeft ook effect bij comprimeren van 32 bit integer audio data door te comprimeren naar 24 bit resolutie.</p></body></html> Skip WVX for extra compression (semi-lossless) Sla WVX over voor extra compressie (semi-lossless) Ogg Options Ogg opties Quality (Smallest <-> Best) Kwaliteit (Kleinste <-> Beste) Encoding Method Encoding methode MP3 Options MP3 opties Minimum Bitrate Minimum Bitrate Quality (Fastest <-> Best) Kwaliteit (Snelste <-> Beste) Sample Rate Sample rate Conversion quality Conversie kwaliteit ExternalProcessingDialog You have to supply an argument before starting the external process! U moet een argument opgeven voordat u het externe programma start! Available arguments for the sox program Beschikbare opties voor het sox programma Program <b>%1</b> not installed, or insufficient permissions to run! Programma <b>%1</b> is niet geinstalleerd, of u heeft onvoldoende rechten om het te starten! Program <b>%1</b> crashed! Programma <b>%1</b> crashte! FadeBend Fade In: bend Fade In: Buiging Fade Out: bend Fade Out: Buiging FadeCurve Fade Preset FadeMode Fade In: shape Fade In: vorm Fade Out: shape Fade Uit: vorm FadeRange Fade In: length Fade In: lengte Fade Out: length Fade Uit: lengte Fade In: remove Fade In: verwijder Fade Out: remove Fade Uit: verwijder FadeStrength Fade In: strength Fade In: Sterkte Fade Out: strength Fade Out: Sterkte FileWidget My Computer Mijn Computer My Documents Mijn Documenten Parent Directory Bovenliggende map Refresh File View Weergave verversen Import Import audio source Importeer audio bestand Import Audio File Importeer Audio Bestand Insert Silence Stilte invoegen Silence Stilte All files (*) Alle bestanden (*) Audio files (*.wav *.flac *.ogg *.mp3 *.wv *.w64) Audio bestanden (*.wav *.flac *.ogg *.mp3 *.wv *.w64) ImportClipsDialog Import Audio Clips Importeer Audio Clips Import to Track: Importeer in Track: Add Markers Marker toevoegen InputEngine Modifier key actions are not supported from Context Menu Modificeertoetsen werken niet vanuit Context Menu Hold actions are not supported from Context Menu Holdacties werken niet vanuit Context Menu Command Plugin %1 not found! CommandPlugin %1 niet gevonden! Plugin %1 doesn't implement Command %2 Command %2 wordt niet geïmplementeerd door Plugin %1 InsertSilenceDialog Insert Silence Stilte invoegen Insert Silence (seconds): Stilte invoegen (seconden): Interface History Geschiedenis About Traverso Over Traverso &Save &Opslaan &Quit &Afsluiten &About Traverso &Over Traverso Correlation Meter Correlatie Meter FFT Spectrum Resources Bin Bronnen Bak &Project &Project &New... &Nieuw... &Open... &Openen... &Manage Project... &Project Beheer... &Export... &Exporteren... &Sheet &Sheet New &Track(s)... Nieuwe &Track(s)... New &Sheet(s)... Nieuw &Sheet(s)... Import &Audio... Importeer &Audio... Insert Si&lence... Sti&lte invoegen... &View &Beeld System Information Systeem Informatie Se&ttings Op&ties &Preferences... &Voorkeuren... <b>Description</b> <b>Beschrijving</b> <b>Key Sequence</b> <b>Toetsencombinatie</b> Marker Editor... Marker Manager... Traverso %1 (built with Qt %2) A multitrack audio recording and editing program. Look in the Help menu for more info. Traverso is brought to you by R. Sijrier and others, including all the people from the Free Software world who contributed the important technologies on which Traverso is based (Gcc, Qt, Xorg, Linux, and so on) Traverso %1 (gebaseerd op Qt %2) Traverso is een Multitrack audio opname- en editingprogramma. Voor meer info, zie de Help file Traverso werd mogelijk gemaakt door de auteur, R. Sijrier en vele anderen, onder meer iedereen uit de Free Software world, door hun bijdragen aan de technologiën waarop Traverso gebaseerd is (Gcc, Qt, Xorg, Linux, enz...) &Getting Started Om te be&ginnen &User Manual Gebr&uikershandleiding Opening User Manual in external browser! Opent de gebruikershandleiding in een externe browser! &CD Writing... &CD Schrijven... &Restore Backup... &Herstel Backup... &Recording File Format &Opname Bestands Formaat &Resample Quality &Resample Kwaliteit Traverso - Important Traverso - Belangrijk A Project directory changed outside of Traverso. This is NOT supported! Please undo this change now! If you want to rename a Project, use the Project Manager instead! Een Project map is veranderd buiten Traverso om. Dit wordt NIET ondersteund, wilt u a.u.b. dit ongedaan maken! Als u de Project titel wilt veranderen kunt u daarvoor het Project Beheer Dialoog gebruiken! Traverso - Project load failed Traverso - Project laden mislukte The requested Project `%1` could not be loaded for the following reason: '%2' You will now be given a list of available backups (if any) to restore the Project from. Het volgende Project '%1' kon niet geladen worden door volgende oorzaak: '%2' U krijgt nu een lijst met backups te zien om het Project mee te herstellen. Changed encoding for recording to %1 Opname encoding veranderd naar %1 Changed resample quality to: %1 Resample kwaliteit veranderd naar: %1 &Edit Undo Redo &Snap &Snap Snap items to edges of other items while dragging. Tijdens verplaatsen randen laten snappen naar randen van andere objecten. S&croll Playback Afspelen s&crollen Keep play cursor in view while playing or recording. Afspeel cursor in beeld houden tijdens afspelen of opnemen. &Show Effects &Toon Effecten Show effect plugins and automation curves on tracks Plugins en automation curves tonen in Tracks Transport Console Project Project Edit Bewerken Best Beste High Hoog Medium Normaal Fast Snel &Help Open Audio Files Open audio bestand Audio files (*.wav *.flac *.ogg *.mp3 *.wv *.w64) Alle bestanden (*);;Audio bestanden(*.wav *.flac *.ogg *.mp3 *.wv *.w64) %1: %2 JackDriver Jack Driver: Couldn't connect to the jack server, is jack running? Jack Driver: Kon geen verbinding maken met de jack server, is deze geactiveerd ? Jack Driver: Connected successfully to the jack server! Jack Driver: Verbinding met jack server succesvol! KeyboardConfigPage No description set for this keymap Geen beschrijving voorhanden voor deze keymap Form Form Configure Keyboard Configureer Toetsenbord <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Double fact timeout:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The maximum time in miliseconds between 2 key presses </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">to determine if the 2 key presses are a double fact ( &lt;&lt; K &gt;&gt; or &lt;&lt; KK &gt;&gt;)</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> or 2 individual key presses ( a &lt; K &gt; and &lt; K &gt; action, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">or &lt; KK &gt; and &lt; KK &gt; action for example).</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Experienced users can set this value as low as 150 ms, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">if you don't have much experience yet, please leave the default of 180 ms.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">For more information, see chapter 7: Key Actions. of the User Manual</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Keyboard dubbel klik interval:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">De maximum tijd (miliseconden) tussen 2 toetsaanslagen.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Deze bepaalt of 2 opeenvolgende toetsaanslagen een dubbelklik ( &lt;&lt; K &gt;&gt; of &lt;&lt; KK &gt;&gt;)</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> of 2 individuele acties vormen ( a &lt; K &gt; en &lt; K &gt; actie, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">of &lt; KK &gt; en &lt; KK &gt; actie, bijvoorbeeld).</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ervaren gebruikers kunnen waarden tot minimum 150 ms proberen, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">maar voor de meeste gebruikers volstaat de standaardwaarde, 180 ms.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Voor meer informatie, zie hoofdstuk 7: Key Actions. of the User Manual</p></body></html> <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Bitstream Vera Sans; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Double fact timeout (ms)</p></body></html> <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Bitstream Vera Sans; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Toetsenbord dubbel-klik interval (ms)</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Hold timeout:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The maximum time to consider a pressed key a hold key fact, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">like [ K ] or [ KK ].</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The shorter this time, the sooner a pressed key will be </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">detected as a hold action. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Experienced users can set this value as low as 110 ms, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">if you don't have much experience yet, please leave the default of 150 ms.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">For more information, see chapter 7: "Key Actions" of the User Manual.</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Hold interval:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">De maximum tijd (miliseconden) van een enkele toetsaanslag, voor deze als hold actie beschouwd wordt., </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">zoals [ K ] of [ KK ].</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Hoe korter deze is, hoe sneller een ingedrukte toets </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">als hold actie beschouwd zal worden. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ervaren gebruikers kunnen waarden tot minimum 110 ms proberen, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">maar voor de meeste gebruikers is de standaardwaarde van 150 ms voldoende.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Voor meer informatie, zie hoofdstuk 7: "Key Actions" of the User Manual.</p></body></html> <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Bitstream Vera Sans; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Hold timeout (ms)</p></body></html> <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Bitstream Vera Sans; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Hold interval (ms)</p></body></html> Keymap Select keymap Selecteer keymap KeyMap Export KeyMap Export The exported keymap can be found here: %1 De ge-exporteerd keymap kan hier gevonden worden: %1 Export Keymap Export Keymap Print Keymap Keymap afdrukken LanguageName English The name of this Language, e.g. German would be Deutch Nederlands MarkerDialog Markers Position Positie Title Titel Options Opties ISRC: ISRC: Apply to all Op alle toepassen ... ... Pre-Emphasis Voorversterking Copy protection Copy protectie Position: (MM:SS:75ths) Positie: (MM:SS:75sten) CD-Text CD-Tekst Title: Titel: Performer: Uitvoerder: Composer: Componist: CD-Text optional CD-Tekst optioneel Arranger: Arrangeur: Message: Bericht: &Remove &Verwijder &Export &Exporteer Songwriter Lied schrijver &Ok &Cancel MoveClip Copy Clip Clip kopieren Move Clip Clip verplaatsen Move Clip To Start Clip naar begin verplaatsen Move Clip To End Clip naar einde verplaatsen Fold Sheet Fold Track Fold Markers MoveEdge Move Clip Edge Cliprand verplaatsen NewProjectDialog You must supply a name for the project! U dient een Project naam op te geven! Traverso - Question Traverso - Vraag The Project "%1" already exists, do you want to remove it and replace it with a new one ? Project "%1" bestaat reeds, vervangen door een nieuwe? Yes Ja No Nee Couldn't create project (%1) Kon Project "%1" niet aanmaken New Project Nieuw Project Name Naam Description Beschrijving Engineer Opnameleider Tracks per Sheet Aantal tracks per Sheet Use Template Gebruik sjabloon Open Audio Files Open audio bestanden Audio files (*.wav *.flac *.ogg *.mp3 *.wv *.w64) Audio bestanden (*.wav *.flac *.ogg *.mp3 *.wv *.w64) Import Audio Files Importeer Audio Bestanden Empty Project Leeg Project ... ... Track Name Track naam File Bestand Copy files to project directory Copieer bestanden naar Project map Number of Sheets Aantal Sheets NewSheetDialog I can't create a new Sheet if there is no Project loaded!! Kan geen nieuwe Sheet aanmaken als er geen Project geladen is! Added %n Sheet(s) %n Sheet toegevoegd %n Sheets toegevoegd New Sheet(s) Nieuwe Sheet(s) New Sheet name Nieuwe Sheet naam Sheet count Aantal Sheets Track count Aantal Tracks Use Template Gebruik sjabloon NewTrackDialog I can't create a new Track if there is no Project loaded!! Kan geen nieuwe Track aanmaken als er geen Project geladen is! Added %n Track(s) %n Track toegevoegd %n Tracks toegevoegd New Track(s) Nieuwe Track(s) Track name Track naam Track count Track aantal OpenProjectDialog Description: Beschrijving: Created on: Gemaakt op: No Project selected! Geen Project geselecteerd! Select a project and click the 'Load' button again Selecteer een project en klik opnieuw op de "Laad" knop Project does not exist! (%1) Project bestaat niet! (%1) You must supply a name for the project! U dient een projectnaam op te geven! Traverso - Question Traverso - Vraag Are you sure that you want to remove the project %1 ? It's not possible to undo it ! Weet u zeker dat u Project "%1" wilt verwijderen? Het is niet mogelijk om dit ongedaan te maken! Choose an existing or create a new Project Directory Selecteer een bestaande Project map, of maak een nieuwe Traverso - Warning Traverso - Waarschuwing Unable to create Project directory! Kon Project map niet aanmaken! Please check permission for this directory: %1 Controleer toegangsrechten voor deze map: %1 Traverso - Information Traverso - Informatie Created new Project directory for you here: %1 De volgende Project map werd aangemaakt: %1 Open Project Project openen Selected Project Selecteer Project Load Laden Delete Verwijderen Select Project Dir Selecteer Project map <p>Project directory name <b>%1</b> is different from the Project title <b>%2</b>!</p><p>Did you rename the Project directory ? </p><p>Please rename the directory back to the Project title <b>%1</b>, and change the Project title with the Project Manager Dialog!</p> <p>Project map naam <b>%1</b> is niet gelijk aan Project titel <b>%2</b>!</p><p>Heeft u de Project map een andere naam gegeven?</p><p>Wilt u a.u.b. de map hernoemen naar <b>%1</b>, u kunt de Project titel veranderen met het Project Beheer Dialoog!</p> Project %1 does not exist, did you rename or remove the directory what that name ? Project %1 bestaat niet, heeft u de map met deze naam hernoemt of verwijderd ? Please check permission for this directory or choose another one: %1 Controleert u alstublieft de rechten voor deze map of kies een andere: %1 This directory is not writable by you! In deze map kunt u geen wijzigingen aanbrengen (Geen schrijfrechten)! PADriver PADriver:: PortAudio error: %1 PADriver:: fout in PortAudio: %1 PADriver:: hostapi %1 was not found by Portaudio! PADriver:: Portaudio kon hostapi %1 niet vinden! PaDriverPage Form Form Portaudio drivers <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">PortAudio Driver:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The driver which should drive the PortAudio backend</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">PortAudio supports many driver backends, some of which Traverso has native support for too. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It is recommended to use Traverso's native drivers instead of using PortAudio's, however, if the native drivers give problems, you might try the ones supplied by PortAudio instead!</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">PortAudio provides transparent driver support for multiple platforms, including Windows (see the wmme, direct x and asio options), and Mac OS X (see the CoreAudio and jack options)</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">PortAudio Driver:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">De driver voor de PortAudio backend</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">PortAudio ondersteund verschillende driver backends. Voor sommige hiervan heeft Traverso ook rechtstreekse ondersteuning. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">In die gevallen is het aan te raden om voor Traverso's rechtstreekse drivers te kiezen, en niet deze van PortAudio. Soms, als de rechtstreekse drivers problemen geven, is het het proberen waard, om PortAudio samen met de onrechtstreekse drivers te proberen!</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">PortAudio zorgt voor transparente driverondersteuning voor verschillende platforumen, onder andere Windows (met de wmme, direct x en asio opties), en Mac OS X (met de CoreAudio en jack opties)</p></body></html> Driver Driver PerformanceConfigPage Form Form Painting Grafisch renderen <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The number of times per second at which the Graphical</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Items are repainted during a jog action, like moving an</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">AudioClip, or changing the Gain.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The default frames per second of 35 is a perfect compromise </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">between smooth painting, and low cpu usage.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">However, if you find the painting to be not smooth enough,</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">change this value to a higher one, but keep in mind that it</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">will consume considerably more cpu!</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If for example moving an AudioClip still takes to much cpu,</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">you should consider to lower this value.</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Het aantal maal per seconde dat Traverso de grafische elementen op uw scherm</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">hertekend, tijdens een drag &amp; drop actie, zoals het verplaatsen van een audioclip,</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">of het veranderen van de gain.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">De standaardwaarde van 35 maal per seconde is een goed compromis </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">tussen vloeiend beeld, en laag processorgebruik.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Als u het renderen niet vloeiend genoeg vindt,</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">kunt u deze waarde verhogen. Dit vergt echter een stuk meer van uw processor</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Indien het verplaatsen van een AudioClip nog teveel processoractiviteit veroorzaakt,</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">is het aangeraden om deze waarde wat te verlagen.</p></body></html> Jog repaint speed (fps) Jog verversings snelheid (fps) <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Accelerates the painting of AudioClips and Tracks by using</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">the 3D engine of your graphics card.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Depending on your graphics card and driver support, this </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">can speed up painting considerably!</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Versnelt het renderen van AudioClips en Tracks door gebruik te maken van</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">de 3D engine van uw grafische kaart.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Afhankelijk van uw type grafische kaart, en de driver support, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">kan dit het renderen duidelijk versnellen!</p></body></html> Use hardware acceleration Gebruik hardware acceleratie Audio file buffering Bufferen van Audio bestand <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Read buffer size:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The amount of audio data that can be stored in the </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">read buffers in seconds.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The default value of 1 second should do just fine.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">However, if you're tight on memory, you can make this value lower.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If you experience buffer underruns when the hard disk bandwidth is </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(almost) saturated, or when buffer underruns happen regularly due </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">the hard disk can't keep up for some reason, you can try a larger </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">value, like 1.5 or 2.0 seconds.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Keep in mind that when using a larger buffer, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">it will take considerably more time to move (i.e. seeking) </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">the playhead to another positions, since all the buffers </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(one for each audioclip * channel count) need to be refilled!</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Read buffer size:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">De hoeveelheid audio data die in de leesbuffers opgeslagen kan worden (sec).</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">De standaardwaarde van 1 seconde is een goede keuze.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Als uw computer over weinig geheugen beschikt, kunt u deze waarde verlagen.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Als u buffer-underruns ervaart, bijvoorbeeld wanneer de harde schijf (bijna) verzadigd is, </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">of wanneer u vaak buffer-underruns hebt, kunt u de waarde verhogen. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Waarden zoals 1.5 of 2.0 seconden zijn dan goede keuzes. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Het nadeel van grotere buffers, is dat het verplaatsen van de playhead naar andere posities </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">veel langer zal duren, daar alle buffers (één voor iedere audioclip * het aantal kanalen)</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> eerst volledig opnieuw gevuld moeten worden!</p></body></html> Read buffer size (seconds) Lees buffer grootte info icon Informatie icoon Changing the buffer size only will take into effect after (re)loading a project. Het veranderen van de buffer grootte wordt pas doorgevoerd na het opnieuw laden van het project. PluginSelectorDialog OK OK Cancel Annuleer Plugin Selector Plugin Selecteerder Add Plugin too Voeg Plugin toe aan Plugin Name Plugin Naam Type Type In/Out In/Out ProgressToolBar Importing file %1 of %2: %p% Progress Toolbar Voortgangs Indicator Project Cannot create dir %1 Kan map %1 niet maken Created new Project %1 Project %1 aangemaakt Project File Version does not match, unable to load Project! Project Bestand Versie ongelijk, kan Project niet laden! Project %1 loaded Project %1 geladen Project %1 saved Project %1 opgeslagen Sheet %1 added Sheet %1 toegevoegd Sheet '%1' doesn't exist! Sheet '%1' bestaat niet! Remove Sheet %1 Verwijder Sheet %1 Detected clipping in exported audio! (%1) Te luid signaal gedecteerd in gexporteerde audio! (%1) calculated norm factor: %1 Normalisatie factor is: %1 Traverso - Information Traverso - Informatie You're still recording, please stop recording first to be able to exit the application! U bent aan het opnemen! U dient opnemen eerst te beëindingen om af te kunnen sluiten! Export already in progress, cannot start it twice! Het export proces is reeds gestart, U kunt dit geen tweede maal starten! Project with title '%1' allready exists, not setting new title! Een project met titel '%1' bestaat reeds, titel niet aangepast! Project directory %1 no longer exists, did you rename it? Shame on you! Please undo that, and come back later to rename your Project... Projectmap %1 bestaat niet meer, hebt u deze verplaatst? Om het project een nieuwe naam te geven dient U dit eerst ongedaan te maken, daarna kunt U deze wijziging doorvoeren... Project title changed, Project will to be reloaded to ensure proper operation Project titel aangepast. Het project wordt herladen... Project %1: Cannot open project.tpf file! (Reason: %2) Project %1: project.tpf bestand kan niet worden geopend! (Reden: %2) Project %1: Failed to parse project.tpf file! (Reason: %2) Project %1: Interpreteren van bestand project.tpf is mislukt! (Reden: %2) Couldn't open Project properties file for writing! (File %1. Reason: %2) Project gegevensbestand kon niet met schrijfrechten worden geopend! (Bestand: %1, Reden: %2) Unable to create export directory! Please check permissions for this directory: %1 Kan export directory niet aanmaken! Controleer a.u.b. de permissies voor directory: %1 ProjectConverter Project file with version %1 cannot be converted, only files with version 2 can! Project bestand met versie %1 kan niet worden omgezet, alleen mogelijk met versie 2 bestanden! Project %1: Failed to parse project.tpf file! (Reason: %2) Project %1: Interpreteren van bestand project.tpf is mislukt! (Reden: %2) Starting to convert Project from version 2 to version 3 Start met omzetten Project van versie 2 naar versie 3 Converting project.tpf file..... Done! Converteren project.tpf bestand..... Klaar! <b>Need to convert %1 files</b> <b>%1 bestanden moeten omgezet worden</b> Couldn't open Project properties file for writing! (File %1. Reason: %2) Project gegevensbestand kon niet met schrijfrechten worden geopend! (Bestand: %1, Reden: %2) Project %1 converted Project %1 omgezet Saving converted project.tpf file.... Done! Opslaan omgezette project.tpf bestand.... Klaar! Conversion finished succesfully Omzetting met succes afgerond No conversion description available! Omschrijving voor omzetting niet beschikbaar! Conversion stopped on user request, you can continue to use this Project with Traverso <= 0.41.0, or reopen it with this version of Traverso and start the conversion again Omzetting stopgezet op verzoek van de gebruiker. U kunt het Project blijven gebruiken met Traverso <= 0.41.0, of het opnieuw openen met deze versie van Traverso om de omzetting opnieuw te starten ProjectConverterDialog Project Converter Project Omzetter Project XXX (no translation needed) Conversion information Omzet informatie Conversion progress Omzet voortgang Start conversion Start omzetting Stop conversion Stop omzetting Load Project Laad Project Close Sluiten ProjectInfoWidget Project Information Widget Project informatie venster Bitdepth Bit diepte - Rate Sample-rate Project Project Songs ProjectManager Save Project Project opslaan Do you want to save the Project before quiting? Wilt u voor het afsluiten het Project eerst nog opslaan? Project %1 already exists! Project %1 bestaat al! Unable to create new Project %1 Kan Project %1 niet aanmaken Unable to load Project %1 Kan Project %1 niet laden No Project to save, open or create a Project first! Er is geen Project om op te slaan! Using existing Project directory: %1 Maakt gebruik van bestaande Project map: %1 Traverso - Warning Traverso - Waarschuwing Unable to create Project directory! Kon Project map niet aanmaken! Please check permission for this directory: %1 Controleer toegangsrechten voor deze map: %1 Created new Project directory for you here: %1 De volgende Project map werd aangemaakt: %1 Default Project created by Traverso Standaard Project aangemaakt door Traverso Project %1 no longer could be found! (Did you remove or rename the Project directory ?) Project %1 kon niet gevonden worden! (Heeft u de Project map verwijderd of een andere naam gegeven ?) Could not rename Project directory to %1 Kan Project map niet hernoemen naar %1 This directory is not writable by you! In deze map kunt u geen wijzigingen aanbrengen (Geen schrijfrechten)! Please check permission for this directory or choose another one: %1 Controleert u alstublieft de rechten voor deze map of kies een andere:%1 Projectfile backup: The project file %1 could not be opened for reading (Reason: %2) Project bestand backup: Het Project bestand %1 kon niet voor lezen worden geopend (Reden: %2) Cannot create dir %1 Kan map %1 niet maken Choose a directory to store your Projects in Kies een map om uw Projecten in op te slaan No directory was selected, to retry open the 'Open Project Dialog' and click 'Select Project Directory' button ProjectManagerDialog No new Sheet name was supplied! Geen nieuwe Werkblad naam opgegeven! Save Template Sjabloon opslaan Enter Template name Geef Sjabloon naam Unable to create directory %1! Kan map %1 niet aanmaken! Traverso - Information Traverso - Informatie Saved Project Template: %1 Project Sjabloon %1 opgeslagen Couldn't open file %1 for writing! Kan niet naar bestand %1 schrijven ! Dialog Dialoog Project Project Informational Informatief Title Titel Description Beschrijving Engineer Engineer Export Exporteer Sheet(s) Sheet(s) Template Sjabloon Sheets Sheets Selected Sheet Geselecteerde Sheet Delete Verwijderen Rename Hernoemen New Sheet Nieuw Sheet Create new Sheet Nieuw Sheet aanmaken <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Undo last change</p></body></html> Ongedaan maken <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Redo last change</p></body></html> Opnieuw uitvoeren undotext Undotekst redotext redoteks Sheet Name Sheet naam Tracks Tracks Length Lengte CD Text CD Tekst Performer Uitvoerder Disc ID: Schijf ID: UPC EAN: UPC EAN: Genre: Genre: Unused Ongebruikt Undefined Niet opgegeven Adult Contemporary Alternative Rock Childrens Classical Contemporary Christian Country Dance Easy Listening Erotic Folk Gospel Hip Hop Jazz Latin Musical New Age Opera Operette Pop Music Rap Reggae Rock Music Rhythm and Blues Sound Effects Spoken Word World Music Arranger Arrangement door Message Bericht Template with name %1 already exists! Do you want to overwrite it? Sjabloon met naam %1 bestaat al! Wilt u het overschrijven? Project with title '%1' allready exists, please supply a different title! Project met titel '%1' bestaat al, wilt u a.u.b. een andere titel opgeven! Songwriter Lied schrijver QObject No error occurred Er was geen fout An error occurred when reading from the file. Er vond een fout plaats tijdens het lezen van het bestand. An error occurred when writing to the file. Een fout vond plaats tijdens het schrijven van het bestand. A fatal error occurred. Een fatale fout vond plaats. The file could not be opened. Het bestand kon niet worden geopend. Resourc error The operation was aborted. De bewerking is afgebroken. A timeout occurred. Tijdsoverschrijding plaatsgevonden. An unspecified error occurred. Een niet nader omschreven fout is opgetreden. The file could not be removed. Het bestand kon niet worden verwijderd. The file could not be renamed. Het bestand kon geen andere naam worden gegeven. The position in the file could not be changed. De positie in het bestand kon niet worden veranderd. The file could not be resized. Grootte van het bestand kon niet worden veranderd. The file could not be accessed. Geen toegang tot het bestand. The file could not be copied. Bestand kon niet worden gedupliceerd. Unknown error Onbekende fout AudioClip Curve CurveNode FadeCurve Marker Sheet Werkblad TimeLine Tijdlijn Track Track QuickStartDialog Traverso: Getting Started Traverso: Om te beginnen <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"><span style=" font-size:18pt; font-weight:600;">Traverso: Getting Started</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">When you record or import an audio file into Traverso, it shows up as an Audio Clip in one of the horizontal Tracks in the current Sheet. You can edit many aspects of these Clips by placing the mouse pointer over a Clip and pressing or holding different keys on your keyboard and mouse. You can also change settings of a Track, the Sheet as a whole, and other objects in the Sheet.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">To see a list of what commands are available for any given object in the Sheet, move the mouse over that object, and Right-Click (or press Q). The keyboard shortcuts for each command are shown in the menu. The notation used is shown below.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; K &gt; </span> means press and release the K key. (Like a click.)</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"><span style=" font-weight:600;">&lt;&lt; K &gt;&gt;</span> means press the K key two times fast. (Like a double click.)</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ K ]</span> means drag the mouse while holding down the K key.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; KL &gt; </span> means press the K and L keys at the same time.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ KL ] </span> means drag the mouse while holding down the K and L keys at the same time.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">Here are some basic commands:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; SPACE &gt;</span> is Play/Stop.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; SHIFT &gt;</span> sets the Playhead. (Blue vertical line where playing starts.)</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; W &gt;</span> sets the Work Cursor. (Red vertical line.)</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; V &gt; </span> moves the Playhead back to the Work Cursor.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ D ] </span> move objects around (Audio Clip, Curve Nodes, etc)</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ Z ]</span> zooms in and out.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ TAB ]</span> scroll omnidirectional (aka Shuttle) </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">And some Audio Clip Commands:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ E ] </span> drags a Clip's left or right edge.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ F ]</span> adjusts the length of a Clip's Fade In / Fade Out.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ G ] </span>addust the Gain of a clip (also works on Tracks, Sheet)</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; X &gt;</span> splits the Clip at the cursor's position.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">For more information, right-click on everything, or check out the Traverso manual.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p></body></html> ReadSource Silence Stilte Could not open file Het bestand kon niet worden geopend. Invalid channel count Ongeldig aantal kanalen File has zero channels Bestand heeft 0 kanalen The file does not exist! Het bestand bestaat niet! No ReadSource error set RecordingConfigPage Form Recording Opnemen <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">WAV</span> : A format without compression. Uses more hard disk space then compressed encoding formats, but needs very little cpu.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Limits : ~ 1.7 hours of recording time @ Stereo - 44.1 KHz</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">WavPack</span> : A format with compression, up to 2 times smaller compared to WAV, and no quality loss. Uses significantly more cpu then WAV, but with modern (year 2005 and above) cpu's this shouldn't be a problem.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Using this format stresses the hard disk much less, increasing hard disk live, and less chance of saturating the hard disk bandwidth.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Limits : ~ 5 hours recording time @ Stereo - 44.1 KHz</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">WAV64</span> : WAV format with 64 bit header, support by other programs is currently limited.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Limits : None, thousands of hours of recording time, supposed that your hard disk can hold it.</p></body></html> Encoding format Encoding formaat WavPack options WavPack opties Compression type Compressie type <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This option reduces the storage of some floating-point data files by up to about 10% by eliminating some information that has virtually no effect on the audio data. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">While this does technically make the compression lossy, it retains all the advantages of floating point data (&gt;600 dB of dynamic range, no clipping, and 25 bits of resolution). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This also affects large integer compression by limiting the resolution to 24 bits.</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Deze optie reduceert de grote van het bestand bij sommige floating-point geluids-data tot wel 10%. Het heeft vrijwel geen effect op de kwaliteit van het geluid.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Technisch gesproken is de compressie niet langer lossless, maar behoud het wel al de voordelen van floating point audio (&gt;600 dB dynamisch bereik, geen clipping en 25 bit resolutie). </p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Het heeft ook effect bij comprimeren van 32 bit integer audio data door te comprimeren naar 24 bit resolutie.</p></body></html> Skip WVX for extra compression (semi-lossless) Sla WVX over voor extra compressie (semi-lossless) Resampling On the fly resample quality Afspeel resample kwaliteit Default export resample quality Standaard exporteer resample kwaliteit Best Beste High Hoog Medium Normaal Fast Snel Enable on the fly resampling (Playback only) Activeer afspeel resampling ResourcesManager ResourcesManager:: Failed to initialize ReadSource %1 (Reason: %2) Bronnenbeheerder:: Kon Bron %1 niet initializeren (Reden: %2) ResourcesManager: Received request to remove Audio Source %1but it is still in use by %2 AudioClips!!. NOT removing it! Bronnenbeheerder: ontving aanvraag om Audio Bron %1 te verwijderen, maar het is nog steeds in gebruik door %2 AudioClips!! Aanvraag geweigerd! ResourcesWidget Form Form Sources Bronnen Files Bestanden Name Naam Length Lengte Start Start End Einde RestoreProjectBackupDialog Restore from backup Herstel vanaf een backup Set the date to restore the selected backup. Selecteer de datum van de te herstellen backup. Current date and time: Huidige datum en tijd: Last backup: Laatste backup: - - Date Datum Time Tijd SettingsDialog Behavior Algemeen Appearance Uiterlijk Keyboard Toetsenbord Performance Prestaties Audio Options Audio Opties Sound System Geluids Systeem Preferences - Traverso Voorkeuren - Traverso Sheet Hard Disk overload detected! Overbelasting van de harde schijf gedetecteerd! Failed to fill ReadBuffer in time Kon ReadBuffer niet op tijd vullen Failed to empty WriteBuffer in time Kon WriteBuffer niet op tijd leggen Add Track Track toevoegen Remove Track Track verwijderen Untitled No artists name set Geen artiest naam opgegeven Recording to %n Clip(s) Opnemen naar %n Clip Opnemen naar %n Clips Export start frame starts beyond export end frame!! Het begin frame voor exporteren ligt nà het eind frame! Export tries to render to 0 channels wav file?? Probeert te exporteren naar een wav-bestand met 0 kanalen?? No audio to export! (Is everything muted?) Geen audio te exporteren! (Is alles gemuted?) No Tracks armed for recording! Geen Tracks geactiveerd voor opname! SongInfoWidget SongInfoWidget Song Lied - - Snap Gain Gain SMPTE Zoom SpectralMeterConfigWidget Frequency Range Frequencie Bereik Show average spectrum Gemiddelde spectrum weergeven Number of bands: Aantal banden: Lower dB value: Lage dB waarde: Upper dB value: Hoge dB waarde: Hz Hz Lower Limit: Lage Limiet: Upper Limit: Hoge Limiet: Advanced FFT Options Geavanceerde FFT Opties FFT Size: FFT Groote: 256 256 512 512 1024 1024 2048 2048 4096 4096 8192 8192 Rectangle Rechthoek Hanning Hanning Hamming Blackman Windowing function: Windowing functie: Advanced Geavanceerd Apply Toepassen &Close &Afsluiten FFT-Spectrum Configuration FFT-Spectrum Configuratie SpectralMeterView Screen Capture file name Scherm afdruk bestand naam FFT: Unable to write captured image to hard disk FFT: Kon schermafdruk niet opslaan op hard schijf FFT: No avarage curve used, not data to export! FFT: Gemiddelde Curve niet in gebruik, er is geen data om te exporteren! FFT: Enable avarage curve with < M > to generate data FFT: Met < M > kunt gemiddelde curve activeren om data te genereren FFT: No avarage data to export! FFT: Geen gemiddele waarden om te exporteren! Select output format Selecteer uitvoer formaat Output format: Uitvoer formaat: Export average dB curve Exporteer gemiddelde dB curve SplitClip Split Clip Clip knippen SysInfoToolBar System Information Systeem Informatie SystemInfoWidget SystemInfoWidget Systeem informatie venster Card Name (na) Kaart Naam (na) image Afbeelding buffer size (na) Buffer groote rate rate - GB - GB drivertype (na) driver type (na) xruns (na) latency (na) - % bitdepth SystemResources Read Buffer Status Lees Buffer Status Write Buffer Status Schrijf Buffer Status TimeLine Add Marker Marker toevoegen Remove Marker Marker verwijderen TimeLineView End Einde Add Marker Marker toevoegen Drag Marker Marker verplaatsen Clear Markers Markers verwijderen You have to remove all other markers first. U moet eerst alle andere Markeerders verwijderen. Track Silence Others Anderen muten Remove Clip Verwijder Clip Add Clip Clip toevoegen Track: AudioClip with id %1 not found in Resources database! Track: AudioClip met id %1 niet gevonden in Resources database! TrackPan Track Pan: %1 Track Pan: %1 Track Pan Track Pan TrackView Set Track name Verander Track naam Enter new Track name Geef de nieuwe Track naam Track %1: %2 Track %1: %2 TransportConsoleWidget Skip to Start Spring naar Start Previous Snap Position Vorige snap positie Record Opnemen Play / Stop Start / Stop Next Snap Position Volgende snap positie Skip to End Spring naar einde Recording to %1 Tracks, encoding format: %2 Opnemen naar %1 Tracks, encoding formaat: %2 TraversoCommands Gain Gain Gain: Reset Gain: Herstellen Panorama Panorama: Reset Panorama:: Herstellen Import Audio Importeer Audio Insert Silence Stilte invoegen Copy Clip Clip kopieren New Track Nieuwe Track Remove Clip Verwijder Clip Remove Track Track verwijderen External Processing Externe bewerking Move Clip Clip verplaatsen Drag Edge Rand verplaatsen Move Or Resize Clip Clip: Verplaatsen of grootte wijzigen Split Knippen Arm Tracks Fold Sheet Fold Track Vertical In Vertikaal In Horizontal Out Horizontaal Uit Horizontal In Horizontaal In Vertical Out Vertikaal Uit Omnidirectional Alle kanten Horizontal Horizontaal Vertical Vertikaal Right Rechts Left Links Up Naar boven Down Naar beneden (De)Select All Alles (De)Selecteren Fold Markers Fold Markers (De)Select Magnetic Cut traverso-0.49.4/resources/translations/traverso_es.qm000644 001750 001750 00000630317 11430303020 023401 0ustar00remonremon000000 000000 ;aF0aaDp7Dg%`I! dG8888Y /}gŨtɬ$FڛyYXq';q4o-q3} k>A>f$~$8u$.Q+T ^d#QG'1z/a5_bye͡jwDN!֓fj,}?I_*_z $r7NdƤ!V-z:)66, . .Y0El0{k[ _CxfX*qwv ez'zNy‚/ecOx9 (R6ŒM<k}*lkȺ[P.t.n.Q[[dl:a|t>v^>`ڑ~U1 .z a_+5*h^6Z9OyB JocLoMC~gmT}dS \ϥϥʗ$]U*O˿ gϸHк故eJ497^ }>qC% b(5:8:G8I 8II(^T/Dl"yv:\ xn1EO AlIIɡIy1uk^o,u~, IϕGWnWW G41<?" iT|G%{j"b,%9vˠv"րu!X#/OdFO!E_2榼#lإGfE FnV4U1n uW"$)y'~*Yc-,No,N$,N484;;};= = =}FCH SYaU-i^pk2{NsR@ u)%@H5)RhL 2.I0,qȕpHЎ_t z#.5ifGɴ0\N:s֪2Y!"`tja ; P eC~bA^6=B~wm( *K3\*0/=/A1k?PDAZZ:[;\uRe]=_]=_Q`_QOajb#hjlDs^{]H%k_ adUJ{J.]?ݐ%}&)ĘnoaJE1?ZRgoM /p   JAuJJNq\A _:__:a~kmSnPQDr[rlCY<N3^Za/U%f  U 2 '  hd Ro6a`_K`Œ!rĠWmeԍխeZ0' 9* ld ded"u"H#m9ϕVCiC~HD!KrInKCv6NbPh?P|Q-VQmz.sNLy[2K9?\|Û1}2İmcyi'(M#WroJ  m ? 1+/ b 0 D.mF Mgc Mg Y% [[ [` ]W ^Q ge h> IBL .X 1 19  xu 3 e4] Eg En  몠V \v \  W  2 9.6 !] & I 'n *LJ =aw AX Cb LZ~8 dpT h? h?Ρ h lPB l[^ l: rD+. IY 4  l 0 P ʿ n vZ! Om ف F W u9 3  {q [ #(S %$ 0Km& 7 Fd GIw L. Q6^V ] h).8 z= YPsH YP# FZ Kp B  is } t0 M ɂeQU Ӱc f | 1 ܄~ ޤS >K  9K k} do f  H I | ( * >3 ,Jd` ,g` ,g` ,g` 1 "? 25%M 3a 6k 7I ;!{t >:( G--= N0Y Q3'n SAL ^ _, b b bڅ+ iuP t``` t`C ztn ~7K ~7' ~7d  s ! sgP T Ã) _!* x] [T  4 )3  se ڞ|x ڞe ڞ. ػI ߆  dd ] yƇ G- 1} ^\M  F5 !/qp 3Gy 3Gy 3l 3np 4K7 5Jn# 7vztn 7vzO 8Fq% 8y:d =O Q\c* RZ Zy _e ` eV<[ jn nP] ql= .7 s Xyz } 5X  g C r тj ͤ _ u_.7%_ IcsorpYl(̖/MY=zGAU5c.g&s(p%Ǣp<hpq/jyy%tgzPS|lw|l @PCPoPߌgrNT>Gj+r 2C}uڱĄ9^,T!O #  %"e(}jC-J.6|2nub=@vGxrKU bfggft1y1G|>*PX]h]lb"|q.(7UI® iK#-^ߠjS~i.Borrar Clip Remove Clip AddRemoveClip4Borrar Clips SeleccionadosRemove Selected Clips AddRemoveClip22AlsaDevicesPage33AlsaDevicesPage<html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Dispositivo:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">El dispositivo ALSA a usar (real o virtual).</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Un dispositivo real es la tarjeta de audio del ordenador.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Dispositivos virtuales son los creados en el archivo .asoundrc, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">que suele estar en la carpeta /home del usuario.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Si duda, puede usar el dispositivo por defecto. Se usar el dispositivo </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">configurado por su distribucin, o el que corresponde a su tarjeta de audio.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">En el ltimo caso, asegrese de que ningn otro programa usa la tarjeta, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">si no, el driver no podr iniciarse!</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Para ms informacin vea 4.1: "Soporte de Drivers" en el Manual de Usuario.</p></body></html> [

Device:

The real or virtual ALSA device to be used.

A real device is the audiocard installed in your system.

A virtual device is one created in the .asoundrc file,

often located in your home folder.

If unsure, use either the default device, this will use the audiodevice

configured by your distribution, or the device that names your audio card.

In the latter case, please make sure no application uses the audiocard,

else the driver won't be able to initialize!

For more info see chapter 3.1: "The Driver Backend" of the User Manual

AlsaDevicesPage<html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Nmero de Periodos:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">El audio se procesa en trozos pequeos, llamados periodos. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Este valor determina cuntos de stos trozos van a ser</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">usados por el controlador de la tarjeta de audio.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">El valor por defecto debiera ser adecuado, y proporciona una latencia ptima.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Sin embargo algunos drivers de Alsa tienen errores y no funcionan bien </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">con este valor ( 2). Si el sonido se oye entrecortado, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">puede probar el valor de 3 periodos.</p></body></html>

Number of Periods:

Audio is managed in small chunks called periods.

This value determines how many of these chunks are

to be used by the driver of the audiocard.

The default should work just fine, and gives optimal latency behavior.

However, some (buggy) alsa drivers don't work correctly

with the default of 2, if you experience very choppy audio,

please try to use 3 periods.

AlsaDevicesPage l<html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">El "dither" se usa para obtener un audio ms limpio. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">La mejor manera de describirlo es pensar en una imagen hecha con muchos puntos. Si se mira muy de cerca, se puede ver cada punto y la imagen no es clara. Mirada desde lejos se v ms clara porque los ojos y el cerebro difuminan ("dither") los puntos suavizando la imagen. No est claro, y es una cuestin de preferencia personal, si usar dither es lo mejor, pero a la mayora les parece mgico. Quien trabaje a 16bit y est preocupado por la calidad, o le sobre velocidad de la CPU, debiera probar con dither. El "triangular" es probablemente la opcin ms equilibrada entre calidad y carga de la CPU, pero el "conformado" es el mejor.</p></body></html>

Dither is used to make the audio cleaner.

The best way to describe it is to imagine a painting with many dots. If you view it up close you can see each dot and the image is not very clear. If you view it from far away the image becomes clearer because your eyes/brain dither the dots to smooth out the image. It is a murky subject and obviously a very personal choice as to what dither is the best. For most people it is just plain magic. Anyone running at 16bit who cares about quality or has CPU cycles to spare should run with dither. Triangular is probably the best compromise of quality vs cpu cost (its very fast), but shaped is the best

AlsaDevicesPage Dispositivo ALSA ALSA DeviceAlsaDevicesPageDispositivoDeviceAlsaDevicesPage DitherDitherAlsaDevicesPageFormularioFormAlsaDevicesPageNingunoNoneAlsaDevicesPageN. de periodosNr. of periodsAlsaDevicesPageRectangular RectangularAlsaDevicesPageConformadoShapedAlsaDevicesPageTriangular TriangularAlsaDevicesPageDriver ALSA: No se puede abrir el dispositivo PCM %1 para reproduccin. Habilitando modo de slo grabacinVALSA Driver: Cannot open PCM device %1 for playback. Falling back to capture-only mode AlsaDriverDriver ALSA: El dispositivo de grabacin %1 est en uso. Detenga la aplicacin que lo est usando y reinicie TraversoqALSA Driver: The capture device %1 is already in use. Please stop the application using it and run Traverso again AlsaDriverDriver ALSA: El dispositivo de reproduccin %1 est en uso. Detenga la aplicacin que lo est usando y reinicie TraversorALSA Driver: The playback device %1 is already in use. Please stop the application using it and run Traverso again AlsaDriverDriver ALSA: No se puede configurar el hardware. Lo est usando otra aplicacin?OALSA Driver: Unable to configure hardware, is it in use by another application? AlsaDriverDriver ALSA: Usted no tiene permiso para abrir el dispositivo de audio %1 para grabacinOALSA Driver: You do not have permission to open the audio device %1 for capture AlsaDriverDriver ALSA: Usted no tiene permiso para abrir el dispositivo de audio %1 para reproduccinPALSA Driver: You do not have permission to open the audio device %1 for playback AlsaDriverDriver ALSA: snd_pcm_open(capture_handle, ...) ha fallado con un error desconocidoMALSA Driver: snd_pcm_open(capture_handle, ...) failed with unknown error type AlsaDriverDriver ALSA: No se puede abrir el dispositivo PCM %1 para grabacin. Habilitando modo de slo reproduccinOALSA: Cannot open PCM device %1 for capture. Falling back to playback-only mode AlsaDriversnd_pcm_open(playback_handle, ..) ha fallado con un tipo de error desconocido@snd_pcm_open(playback_handle, ..) failed with unknown error type AlsaDriverj<html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Dibujar la onda con una linea queda ms detallado, pero requiere ms cpu.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Si aprecia que el dibujar muchos clips, o el scroll animado, resultan lentos deshabilite esta opcin!</p></body></html>9

Painting the waveform with an outline is more detailed, but requires more cpu.

If you experience slowness when painting many clips, or during animated scroll, unselect this option!

AppearenceConfigPage,Ajustar color del temaAdjust theme colorAppearenceConfigPage"Temas disponiblesAvailable themesAppearenceConfigPageEstilo de botn Button styleAppearenceConfigPageEl cambio de idioma de la interface tendr efecto al reiniciar Traverso!RChanging the language of the Interface will take effect after restarting Traverso!AppearenceConfigPage$Idioma por defectoDefault LanguageAppearenceConfigPage4Dibujar lneas a 0 y -6 dBDraw lines at 0 and -6 dBAppearenceConfigPageFormularioFormAppearenceConfigPageTamao de icono Icon sizeAppearenceConfigPageSolo iconos Icons onlyAppearenceConfigPage*Idioma de la interfazInterface LanguageAppearenceConfigPage IdiomaLanguageAppearenceConfigPage2Dibujar audio rectificadoPaint audio rectifiedAppearenceConfigPage2Dibujar la onda con lneaPaint audio with outlineAppearenceConfigPage<Dibujar audio stereo como mono Paint stereo audio as mono audioAppearenceConfigPageDUbicacin de los archivos de temasPath to theme filesAppearenceConfigPage@Carpeta por defecto de proyectosSelect default project dirAppearenceConfigPage$Seleccionar estilo Select styleAppearenceConfigPage$Opciones de estilo Style OptionsAppearenceConfigPage4Texto debajo de los iconosText below IconsAppearenceConfigPage0Texto junto a los iconosText beside IconsAppearenceConfigPageSolo texto Text onlyAppearenceConfigPageTemaThemeAppearenceConfigPage"Opciones del tema Theme OptionsAppearenceConfigPage"Selector de temasTheme selectorAppearenceConfigPage,Barras de herramientasToolbarsAppearenceConfigPage8Tamao de la consola clsicaTransport Console sizeAppearenceConfigPageLUsar la paleta del estilo seleccionadoUse selected style's paletteAppearenceConfigPageArmar pistas Arm Tracks ArmTracks0Normalizar clip de audioAudioClip: Normalize AudioClipzEl dispositivo no tiene este Bus de grabacin: %1 (Pista %2)8AudioDevice doesn't have this Capture Bus: %1 (Track %2) AudioClipNormalizacin Normalization AudioClipQuitar fades Remove Fades AudioClip.NIvel de normalizacin:Set Normalization level: AudioClip0Cambiar estado bloqueado Toggle Lock AudioClip&Cambiar estado mudo Toggle Mute AudioClip<No se puede grabar en la pistaUnable to Record to Track AudioClippor &Defecto&DefaultAudioClipEditDialog&Lineal&LinearAudioClipEditDialogInclinacinBendingAudioClipEditDialog&Parametros del clipClip ParametersAudioClipEditDialog$Ventana de dilogoDialogAudioClipEditDialog FinalEndAudioClipEditDialog"Procesado externoExternal ProcessingAudioClipEditDialogFade de entradaFade InAudioClipEditDialogFade de salidaFade OutAudioClipEditDialog FadesFadesAudioClipEditDialogGananciaGainAudioClipEditDialogDuracinLengthAudioClipEditDialogModoModeAudioClipEditDialog NombreNameAudioClipEditDialog OrigenSourceAudioClipEditDialogIntensidadStrengthAudioClipEditDialog"Etiqueta de texto TextLabelAudioClipEditDialog"Comienzo de pista Track startAudioClipEditDialoghh:mm:ss.sss hh:mm:ss.sssAudioClipEditDialog.Clip: procesado externoClip: External ProcessingAudioClipExternalProcessing,Seleccin: aadir clipSelection: Add ClipAudioClipManager&Seleccin: invertirSelection: InvertAudioClipManager,Seleccin: quitar clipSelection: Remove ClipAudioClipManagerpTodos los archivos (*);;Archivos de audio (*.wav *.flac))All files (*);;Audio files (*.wav *.flac) AudioClipViewRClik para restaurar el archivo de audio !Click to reset AudioFile ! AudioClipView@No se seleccion ningn archivo!No file selected! AudioClipViewRRestaurar el archivo de audio del Clip %1Reset Audio File for Clip: %1 AudioClipViewbArchivo de AudioClip asignado correctamente a %1$Succesfully set AudioClip file to %1 AudioClipViewDispositivo de audio:: Detectada 'tormenta' de underruns en el buffer. Pasando al driver NullHAudioDevice:: Buffer underrun 'Storm' detected, switching to Null Driver AudioDeviceDispositivo de audio:: Para resolver este problema, consulte el Captulo 11 del Manual de Usuario!\AudioDevice:: For trouble shooting this problem, please see Chapter 11 from the user manual! AudioDevicepDispositivo de Audio: Fall al crear el driver para ALSA-Audiodevice: Failed to create the ALSA Driver AudioDevicezDispositivo de Audio: Fall al crear el driver para CoreAudio2Audiodevice: Failed to create the CoreAudio Driver AudioDevicepDispositivo de Audio: Fall al crear el driver para Jack-Audiodevice: Failed to create the Jack Driver AudioDevicezDispositivo de Audio: Fall al crear el driver para PortAudio2Audiodevice: Failed to create the PortAudio Driver AudioDevice|Dispositivo de Audio: Fall al crear el driver para PulseAudio3Audiodevice: Failed to create the PulseAudio Driver AudioDeviceJNo hay ningn dispositivo configuradoNo Device Configured AudioDevice8No hay ningn Driver cargadoNo Driver Loaded AudioDeviceDEl servidor Jack ha sido detenido!"The Jack server has been shutdown! AudioDevice No se puede asignar prioridad de tiempo real al canal del dispositivo de audio ! Esto puede ocasionar que la reproduccin/grabacin no sea fiable, y muchos "underruns" (pequeas interrupciones del sonido. En el peor caso, el programa puede incluso dejar de funcionar ! Por favor, asegrese de que ejecuta este programa con privilegios de tiempo real !Unable to set Audiodevice Thread to realtime priority!!!This most likely results in unreliable playback/capture and lots of buffer underruns (== sound drops).In the worst case the program can even malfunction!Please make sure you run this program with realtime privileges!!!AudioDeviceThread 2205022050AudioDriverConfigPage 3200032000AudioDriverConfigPage 4410044100AudioDriverConfigPage 4800048000AudioDriverConfigPage 8820088200AudioDriverConfigPage 9600096000AudioDriverConfigPage<html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Latencia de buffer:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">La latencia introducida por el tamao del buffer de audio.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">En algunas ocasiones se necesitan latencias bajas. Si no es su caso </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">o no sabe lo que sto significa, es mejor que deje el valor por defecto!</p></body></html>`

Buffer latency:

The latency introduced by the size of the audio buffers.

Some people need low latencies, if you don't need it,

or don't know what it means, please leave the default setting!

AudioDriverConfigPagef<html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Modo Duplex:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Define si deben ser usados tanto el bus de grabacin</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">como el de reproduccin de la tarjeta de sonido, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">o solamente el bus de grabacin o de reproduccin.</p></body></html>

Duplex mode:

Defines if both the Playback and Capture buses

of your soundcard are to be used,

or only the Playback or Capture bus(es).

AudioDriverConfigPage<html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Frecuencia de Muestreo:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">La frecuencia de muestreo usada por la tarjeta de audio.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Los proyectos nuevos usarn esta frecuencia como</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">frecuencia de muestreo inicial del proyecto.</p></body></html>'

Sample rate:

The sample rate used by the audio card.

New projects will use this samplerate as

the project's sample rate on creation.

AudioDriverConfigPage.Latencia de buffer (ms)Buffer latency (ms)AudioDriverConfigPageGrabacinCaptureAudioDriverConfigPage"Configurar DriverConfigure driverAudioDriverConfigPage&Seleccin de DriverDriver SelectionAudioDriverConfigPageDriver:Driver:AudioDriverConfigPageModo duplex Duplex modeAudioDriverConfigPage>Habilitar el control desde JackEnable Jack transport controlAudioDriverConfigPageFormularioFormAudioDriverConfigPageCompletoFullAudioDriverConfigPageJackJackAudioDriverConfigPageReproduccinPlaybackAudioDriverConfigPage&Reiniciar el DriverRestart DriverAudioDriverConfigPage,Frecuencia de muestreo Sample rateAudioDriverConfigPage2Por defecto (del sistema)System defaultAudioDriverConfigPage"Orgenes de Audio AudioSourcesAudioSourcesManagerWidgetFormularioFormAudioSourcesManagerWidget6Eliminar todos los orgenesRemove all sourcesAudioSourcesManagerWidgetEliminar origen Remove sourceAudioSourcesManagerWidget"Eliminar orgenesRemove sourcesAudioSourcesManagerWidget>Eliminar los orgenes no usadosRemove unused sourcesAudioSourcesManagerWidgetr<html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mantener el cursor de reproduccin a la vista al grabar o reproducir</p></body></html>

Keep the play cursor in view while playing or recording.

BehaviorConfigPageAnimadoAnimatedBehaviorConfigPagePreguntarmeAskBehaviorConfigPage2Ajustes del Clip de AudioAudio Clip SettingsBehaviorConfigPageJAjustar el audio mientras se arrastra(Continuously adjust audio while draggingBehaviorConfigPageNo guardar Don't saveBehaviorConfigPageFormularioFormBehaviorConfigPage SaltarJumpBehaviorConfigPageDCargar el ltimo usado al arrancar!Load last used project at startupBehaviorConfigPageNBloquear los clips de audio por defectoLock Audio Clips by defaultBehaviorConfigPage4Ajustes para la nueva hojaNew Sheet SettingsBehaviorConfigPage Nmero de pistasNumber of tracksBehaviorConfigPageAl cerrar: On close:BehaviorConfigPage.Ajustes de reproduccinPlayback SettingsBehaviorConfigPage(Ajustes del ProyectoProject SettingsBehaviorConfigPageGuardarSaveBehaviorConfigPage(Scroll al reproducirScroll playbackBehaviorConfigPage"Mantener centrado Stay CenteredBehaviorConfigPage AmbosBothBusSelectorDialogSelector de Bus Bus SelectorBusSelectorDialog$Buses de grabacin Capture BusesBusSelectorDialogCanalesChannelsBusSelectorDialogIzquierdaLeftBusSelectorDialog*Buses de reproduccinPlayback BusesBusSelectorDialogDerechaRightBusSelectorDialog PistaTrackBusSelectorDialog12x12xCDWritingDialog16x16xCDWritingDialog1x1xCDWritingDialog20x20xCDWritingDialog24x24xCDWritingDialog28x28xCDWritingDialog2x2xCDWritingDialog32x32xCDWritingDialog36x36xCDWritingDialog40x40xCDWritingDialog44x44xCDWritingDialog48x48xCDWritingDialog4x4xCDWritingDialog8x8xCDWritingDialogCancelarAbortCDWritingDialog0Dispositivo de grabacinBurning DeviceCDWritingDialog$Grabacin en el CD CD WritingCDWritingDialog@Calcular y aplicar normalizacin!Calculate and apply normalizationCDWritingDialog CerrarCloseCDWritingDialogvSlo exportar los archivos wav y toc (no escribir en el CD).Export wav and toc files only (don't write CD)CDWritingDialog$Opciones generalesGeneral OptionsCDWritingDialogInformacin InformationCDWritingDialog Nmero de copiasNumber of copiesCDWritingDialogSimularSimulateCDWritingDialogVelocidadSpeedCDWritingDialog&Comenzar a escribir Start WritingCDWritingDialog EstadoStatusCDWritingDialog0Escribir todas las hojasWrite all SheetsCDWritingDialog.Escribir la hoja actualWrite current SheetCDWritingDialogautoautoCDWritingDialogSeleccionarClip Select Clip ClipSelection,Seleccin: Aadir clipSelection: Add Clip ClipSelection,Seleccin: Borrar ClipSelection: Remove Clip ClipSelection8Importar %n archivo de audio:Importar %n archivos de audioImport %n audiofile(s) ClipsViewPort<Clip de Audio: corte magnticoAudioClip: Magnetic CutCrop,Aadir nodo a la curva Add CurveNodeCurve.Quitar nodo de la curvaRemove CurveNodeCurvexYa hay un nodo en esta misma posicin. No se aade uno nuevoFThere is allready a node at this exact position, not adding a new nodeCurveBorrar nodos Clear Nodes CurveViewMover nodo Drag Node CurveViewCancelarCancelDialogDilogoDialogDialogOKOKDialogReloj digital Digital Clock DigitalClockPCambiar ajustes del dispositivo de audioChange Audio Device settings DriverInfo-- ExportDialog(Cancelar exportacin Abort Export ExportDialog CerrarClose ExportDialogExportarExport ExportDialog0Exportar todas las hojasExport all Sheets ExportDialog(Exportar hoja actualExport current Sheet ExportDialog$Carpeta de destinoExport directory ExportDialog4Progreso de la exportacin Export status ExportDialog$Opciones generalesGeneral Options ExportDialog(Comenzar exportacin Start Export ExportDialog <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Esta opcin reduce el almacenamiento de algunos archivos de coma flotante hasta un 10% eliminando cierta informacin que no tiene prcticamente ningn efecto en el audio. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Aunque tcnicamente esto sera "compresin con prdidas", mantiene todas las ventajas de procesar en coma flotante (&gt;600 dB de rango dinmico, sin "clipping" (saturacin), y 25 bits de resolucin).</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Esto tambin afecta a la compresin al usar "enteros grandes", al limitar la resolucin a 24 bits.</p></body></html>B

This option reduces the storage of some floating-point data files by up to about 10% by eliminating some information that has virtually no effect on the audio data.

While this does technically make the compression lossy, it retains all the advantages of floating point data (>600 dB of dynamic range, no clipping, and 25 bits of resolution).

This also affects large integer compression by limiting the resolution to 24 bits.

ExportFormatOptionsWidget*Tasa de bits promedioAverage BitrateExportFormatOptionsWidget MejorBestExportFormatOptionsWidget&Profundidad de bitsBitdepthExportFormatOptionsWidgetTasa de bitsBitrateExportFormatOptionsWidgetCanalesChannelsExportFormatOptionsWidget$Tipo de compresinCompression typeExportFormatOptionsWidget0Calidad de la conversinConversion qualityExportFormatOptionsWidgetCodificacinEncodingExportFormatOptionsWidget,Mtodo de codificacinEncoding MethodExportFormatOptionsWidgetBOpciones de formato para exportarExport Format OptionsExportFormatOptionsWidget RpidaFastExportFormatOptionsWidgetTipo de archivo File TypeExportFormatOptionsWidget&Opciones de formatoFormat OptionsExportFormatOptionsWidgetAltaHighExportFormatOptionsWidgetOpciones de MP3 MP3 OptionsExportFormatOptionsWidget&Tasa de bits mximaMaximum BitrateExportFormatOptionsWidget MediaMediumExportFormatOptionsWidget&Tasa de bits mnimaMinimum BitrateExportFormatOptionsWidget&Normalizar el audioNormalize AudioExportFormatOptionsWidgetOpciones Ogg Ogg OptionsExportFormatOptionsWidget<Calidad (Ms rpida <-> Mejor)Quality (Fastest <-> Best)ExportFormatOptionsWidget0Calidad (Peor <-> Mejor)Quality (Smallest <-> Best)ExportFormatOptionsWidget,Frecuencia de muestreo Sample RateExportFormatOptionsWidgethEludir WVX para mayor compresin (casi sin prdidas).Skip WVX for extra compression (semi-lossless)ExportFormatOptionsWidgetTOpciones WavPack (compresin sin prdidas)&WavPack options (lossless compression)ExportFormatOptionsWidgetVArgumentos disponibles para el programa Sox'Available arguments for the sox programExternalProcessingDialogBEl programa <b>%1</b> ha fallado!Program %1 crashed!ExternalProcessingDialogEl programa <b>%1</b> no est instalado, o tiene privilegios insuficientes para ejecutarlo!DProgram %1 not installed, or insufficient permissions to run!ExternalProcessingDialog Debe proporcionar un argumento antes de lanzar el procesado externo !DYou have to supply an argument before starting the external process!ExternalProcessingDialog8Fade de entrada: inclinacin Fade In: bendFadeBend6Fade de salida: inclinacinFade Out: bendFadeBend$Fades predefinidos Fade Preset FadeCurve,Fade de entrada: formaFade In: shapeFadeMode*Fade de salida: formaFade Out: shapeFadeMode2Fade de entrada: duracinFade In: length FadeRange.Fade de entrada: quitarFade In: remove FadeRange0Fade de salida: duracinFade Out: length FadeRange,Fade de salida: quitarFade Out: remove FadeRange6Fade de entrada: intensidadFade In: strength FadeStrength4Fade de salida: intensidadFade Out: strength FadeStrengthMi Ordenador My Computer FileWidgetMis Documentos My Documents FileWidget"Directorio ArribaParent Directory FileWidget6Refrescar vista de archivosRefresh File View FileWidget,Todos los archivos (*) All files (*)ImportnArchivos de Audio (*.wav *.flac *.ogg *.mp3 *.wv *.w64)1Audio files (*.wav *.flac *.ogg *.mp3 *.wv *.w64)Import2Importar archivo de audioImport Audio FileImport0Importar origen de audioImport audio sourceImport"Insertar SilencioInsert SilenceImportSilencioSilenceImport"Aadir Marcadores Add MarkersImportClipsDialog.Importar Clips de AudioImport Audio ClipsImportClipsDialog(Importar a la Pista:Import to Track:ImportClipsDialogd El comando del Plugin %1 no ha sido encontrado !Command Plugin %1 not found! InputEngineLas acciones tipo "mantener presionado" no estn disponibles desde el Men Contextual0Hold actions are not supported from Context Menu InputEngineLos modificadores para acciones de teclado no estn disponibles desde el Men Contextual8Modifier key actions are not supported from Context Menu InputEngine`El Plugin %1 no tiene implementado el Comando %2&Plugin %1 doesn't implement Command %2 InputEngine"Insertar silencioInsert SilenceInsertSilenceDialog:Insertar Silencio (segundos):Insert Silence (seconds):InsertSilenceDialog %1: %2%1: %2 Interface&&Acerca de Traverso&About Traverso Interface&CD (grabar)...&CD Writing... Interface&Editar&Edit Interface&Exportar... &Export... InterfacePara &Comenzar&Getting Started Interface A&yuda&Help Interface,Gestionar Pro&yecto...&Manage Project... Interface&Nuevo...&New... Interface&Abrir...&Open... Interface &Preferencias...&Preferences... Interface&Proyecto&Project Interface &Salir&Quit InterfaceD&Formato de archivo para grabacin&Recording File Format Interface>&Calidad del cambio de muestreo&Resample Quality Interface(&Restaurar Backup...&Restore Backup... Interface&Guardar&Save Interface &Hoja&Sheet Interface Mostrar &Efectos &Show Effects Interface&Pegajoso&Snap Interface$Manual de &Usuario &User Manual Interface&Ver&View Interface$<b>Descripcin</b>Description Interface4<b>Secuencia de teclas</b>Key Sequence InterfaceUn directorio de proyecto ha sido cambiado fuera de Traverso. Es una operacin NO permitida. Por favor, deshaga ese cambio ahora. Si desea renombrar un Proyecto, use el Gestor de Proyectos!A Project directory changed outside of Traverso. This is NOT supported! Please undo this change now! If you want to rename a Project, use the Project Manager instead! Interface$Acerca de TraversoAbout Traverso InterfacenArchivos de Audio (*.wav *.flac *.ogg *.mp3 *.wv *.w64)1Audio files (*.wav *.flac *.ogg *.mp3 *.wv *.w64) Interface MejorBest InterfaceZHa cambiado la codificacin de grabacin a %1$Changed encoding for recording to %1 InterfacefLa calidad de cambio de muestreo se establece a: %1Changed resample quality to: %1 Interface,Medidor de CorrelacinCorrelation Meter Interface EditarEdit Interface:Espectro de frecuencias (FFT) FFT Spectrum Interface RpidaFast InterfaceAltaHigh InterfaceHistoriaHistory Interface$&Importar Audio...Import &Audio... Interface*Insertar &Silencio...Insert Si&lence... InterfacejMantiene a la vista el cursor al reproducir grabar.4Keep play cursor in view while playing or recording. Interface.Editor de marcadores...Marker Editor... Interface MediaMedium InterfaceHoja &nueva...New &Sheet(s)... Interface&Pista nueva...New &Track(s)... Interface.Abrir archivos de audioOpen Audio Files Interfacer Abriendo el Manual de Usuario en un navegador externo !(Opening User Manual in external browser! InterfaceProyectoProject InterfaceRehacerRedo Interface&Ventana de recursos Resources Bin Interface.Cursor &visible siempreS&croll Playback InterfaceAj&ustes Se&ttings InterfaceMuestra los plugins de efectos y las curvas de automatizacin en las pistas3Show effect plugins and automation curves on tracks InterfaceAyuda a hacer coincidir los bordes del objeto con los de otros objetos, mientras se arrastra.2Snap items to edges of other items while dragging. Interface.Informacin del SistemaSystem Information InterfaceEl Proyecto solicitado `%1` no ha podido ser cargado por la siguiente razn: '%2' Se le presentar ahora una lista de backups disponibles (si hay alguno), desde los que restaurar el Proyecto.The requested Project `%1` could not be loaded for the following reason: '%2' You will now be given a list of available backups (if any) to restore the Project from. Interface:Consola clsica de transporteTransport Console InterfaceTraverso %1 (construido con Qt %2) Un programa editor y grabador de audio multipista. Consulte la ayuda para ms informacin. Traverso le es ofrecido a usted por R. Sijrier y otros, incluyendo a las personas del mundo del Software Libre que han aportado tecnologas importantes en las que Traverso est basado (Gcc, Qt, Xorg, Linux, etc.) KTraverso %1 (built with Qt %2) A multitrack audio recording and editing program. Look in the Help menu for more info. Traverso is brought to you by R. Sijrier and others, including all the people from the Free Software world who contributed the important technologies on which Traverso is based (Gcc, Qt, Xorg, Linux, and so on) Interface*Traverso - ImportanteTraverso - Important InterfaceJTraverso - Carga del Proyecto fallidaTraverso - Project load failed InterfaceDeshacerUndo InterfacefDriver Jack: Conectado con xito al servidor Jack !7Jack Driver: Connected successfully to the jack server! JackDriverDriver Jack: No se puede conectar al servidor Jack. Est funcionando Jack?BJack Driver: Couldn't connect to the jack server, is jack running? JackDriver<html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Bitstream Vera Sans; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Pulsacin doble (ms)</p></body></html>Z

Double fact timeout (ms)

KeyboardConfigPage<html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Bitstream Vera Sans; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Pulsacin mantenida (ms)</p></body></html>S

Hold timeout (ms)

KeyboardConfigPageb<html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Tiempo de pulsacin doble:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">El mximo tiempo, en milisegundos, entre dos pulsaciones de tecla </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">para diferenciar si se trata una pulsacin doble (una &lt;&lt; K &gt;&gt; )</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> o dos pulsaciones individuales ( una &lt; K &gt; y otra &lt; K &gt; </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">o acciones &lt; KK &gt; y &lt; KK &gt; por ejemplo).</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Los usuarios experimentados pueden usar un valor bajo, como 150 ms, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">pero si an no tiene mucha experiencia, deje el vaor por defecto de 180 ms.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Para ms informaci, consulte el captulo 3, Acciones de Teclado, del manual de usuario</p></body></html>

Double fact timeout:

The maximum time in miliseconds between 2 key presses

to determine if the 2 key presses are a double fact ( << K >> or << KK >>)

or 2 individual key presses ( a < K > and < K > action,

or < KK > and < KK > action for example).

Experienced users can set this value as low as 150 ms,

if you don't have much experience yet, please leave the default of 180 ms.

For more information, see chapter 7: Key Actions. of the User Manual

KeyboardConfigPage<html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:8pt; font-weight:400; font-style:normal;"> <table border="0" style="-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;"> <tr> <td style="border: none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; font-weight:600;">Tiempo de Pulsacin Mantenida:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">El tiempo mximo para considerar una pulsacin de tecla como mantenida, </span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">como [ K ] o [ KK ].</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">Cuanto ms corto sea este valor, antes ser considerada la pulsacin </span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">como pulsacin mantenida. </span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">Los usuarios experimentados pueden usar un valor bajo, como 130 ms, </span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">si Ud. an no tiene mucha experiencia, mejor use el valor por defecto de 180 ms.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">Para ms informacin, ver Cap. 3: "Acciones de Teclado" del Manual de Usuario.</span></p></td></tr></table></body></html>7

Hold timeout:

The maximum time to consider a pressed key a hold key fact,

like [ K ] or [ KK ].

The shorter this time, the sooner a pressed key will be

detected as a hold action.

Experienced users can set this value as low as 110 ms,

if you don't have much experience yet, please leave the default of 150 ms.

For more information, see chapter 7: "Key Actions" of the User Manual.

KeyboardConfigPage$Configurar tecladoConfigure KeyboardKeyboardConfigPage0Exportar mapa de teclado Export KeymapKeyboardConfigPageFormularioFormKeyboardConfigPage>Exportacin del Mapa de Teclado KeyMap ExportKeyboardConfigPageMapa de tecladoKeymapKeyboardConfigPagetNo se ha establecido descripcin para este mapa de teclado"No description set for this keymapKeyboardConfigPage0Imprimir mapa de teclado Print KeymapKeyboardConfigPage6Seleccionar mapa de teclado Select keymapKeyboardConfigPagehEl mapa de teclado exportado se encuentra aqu: %1+The exported keymap can be found here: %1KeyboardConfigPageEspaolEnglish LanguageName&Cancelar&Cancel MarkerDialogE&xportar&Export MarkerDialog&Ok&Ok MarkerDialog&Eliminar&Remove MarkerDialog...... MarkerDialogAplicar a todo Apply to all MarkerDialogArreglista: Arranger: MarkerDialogTexto del CDCD-Text MarkerDialog*Texto opcional del CDCD-Text optional MarkerDialogCompositor: Composer: MarkerDialog&Proteccin de copiaCopy protection MarkerDialog ISRC:ISRC: MarkerDialogMarcadoresMarkers MarkerDialogMensaje:Message: MarkerDialogOpcionesOptions MarkerDialogIntrprete: Performer: MarkerDialogPosicinPosition MarkerDialog2Posicin: (MM:SS:75-avos)Position: (MM:SS:75ths) MarkerDialogPre-Emphasis Pre-Emphasis MarkerDialogLetrista Songwriter MarkerDialog TituloTitle MarkerDialogTitulo:Title: MarkerDialogCopiar Clip Copy ClipMoveClip(Desplazar marcadores Fold MarkersMoveClipDesplazar hoja Fold SheetMoveClipDesplazar pista Fold TrackMoveClipMover Clip Move ClipMoveClip&Mover Clip al finalMove Clip To EndMoveClip.Mover Clip al principioMove Clip To StartMoveClip.Mover el borde del clipMove Clip EdgeMoveEdge......NewProjectDialognArchivos de Audio (*.wav *.flac *.ogg *.mp3 *.wv *.w64)1Audio files (*.wav *.flac *.ogg *.mp3 *.wv *.w64)NewProjectDialogTCopiar archivos al directorio del proyectoCopy files to project directoryNewProjectDialogDNo se puede crear el proyecto (%1)Couldn't create project (%1)NewProjectDialogDescripcin DescriptionNewProjectDialogProyecto vaco Empty ProjectNewProjectDialogIngenieroEngineerNewProjectDialogArchivoFileNewProjectDialog2Importar archivo de audioImport Audio FilesNewProjectDialog NombreNameNewProjectDialogProyecto nuevo New ProjectNewProjectDialogNoNoNewProjectDialogNmero de hojasNumber of SheetsNewProjectDialog.Abrir archivos de audioOpen Audio FilesNewProjectDialogEl proyecto "%1" ya existe. Quiere borrarlo y reemplazarlo por uno nuevo?YThe Project "%1" already exists, do you want to remove it and replace it with a new one ?NewProjectDialog$Nombre de la pista Track NameNewProjectDialogPistas por hojaTracks per SheetNewProjectDialog&Traverso - PreguntaTraverso - QuestionNewProjectDialogUsar plantilla Use TemplateNewProjectDialogSiYesNewProjectDialog\Debe proporcionar un nombre para el proyecto !'You must supply a name for the project!NewProjectDialog"Se aadi %n Hoja*Se aadieron %n HojasAdded %n Sheet(s)NewSheetDialog~No se puede crear una Hoja nueva si no hay un Proyecto cargado!:I can't create a new Sheet if there is no Project loaded!!NewSheetDialog.Nombre de la nueva HojaNew Sheet nameNewSheetDialogNuevas hoja(s) New Sheet(s)NewSheetDialogNmero de hojas Sheet countNewSheetDialog Nmero de pistas Track countNewSheetDialogUsar Plantilla Use TemplateNewSheetDialog0Se aadieron %n Pista(s)0Se aadieron %n Pista(s)Added %n Track(s)NewTrackDialogNo se puede crear una Pista nueva si no hay un Proyecto cargado!:I can't create a new Track if there is no Project loaded!!NewTrackDialogNuevas pista(s) New Track(s)NewTrackDialog Nmero de pistas Track countNewTrackDialog$Nombre de la pista Track nameNewTrackDialog\<p>El nombre del directorio del Proyecto <b>%1</b> es diferente del ttulo del Proyecto <b>%2</b>!</p><p>Ha renombrado Ud. el directorio del Proyecto? </p><p>Por favor, vuelva a nombrar el directorio con el ttulo del Proyecto <b>%1</b>, y cambie el ttulo del Proyecto usando el gestor Proyectos!</p>

Project directory name %1 is different from the Project title %2!

Did you rename the Project directory ?

Please rename the directory back to the Project title %1, and change the Project title with the Project Manager Dialog!

OpenProjectDialogEst seguro de querer borrar el proyecto %1 ? No se puede deshacer!TAre you sure that you want to remove the project %1 ? It's not possible to undo it !OpenProjectDialogvCree un directorio de proyecto nuevo, o elija uno existente4Choose an existing or create a new Project DirectoryOpenProjectDialogvTraverso ha creado el nuevo directorio de Proyecto aqu: %1/Created new Project directory for you here: %1 OpenProjectDialogCreado el: Created on:OpenProjectDialog BorrarDeleteOpenProjectDialogDescripcin: Description:OpenProjectDialog CargarLoadOpenProjectDialog:No hay proyecto seleccionado!No Project selected!OpenProjectDialogAbrir Proyecto Open ProjectOpenProjectDialogCompruebe los permisos de este directorio, o elija uno distinto %1FPlease check permission for this directory or choose another one: %1OpenProjectDialogZCompruebe los permisos de este directorio: %1.Please check permission for this directory: %1OpenProjectDialogEl Proyecto %1 no existe. Lo ha renombrado, o borrado el directorio de ese nombre?RProject %1 does not exist, did you rename or remove the directory what that name ?OpenProjectDialog4El Proyecto no existe (%1)Project does not exist! (%1)OpenProjectDialogDSeleccionar directorio de ProyectoSelect Project DirOpenProjectDialogrSeleccione un proyecto y pulse el botn 'Cargar' de nuevo2Select a project and click the 'Load' button againOpenProjectDialog*Proyecto SeleccionadoSelected ProjectOpenProjectDialogVUsted no puede escribir en este directorio!(This directory is not writable by you! OpenProjectDialog,Traverso - InformacinTraverso - InformationOpenProjectDialog&Traverso - PreguntaTraverso - QuestionOpenProjectDialog,Traverso - AdvertenciaTraverso - WarningOpenProjectDialogZNo se puede crear el directorio del Proyecto!%Unable to create Project directory! OpenProjectDialog\Debe proporcionar un nombre para el proyecto !'You must supply a name for the project!OpenProjectDialogBPADriver:: Error de PortAudio: %1PADriver:: PortAudio error: %1PADriverlPADriver:: hostapi %1 no fu encontrado por Portaudio!1PADriver:: hostapi %1 was not found by Portaudio!PADriver <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;"> Driver PortAudio:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">El driver que debiera controlar el motor de PortAudio</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">PortAudio admite muchos drivers, para varios de los cuales Traverso tembin tiene soporte nativo. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Se recomienda usar los drivers nativos de Traverso en vez de los de PortAudio. Sin embargo, puede probar los de PortAudio si encuentra problemas con los drivers nativos!</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">PortAudio proporciona soporte transparente para los drivers en varias plataformas, incluyendo Windows (ver las opciones de wmme, directx y asio), y Mac OS X (ver las opciones de CoreAudio y Jack))</p></body></html>

PortAudio Driver:

The driver which should drive the PortAudio backend

PortAudio supports many driver backends, some of which Traverso has native support for too.

It is recommended to use Traverso's native drivers instead of using PortAudio's, however, if the native drivers give problems, you might try the ones supplied by PortAudio instead!

PortAudio provides transparent driver support for multiple platforms, including Windows (see the wmme, direct x and asio options), and Mac OS X (see the CoreAudio and jack options)

 PaDriverPage DriverDriver PaDriverPageFormularioForm PaDriverPage(Drivers de PortaudioPortaudio drivers PaDriverPage<html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Tamao del buffer de lectura (s):</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">La cantidad de datos de audio que pueden guardarse en </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">los buffers de lectura, en segundos.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">El valor por defecto de 1 segundo debiera ser adecuado.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Sin embargo, si est escaso de memoria, puede usar un valor menor.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Si nota underruns (pequeas interrupciones) cuando el diso duro est transmitiendo a </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(casi) plena velocidad, o cuando ocurren frecuentes underruns debido </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">a que el disco no puede "seguir el ritmo" por cualquier motivo, puede probar </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">un valor mayor, como 1.5 o 2.0 segundos.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ntese que cuando se usa un buffer mayor, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">llevar ms tiempo el mover el cursor a otras posiciones</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> (por ej. en bsquedas), ya que todos los buffers </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(uno por cada clip de audio * nmero de canales) necesitan volver a llenarse!</p></body></html> +

Read buffer size:

The amount of audio data that can be stored in the

read buffers in seconds.

The default value of 1 second should do just fine.

However, if you're tight on memory, you can make this value lower.

If you experience buffer underruns when the hard disk bandwidth is

(almost) saturated, or when buffer underruns happen regularly due

the hard disk can't keep up for some reason, you can try a larger

value, like 1.5 or 2.0 seconds.

Keep in mind that when using a larger buffer,

it will take considerably more time to move (i.e. seeking)

the playhead to another positions, since all the buffers

(one for each audioclip * channel count) need to be refilled!

PerformanceConfigPage<html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Acelera el dibujado de los Clips y las pistas, usando </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">el motor 3D de la tarjeta grfica.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Dependiendo de su trajeta grfica y del soporte del </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">driver, sto puede acelerar el dibujado considerablemente!</p></body></html>8

Accelerates the painting of AudioClips and Tracks by using

the 3D engine of your graphics card.

Depending on your graphics card and driver support, this

can speed up painting considerably!

PerformanceConfigPage <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">El nmero de veces por segundo que los objetos grficos</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">son redibujados durante una accin de movimiento, como mover</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">un Clip, o cambiar una ganancia.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">El valor por defecto de 35 cuadros/seg. consigue un buen equilibrio </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">entre continuidad al dibujar y un uso moderado de CPU.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">No obstante, si aprecia que el dibujado no es lo bastante continuo,</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">cambie este valor por uno ms alto, pero recordando </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">que consumir bastante ms CPU!</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Si por ejemplo, mover un Clip an consume demasiada CPU, puede </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">considerar reducir este valor.</p></body></html> ~

The number of times per second at which the Graphical

Items are repainted during a jog action, like moving an

AudioClip, or changing the Gain.

The default frames per second of 35 is a perfect compromise

between smooth painting, and low cpu usage.

However, if you find the painting to be not smooth enough,

change this value to a higher one, but keep in mind that it

will consume considerably more cpu!

If for example moving an AudioClip still takes to much cpu,

you should consider to lower this value.

PerformanceConfigPage6Archivo del buffer de audioAudio file bufferingPerformanceConfigPageEl cambio del tamao del buffer tendr efecto slo tras (re)cargar el Proyecto.QChanging the buffer size only will take into effect after (re)loading a project.PerformanceConfigPageFormularioFormPerformanceConfigPageLVelocidad de redibujado al mover (fps)Jog repaint speed (fps)PerformanceConfigPageCmo dibujarPaintingPerformanceConfigPageDTamao del buffer de lectura (seg)Read buffer size (seconds)PerformanceConfigPage:Usar aceleracin por hardwareUse hardware accelerationPerformanceConfigPage(Icono de informacin info iconPerformanceConfigPage*Aadir tambin PluginAdd Plugin tooPluginSelectorDialogCancelarCancelPluginSelectorDialogEntrada/SalidaIn/OutPluginSelectorDialogOKOKPluginSelectorDialog"Nombre del plugin Plugin NamePluginSelectorDialog&Selector de pluginsPlugin SelectorPluginSelectorDialogTipoTypePluginSelectorDialog@Importando archivo %1 de %2: %p%Importing file %1 of %2: %p%ProgressToolBar"Barra de progresoProgress ToolbarProgressToolBarDNo se puede crear el directorio %1Cannot create dir %1ProjectNo se puede abrir el fichero de propiedades del Proyecto para escritura (Archivo %1. Razn: %2)HCouldn't open Project properties file for writing! (File %1. Reason: %2)Project6Creado el nuevo Proyecto %1Created new Project %1Project^Detectada saturacin en el audio exportado (%1))Detected clipping in exported audio! (%1)ProjectLa exportacin ya se est realizando. No puede iniciarse dos veces!2Export already in progress, cannot start it twice!Project&Proyecto %1 cargadoProject %1 loadedProject(Proyecto %1 guardadoProject %1 saved ProjectProyecto %1: No se puede abrir el archivo project.tfp (razn: %2)6Project %1: Cannot open project.tpf file! (Reason: %2)ProjectProyecto %1: Fallo al procesar el archivo project.tfp (razn: %2):Project %1: Failed to parse project.tpf file! (Reason: %2)ProjectLa versin del archivo de proyecto no corresponde. No se puede cargar el Proyecto!Es necesario convertir %1 archivos</b>Need to convert %1 filesProjectConverter@La conversin finaliz con xitoConversion finished succesfullyProjectConvertertConversin detenida a peticin del usuario. Puede continuar usando este proyecto con Traverso <= 0.41.0, o volverlo a abrir con esta versin de Traverso y comenzar de nuevo la conversinConversion stopped on user request, you can continue to use this Project with Traverso <= 0.41.0, or reopen it with this version of Traverso and start the conversion againProjectConverter\Convirtiendo el archivo project.tfp... Hecho!&Converting project.tpf file..... Done!ProjectConverterNo se puede abrir el fichero de propiedades del Proyecto para escritura (Archivo %1. Razn: %2)HCouldn't open Project properties file for writing! (File %1. Reason: %2)ProjectConverterfNo est disponible la descripcin de la conversin!$No conversion description available!ProjectConverter,Proyecto %1 convertidoProject %1 convertedProjectConverterProyecto %1: Fallo al procesar el archivo project.tfp (razn: %2):Project %1: Failed to parse project.tpf file! (Reason: %2)ProjectConverterEl archivo de proyecto con versin %1 no puede ser convertido. Slo se puede con archivos de versin 2 !PProject file with version %1 cannot be converted, only files with version 2 can!ProjectConverterlGuardando el archivo project.tfp convertido... Hecho!+Saving converted project.tpf file.... Done!ProjectConverter|Iniciando la conversin del Proyecto desde la versin 2 a la 37Starting to convert Project from version 2 to version 3ProjectConverter CerrarCloseProjectConverterDialog8Informacin de la conversinConversion informationProjectConverterDialog2Progreso de la conversinConversion progressProjectConverterDialogCargar Proyecto Load ProjectProjectConverterDialog0Convertidor de ProyectosProject ConverterProjectConverterDialogJProyecto XXX (no necesita traduccin)#Project XXX (no translation needed)ProjectConverterDialog&Comenzar conversinStart conversionProjectConverterDialog$Detener conversinStop conversionProjectConverterDialog--ProjectInfoWidget&Profundidad de bitsBitdepthProjectInfoWidgetProyectoProjectProjectInfoWidgetNAccesorio para Informacin del ProyectoProject Information WidgetProjectInfoWidgetTasaRateProjectInfoWidgetCancionesSongsProjectInfoWidgetDNo se puede crear el directorio %1Cannot create dir %1ProjectManager^Elija un directorio donde guardar los proyectos,Choose a directory to store your Projects inProjectManagerpNo se puede renombrar el directorio del Proyecto como %1(Could not rename Project directory to %1ProjectManagervTraverso ha creado el nuevo directorio de Proyecto aqu: %1/Created new Project directory for you here: %1 ProjectManagerPProyecto por defecto creado por Traverso#Default Project created by TraversoProjectManagerHGuardar el proyecto antes de salir?/Do you want to save the Project before quiting?ProjectManager|No hay un Proyecto que guardar. Abra o cree un Proyecto antes!3No Project to save, open or create a Project first!ProjectManagerNo hay ningn directorio selecionado. Para reintentar, en la ventana 'Abrir Proyecto' pulse el botn 'Seleccionar Directorio de Proyectos'oNo directory was selected, to retry open the 'Open Project Dialog' and click 'Select Project Directory' button ProjectManagerCompruebe los permisos de este directorio, o seleccione otro distinto. %1FPlease check permission for this directory or choose another one: %1ProjectManagerZCompruebe los permisos de este directorio: %1.Please check permission for this directory: %1ProjectManager2El Proyecto %1 ya existe!Project %1 already exists!ProjectManagerYa no puede encontrarse el directorio %1 (ha borrado o renombrado Ud. el directorio del proyecto?)WProject %1 no longer could be found! (Did you remove or rename the Project directory ?)ProjectManagerBackup del archivo del Proyecto. El archivo de proyecto %1 no se puede abrir para lectura (razn: %2)TProjectfile backup: The project file %1 could not be opened for reading (Reason: %2)ProjectManager Guardar Proyecto Save ProjectProjectManagerVUsted no puede escribir en este directorio!(This directory is not writable by you! ProjectManager,Traverso - AdvertenciaTraverso - WarningProjectManagerZNo se puede crear el directorio del Proyecto!%Unable to create Project directory! ProjectManagerLNo se puede crear el nuevo Proyecto %1Unable to create new Project %1ProjectManagerNNo se puede cargar el nuevo Proyecto %1Unable to load Project %1ProjectManager^Usando el directorio de proyectos existente: %1%Using existing Project directory: %1 ProjectManager<html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Rehacer el ltimo cambio</p></body></html>

Redo last change

ProjectManagerDialog<html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Deshacer el ltimo cambio</p></body></html>

Undo last change

ProjectManagerDialogMsica modernaAdult ContemporaryProjectManagerDialog Rock alternativoAlternative RockProjectManagerDialogArreglistaArrangerProjectManagerDialogTexto del CDCD TextProjectManagerDialog Nios ChildrensProjectManagerDialogClsica ClassicalProjectManagerDialog Msica CristianaContemporary ChristianProjectManagerDialog^No se puede abrir el fichero %1 para escritura!"Couldn't open file %1 for writing!ProjectManagerDialogMsica CountryCountryProjectManagerDialog Crear Hoja nuevaCreate new SheetProjectManagerDialogMsica DanceDanceProjectManagerDialog BorrarDeleteProjectManagerDialogDescripcin DescriptionProjectManagerDialogDilogoDialogProjectManagerDialogID del disco:Disc ID:ProjectManagerDialogMsica ligeraEasy ListeningProjectManagerDialogIngenieroEngineerProjectManagerDialog<Ponga el nombre de la PantillaEnter Template nameProjectManagerDialogMsica EroticaEroticProjectManagerDialogExportarExportProjectManagerDialogMsica FolkFolkProjectManagerDialogGnero:Genre:ProjectManagerDialogMsica GospelGospelProjectManagerDialogHip HopHip HopProjectManagerDialogInformativo InformationalProjectManagerDialogJazzJazzProjectManagerDialogMsica LatinaLatinProjectManagerDialogDuracinLengthProjectManagerDialogMensajeMessageProjectManagerDialogMusicalesMusicalProjectManagerDialogNew AgeNew AgeProjectManagerDialogHoja nueva New SheetProjectManagerDialogjNo se ha proporcionado un nombre pata la nueva Hoja!No new Sheet name was supplied!ProjectManagerDialog OperaOperaProjectManagerDialogOperetaOperetteProjectManagerDialogIntrprete PerformerProjectManagerDialogMsica Pop Pop MusicProjectManagerDialogProyectoProjectProjectManagerDialog~El Proyecto de ttulo '%1' ya existe. Ponga un ttulo distinto!IProject with title '%1' allready exists, please supply a different title!ProjectManagerDialogRapRapProjectManagerDialog ReggaeReggaeProjectManagerDialogCambiar nombreRenameProjectManagerDialog0Rhythm and Blues clsicoRhythm and BluesProjectManagerDialogMsica rock Rock MusicProjectManagerDialog"Guardar plantilla Save TemplateProjectManagerDialogDPlantilla de Proyecto guardada: %1Saved Project Template: %1ProjectManagerDialog"Hoja seleccionadaSelected SheetProjectManagerDialog"Nombre de la Hoja Sheet NameProjectManagerDialogHoja(s)Sheet(s)ProjectManagerDialog HojasSheetsProjectManagerDialogLetrista SongwriterProjectManagerDialogEfectos sonoros Sound EffectsProjectManagerDialogPalabra hablada Spoken WordProjectManagerDialogPlantillaTemplateProjectManagerDialogxLa plantilla de nombre %1 ya existe. Desea sobreescribirla?CTemplate with name %1 already exists! Do you want to overwrite it?ProjectManagerDialog TituloTitleProjectManagerDialog PistasTracksProjectManagerDialog,Traverso - InformacinTraverso - InformationProjectManagerDialogUPC EAN:UPC EAN:ProjectManagerDialogHNo se puede crear el directorio %1 !Unable to create directory %1!ProjectManagerDialogSin definir UndefinedProjectManagerDialogSin usarUnusedProjectManagerDialog"Msicas del mundo World MusicProjectManagerDialogrehacer textoredotextProjectManagerDialogdeshacer textoundotextProjectManagerDialog2Ha habido un error fatal.A fatal error occurred.QObject<Se sobrepas el tiempo lmite.A timeout occurred.QObjectDHubo un error al leer del archivo.-An error occurred when reading from the file.QObjectPHubo un error al escribir en el archivo.+An error occurred when writing to the file.QObject<Hubo un error no especificado.An unspecified error occurred.QObjectClip de Audio AudioClipQObject CurvaCurveQObjectNodo de Curva CurveNodeQObjectCurva de Fade FadeCurveQObjectMarcadorMarkerQObjectNo hubo erroresNo error occurredQObjectResourc error Resourc errorQObjectHojaSheetQObject>No se puede acceder al archivo.The file could not be accessed.QObject<No se puede copiar el fichero.The file could not be copied.QObject:No se puede abrir el fichero.The file could not be opened.QObject<No se puede borrar el fichero.The file could not be removed.QObjectBNo se puede renombrar el fichero.The file could not be renamed.QObjectNEl archivo no puede ser redimensionado.The file could not be resized.QObject6La operacin fu cancelada.The operation was aborted.QObjectfLa posicin no se puede cambiar dentro del archivo..The position in the file could not be changed.QObjectLnea de tiempoTimeLineQObject PistaTrackQObject"Error desconocido Unknown errorQObjectK<html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:18pt; font-weight:600;">Traverso: Para comenzar</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2';"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2';">Cuando graba o importa un archivo de audio en Traverso, ste lo muestra como un Clip de Audio en una de las Pistas horizontales de la hoja activa. Puede editar muchos aspectos de estos Clips situando el ratn sobre un Clip, y presionando (o manteniendo presionadas) diferentes teclas de su teclado o ratn. Tambin se pueden cambiar los ajustes de una Pista, de la Hoja completa, y de otros objetos de la Hoja.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2';"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2';">Para ver una lista completa de los comandos que estn disponibles para un objeto determinado de la hoja, ponga el ratn sobre ese objeto y pulse el botn derecho (o la tecla Q). Los atajos de teclado para cada comando se muestran en el men. La notacin se indica a continuacin.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2';"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2';"> </span><span style=" font-family:'MS Shell Dlg 2'; font-weight:600;">&lt; K &gt; </span><span style=" font-family:'MS Shell Dlg 2';">significa presionar y liberar la tecla K (como un click).</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-weight:600;">&lt;&lt; K &gt;&gt;</span><span style=" font-family:'MS Shell Dlg 2';"> significa presionar la tecla K dos veces, rpidamente (como un doble click)</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2';"> </span><span style=" font-family:'MS Shell Dlg 2'; font-weight:600;">[ K ]</span><span style=" font-family:'MS Shell Dlg 2';"> significa mover el ratn mientras se mantiene presionada la tecla K.</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2';"> </span><span style=" font-family:'MS Shell Dlg 2'; font-weight:600;">&lt; KL &gt; </span><span style=" font-family:'MS Shell Dlg 2';"> significa presionar las teclas K y L al mismo tiempo.</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2';"> </span><span style=" font-family:'MS Shell Dlg 2'; font-weight:600;">[ KL ] </span><span style=" font-family:'MS Shell Dlg 2';"> significa mover el ratn mientras se mantienen pulsadas las teclas K y L.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2';"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2';">Estos son algunos comandos bsicos:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2';"> </span><span style=" font-family:'MS Shell Dlg 2'; font-weight:600;">&lt; ESPACIO &gt;</span><span style=" font-family:'MS Shell Dlg 2';"> para Reproducir/Detener.</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2';"> </span><span style=" font-family:'MS Shell Dlg 2'; font-weight:600;">&lt; MAYUSCULAS &gt;</span><span style=" font-family:'MS Shell Dlg 2';"> coloca el Cursor de Reproduccin (lnea roja vertical).</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2';"> </span><span style=" font-family:'MS Shell Dlg 2'; font-weight:600;">&lt; W &gt;</span><span style=" font-family:'MS Shell Dlg 2';"> coloca el Cursor de Trabajo (lnea vertical de puntos grises).</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2';"> </span><span style=" font-family:'MS Shell Dlg 2'; font-weight:600;">&lt; V &gt; </span><span style=" font-family:'MS Shell Dlg 2';"> Lleva el Cursor de Reproduccin a la posicin del Cursor de Trabajo.</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2';"> </span><span style=" font-family:'MS Shell Dlg 2'; font-weight:600;">[ D ] </span><span style=" font-family:'MS Shell Dlg 2';"> mueve los objetos (Clips de Audio, Nodos de Curvas, etc)</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2';"> </span><span style=" font-family:'MS Shell Dlg 2'; font-weight:600;">[ Z ]</span><span style=" font-family:'MS Shell Dlg 2';"> acerca y aleja la imagen (zoom).</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2';"> </span><span style=" font-family:'MS Shell Dlg 2'; font-weight:600;">[ TAB ]</span><span style=" font-family:'MS Shell Dlg 2';"> scroll omnidireccional (de tipo "shuttle"). </span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2';"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2';">Y algunos comandos para Clips de Audio:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2';"> </span><span style=" font-family:'MS Shell Dlg 2'; font-weight:600;">[ E ] </span><span style=" font-family:'MS Shell Dlg 2';"> ampla el Clip por el extremo derecho o izquierdo.</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2';"> </span><span style=" font-family:'MS Shell Dlg 2'; font-weight:600;">[ F ]</span><span style=" font-family:'MS Shell Dlg 2';"> ajusta la duracin del Fade de entrada o salida del Clip.</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2';"> </span><span style=" font-family:'MS Shell Dlg 2'; font-weight:600;">[ G ] </span><span style=" font-family:'MS Shell Dlg 2';">ajusta la ganancia de un Clip (tambin funciona con Pistas y Hojas)</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2';"> </span><span style=" font-family:'MS Shell Dlg 2'; font-weight:600;">&lt; X &gt;</span><span style=" font-family:'MS Shell Dlg 2';"> divide el Clip en la posicin del ratn.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2';"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2';">Para ms informacin, pulse con el botn derecho en cualquier elemento, o consulte el manual de Traverso.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2';"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2';"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2';"></p></body></html>

Traverso: Getting Started

When you record or import an audio file into Traverso, it shows up as an Audio Clip in one of the horizontal Tracks in the current Sheet. You can edit many aspects of these Clips by placing the mouse pointer over a Clip and pressing or holding different keys on your keyboard and mouse. You can also change settings of a Track, the Sheet as a whole, and other objects in the Sheet.

To see a list of what commands are available for any given object in the Sheet, move the mouse over that object, and Right-Click (or press Q). The keyboard shortcuts for each command are shown in the menu. The notation used is shown below.

< K > means press and release the K key. (Like a click.)

<< K >> means press the K key two times fast. (Like a double click.)

[ K ] means drag the mouse while holding down the K key.

< KL > means press the K and L keys at the same time.

[ KL ] means drag the mouse while holding down the K and L keys at the same time.

Here are some basic commands:

< SPACE > is Play/Stop.

< SHIFT > sets the Playhead. (Blue vertical line where playing starts.)

< W > sets the Work Cursor. (Red vertical line.)

< V > moves the Playhead back to the Work Cursor.

[ D ] move objects around (Audio Clip, Curve Nodes, etc)

[ Z ] zooms in and out.

[ TAB ] scroll omnidirectional (aka Shuttle)

And some Audio Clip Commands:

[ E ] drags a Clip's left or right edge.

[ F ] adjusts the length of a Clip's Fade In / Fade Out.

[ G ] addust the Gain of a clip (also works on Tracks, Sheet)

< X > splits the Clip at the cursor's position.

For more information, right-click on everything, or check out the Traverso manual.

QuickStartDialog.Traverso: Para comenzarTraverso: Getting StartedQuickStartDialog8No se puede abrir el ficheroCould not open file ReadSource:El archivo tiene cero canalesFile has zero channels ReadSource4Nmero de canales invlidoInvalid channel count ReadSource^No se estableci un error de Lectura del OrigenNo ReadSource error set ReadSourceSilencioSilence ReadSource*El archivo no existe!The file does not exist! ReadSource <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">WAV</span> : Un formato sin compresin. Usa ms disco duro que los formatos comprimidos, pero carga muy poco a la CPU.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lmites : ~ 1.7 horas de tiempo de grabacin en Stereo - 44.1 KHz</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">WavPack</span> : Un formato con compresin. Puede reducir el tamao hasta la mitad que un WAV, sin prdida de calidad. Aunque requiere bastante ms CPU, eso no debiera ser un problema en un ordenador moderno (ao 2005 en adelante).</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">El uso de este formato hace trabajar mucho menos al disco duro, aumentando su vida til y disminuyendo la probabilidad de que su ancho de banda se sature.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lmites : ~ 5 horas de tiempo de grabacin en Stereo - 44.1 KHz</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">WAV64</span> : formato WAV con cabecera de 64 bit. Actualmente soportado por pocos programas.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lmites : Ninguno, miles de horas de grabacin, suponiendo que quepan en su disco duro.</p></body></html> k

WAV : A format without compression. Uses more hard disk space then compressed encoding formats, but needs very little cpu.

Limits : ~ 1.7 hours of recording time @ Stereo - 44.1 KHz

WavPack : A format with compression, up to 2 times smaller compared to WAV, and no quality loss. Uses significantly more cpu then WAV, but with modern (year 2005 and above) cpu's this shouldn't be a problem.

Using this format stresses the hard disk much less, increasing hard disk live, and less chance of saturating the hard disk bandwidth.

Limits : ~ 5 hours recording time @ Stereo - 44.1 KHz

WAV64 : WAV format with 64 bit header, support by other programs is currently limited.

Limits : None, thousands of hours of recording time, supposed that your hard disk can hold it.

RecordingConfigPage <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Esta opcin reduce el almacenamiento de algunos archivos de coma flotante hasta un 10% eliminando cierta informacin que no tiene prcticamente ningn efecto en el audio. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Aunque tcnicamente esto sera "compresin con prdidas", mantiene todas las ventajas de procesar en coma flotante (&gt;600 dB de rango dinmico, sin "clipping" (saturacin), y 25 bits de resolucin).</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Esto tambin afecta a la compresin al usar "enteros grandes", al limitar la resolucin a 24 bits.</p></body></html>B

This option reduces the storage of some floating-point data files by up to about 10% by eliminating some information that has virtually no effect on the audio data.

While this does technically make the compression lossy, it retains all the advantages of floating point data (>600 dB of dynamic range, no clipping, and 25 bits of resolution).

This also affects large integer compression by limiting the resolution to 24 bits.

RecordingConfigPage MejorBestRecordingConfigPage$Tipo de compresinCompression typeRecordingConfigPagelCalidad por defecto del cambio de muestreo al exportarDefault export resample qualityRecordingConfigPageHabilitar cambio de muestreo "al vuelo" (durante la reproduccin),Enable on the fly resampling (Playback only)RecordingConfigPage.Formato de codificacinEncoding formatRecordingConfigPage RpidaFastRecordingConfigPageFormularioFormRecordingConfigPageAltaHighRecordingConfigPage MediaMediumRecordingConfigPageRCalidad del cambio de muestreo "al vuelo"On the fly resample qualityRecordingConfigPageGrabacin RecordingRecordingConfigPage$Cambio de muestreo ResamplingRecordingConfigPagehEludir WVX para mayor compresin (casi sin prdidas).Skip WVX for extra compression (semi-lossless)RecordingConfigPage Opciones WavPackWavPack optionsRecordingConfigPageGestor de Recursos: Recibi peticin de borrar la Fuente de Audio %1 pero an est en uso por %2 Clips de Audio. NO se borra!wResourcesManager: Received request to remove Audio Source %1but it is still in use by %2 AudioClips!!. NOT removing it!ResourcesManagerGestor de Recursos:: Fall al inicializar el Origen de Lectura %1 (razn %2)CResourcesManager:: Failed to initialize ReadSource %1 (Reason: %2)ResourcesManager FinalEndResourcesWidgetArchivosFilesResourcesWidgetFormularioFormResourcesWidgetDuracinLengthResourcesWidget NombreNameResourcesWidgetOrigenesSourcesResourcesWidgetComienzoStartResourcesWidget--RestoreProjectBackupDialog,Fecha y hora actuales:Current date and time:RestoreProjectBackupDialog FechaDateRestoreProjectBackupDialogUltimo backup: Last backup:RestoreProjectBackupDialog,Restaurar desde backupRestore from backup RestoreProjectBackupDialogXSeleccionar la fecha del backup a restaurar.,Set the date to restore the selected backup.RestoreProjectBackupDialogHoraTimeRestoreProjectBackupDialogAspecto AppearanceSettingsDialogOpciones Audio OptionsSettingsDialogProyectoBehaviorSettingsDialogTecladoKeyboardSettingsDialogRendimiento PerformanceSettingsDialog.Preferencias - TraversoPreferences - TraversoSettingsDialog Driver Sound SystemSettingsDialogAdir Pista Add TrackSheett El comienzo de la exportacin est despus de su final !3Export start frame starts beyond export end frame!!Sheet|La exportacin intenta hacerse a un archivo wav de 0 canales?/Export tries to render to 0 channels wav file??SheetbNo se pudo vaciar a tiempo el Buffer de Escritura#Failed to empty WriteBuffer in timeSheet^No se pudo llenar a tiempo el Buffer de Lectura!Failed to fill ReadBuffer in timeSheetP Se detect sobrecarga del disco duro !Hard Disk overload detected!SheetLNo hay Pistas armadas para grabacin!No Tracks armed for recording!SheetDNo se estableci nombre de artistaNo artists name setSheetdNo hay audio que exportar (est todo silenciado?)*No audio to export! (Is everything muted?)Sheet&Grabando en %n Clip(Grabando en %n ClipsRecording to %n Clip(s)SheetEliminar Pista Remove TrackSheetSin TituloUntitledSheet--SongInfoWidgetGananciaGainSongInfoWidget SMPTESMPTESongInfoWidgetPegajosoSnapSongInfoWidgetCancinSongSongInfoWidget8Accesorio de Info de CancinSongInfoWidgetSongInfoWidgetZoomZoomSongInfoWidget Hz HzSpectralMeterConfigWidget&Cerrar&CloseSpectralMeterConfigWidget10241024SpectralMeterConfigWidget20482048SpectralMeterConfigWidget256256SpectralMeterConfigWidget40964096SpectralMeterConfigWidget512512SpectralMeterConfigWidget81928192SpectralMeterConfigWidgetAvanzadoAdvancedSpectralMeterConfigWidget,Opciones FFT avanzadasAdvanced FFT OptionsSpectralMeterConfigWidgetAplicarApplySpectralMeterConfigWidgetBlackmanBlackmanSpectralMeterConfigWidgetTamao FFT: FFT Size:SpectralMeterConfigWidget<Configuracin del espectro FFTFFT-Spectrum ConfigurationSpectralMeterConfigWidget(Rango de frecuenciasFrequency RangeSpectralMeterConfigWidgetHammingHammingSpectralMeterConfigWidgetHanningHanningSpectralMeterConfigWidget Lmite inferior: Lower Limit:SpectralMeterConfigWidget$Valor inferior dB:Lower dB value:SpectralMeterConfigWidget"Nmero de bandas:Number of bands:SpectralMeterConfigWidgetRectngulo RectangleSpectralMeterConfigWidget2Mostrar espectro promedioShow average spectrumSpectralMeterConfigWidget Lmite superior: Upper Limit:SpectralMeterConfigWidget$Valor superior dB:Upper dB value:SpectralMeterConfigWidget Funcin ventana:Windowing function:SpectralMeterConfigWidget4Exportar curva dB promedioExport average dB curveSpectralMeterViewrFFT: Habilite curva promedio con < M > para generar datos5FFT: Enable avarage curve with < M > to generate dataSpectralMeterViewFFT: No se us ninguna curva de promedio. No hay datos que exportar!/FFT: No avarage curve used, not data to export!SpectralMeterViewPFFT: No hay datos promedio que exportar!FFT: No avarage data to export!SpectralMeterViewvFFT: No se puede escribir la imagen capturada al disco duro0FFT: Unable to write captured image to hard diskSpectralMeterView$Formato de salida:Output format:SpectralMeterViewZNombre de archivo para la Captura de PantallaScreen Capture file nameSpectralMeterView<Seleccin de formato de salidaSelect output formatSpectralMeterViewDividir Clip Split Clip SplitClip.Informacin del SistemaSystem InformationSysInfoToolBar - % - %SystemInfoWidget- GB- GBSystemInfoWidget2Nombre de la Tarjeta (na)Card Name (na)SystemInfoWidget8Utilidad de Info del SistemaSystemInfoWidgetSystemInfoWidget&Profundidad de bitsbitdepthSystemInfoWidget*Tamao de buffer (na)buffer size (na)SystemInfoWidget&Tipo de driver (na)drivertype (na)SystemInfoWidget ImagenimageSystemInfoWidgetLatencia (na) latency (na)SystemInfoWidgetTasarateSystemInfoWidgetxruns (na) xruns (na)SystemInfoWidget8Estado del buffer de lecturaRead Buffer StatusSystemResources<Estado del buffer de escrituraWrite Buffer StatusSystemResourcesAadir Marcador Add MarkerTimeLineQuitar Marcador Remove MarkerTimeLineAadir marcador Add Marker TimeLineView"Borrar Marcadores Clear Markers TimeLineViewMover marcador Drag Marker TimeLineView FinalEnd TimeLineViewRDebe quitar primero los dems marcadores.+You have to remove all other markers first. TimeLineViewAadir ClipAdd ClipTrackBorrar Clip Remove ClipTrack&Silenciar los otrosSilence OthersTrackPista: el AudioClip con id. %1 no fu encontrado en la base de datos!BTrack: AudioClip with id %1 not found in Resources database!Track(Panorama de la Pista Track PanTrackPan0Panorama de la Pista: %1 Track Pan: %1TrackPanBPonga el nuevo nombre de la pistaEnter new Track name TrackView$Nombre de la pistaSet Track name TrackViewPista %1: %2 Track %1: %2 TrackView6Posicin pegajosa siguienteNext Snap PositionTransportConsoleWidget(Reproducir / Detener Play / StopTransportConsoleWidget4Posicin pejagosa anteriorPrevious Snap PositionTransportConsoleWidget GrabarRecordTransportConsoleWidgetdGrabando en %1 Pistas, formato de codificacin: %2+Recording to %1 Tracks, encoding format: %2TransportConsoleWidgetSaltar al final Skip to EndTransportConsoleWidget&Saltar al principio Skip to StartTransportConsoleWidget (De)selecccionar (De)SelectTraversoCommands*(De)selecccionar todo(De)Select AllTraversoCommandsArmar Pistas Arm TracksTraversoCommandsCopiar Clip Copy ClipTraversoCommands AbajoDownTraversoCommandsArrastrar borde Drag EdgeTraversoCommands"Procesado externoExternal ProcessingTraversoCommands(Desplazar marcadores Fold MarkersTraversoCommandsDesplazar hoja Fold SheetTraversoCommandsDesplazar pista Fold TrackTraversoCommandsGananciaGainTraversoCommands&Ganancia: restaurar Gain: ResetTraversoCommandsHorizontal HorizontalTraversoCommands Horizontal - ms Horizontal InTraversoCommands$Horizontal - menosHorizontal OutTraversoCommandsImportar Audio Import AudioTraversoCommands"Insertar SilencioInsert SilenceTraversoCommandsIzquierdaLeftTraversoCommandsCorte magntico Magnetic CutTraversoCommandsMover Clip Move ClipTraversoCommands4Mover o redimensionar ClipMove Or Resize ClipTraversoCommandsNueva pista New TrackTraversoCommandsOmnidireccionalOmnidirectionalTraversoCommandsPanoramaPanoramaTraversoCommands&Panorama: restaurarPanorama: ResetTraversoCommandsBorrar Clip Remove ClipTraversoCommandsEliminar Pista Remove TrackTraversoCommandsDerechaRightTraversoCommandsDividirSplitTraversoCommands ArribaUpTraversoCommandsVerticalVerticalTraversoCommandsVertical - ms Vertical InTraversoCommands Vertical - menos Vertical OutTraversoCommandstraverso-0.49.4/resources/translations/traverso_bg.ts000644 001750 001750 00001077102 11430303020 023371 0ustar00remonremon000000 000000 AddRemoveClip Remove Clip Изтрий клип Remove Selected Clips Изтрий избраните клипове AlsaDevicesPage Form Форма ALSA Device ALSA устройство <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Device:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The real or virtual ALSA device to be used.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A real device is the audiocard installed in your system.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A virtual device is one created in the .asoundrc file, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">often located in your home folder.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If unsure, use either the default device, this will use the audiodevice </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">configured by your distribution, or the device that names your audio card.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">In the latter case, please make sure no application uses the audiocard, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">else the driver won't be able to initialize!</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">For more info see chapter 3.1: "The Driver Backend" of the User Manual</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Устройство:</span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Истинското или виртуално ALSA аудио устройство за използване.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Реално устройство е аудио картата, инсталирана в системата ви.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Виртуално устройство е такова, което е създадено в .asoundrc файла, </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">който често се намира във вашата home папка.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ако не сте сигурни, използвайте устройстов по подразбиране, това ще използва аудио устройството </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">конфигурирано от вашата дистрибуция, или устройството, което носи името на вашата аудио карта.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">После, моля, убедете се, че няма програми, които използват устройството, </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">иначе драйвера няма да може да се инициализира!</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">За повече информация вижте глава 3.1: "The Driver Backend" в ръководство на потребителя</p></body></html> Device Устройстов <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Number of Periods:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Audio is managed in small chunks called periods. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This value determines how many of these chunks are </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">to be used by the driver of the audiocard.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The default should work just fine, and gives optimal latency behavior.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">However, some (buggy) alsa drivers don't work correctly </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">with the default of 2, if you experience very choppy audio, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">please try to use 3 periods.</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Брой Периоди:</span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Аудиото се обработва на малки части, наречени периоди.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Тази стойност определя колко от тези части </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ще се използват от драйвера на аудио картата.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Стойноста по подразбиране трябва да е ОК, и дава оптимална функционалност на системата.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Понякога обаче, някой (лоши) alsa драйвери не работят коректо </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">със тази стойност 2, ако имате прекъсвания в аудиото, </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">моля опитайте да използвате 3 периода.</p></body></html> Nr. of periods Брой Периоди 2 2 3 3 <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Dither is used to make the audio cleaner. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The best way to describe it is to imagine a painting with many dots. If you view it up close you can see each dot and the image is not very clear. If you view it from far away the image becomes clearer because your eyes/brain dither the dots to smooth out the image. It is a murky subject and obviously a very personal choice as to what dither is the best. For most people it is just plain magic. Anyone running at 16bit who cares about quality or has CPU cycles to spare should run with dither. Triangular is probably the best compromise of quality vs cpu cost (its very fast), but shaped is the best</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Dither се използва, за да се направи аудиото по-чисто. </p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Най-добрия начин да си го представим, е да си представим рисунка с много точки. Ако гледате отблизо виждате всяка точка, но картината не е ясна. Ако гледате обаче отдалече, картината става по-чиста, защото очите и мозъка ви размиват точките и смекчават изображението. Това е много субективно и очевидно е въпрос на личен избор къде е най-добре да се използва dither. За повечето хора това си е само теория. Всичко е на 16 бита, кой го е грижа за качеството или има свободно процесорно време да използва dither. Triangular е вероятно най-добрия компромис между качестов и натоварване на процесора (много е бърз), но shaped е най-качествен</p></body></html> Dither Dither (букв. трептене) None Няма Shaped Shaped Rectangular Rectangular Triangular Triangular AlsaDriver ALSA Driver: The playback device %1 is already in use. Please stop the application using it and run Traverso again ALSA Драйвер: Устройството за просвирване %1 е заето. Моля спрете програмата, която го използва и стартирайте отново Traverso. ALSA Driver: You do not have permission to open the audio device %1 for playback ALSA Драйвер: Нямате права за да използвате това устройство за просвирване snd_pcm_open(playback_handle, ..) failed with unknown error type snd_pcm_open(playback_handle, ..) не успя - непозната грешка ALSA Driver: The capture device %1 is already in use. Please stop the application using it and run Traverso again ALSA Драйвер: Устройството за запис %1 е заето. Моля спрете програмата, която го използва и стартирайте отново Traverso. ALSA Driver: You do not have permission to open the audio device %1 for capture ALSA Драйвер: Нямате права за да използвате това устройство за запис ALSA Driver: snd_pcm_open(capture_handle, ...) failed with unknown error type ALSA Драйвер: snd_pcm_open(capture_handle, ...) не успя - непозната грешка ALSA Driver: Cannot open PCM device %1 for playback. Falling back to capture-only mode ALSA Драйвер: Не може да се отвори за просвирване устройството %1. Връщаме се към режим само запис. ALSA: Cannot open PCM device %1 for capture. Falling back to playback-only mode ALSA: Не може да се отвори за запис устройството %1. Връщаме се към режим само просвирване. ALSA Driver: Unable to configure hardware, is it in use by another application? ALSA Драйвер: Не мога да конфигурирам хардуера - използва ли го някоя друга програма? AppearenceConfigPage Icons only Само икони Text only Само текст Text beside Icons Текст до иконите Text below Icons Текст под иконите Default Language Език по подразбиране Select default project dir Изберете директория на проекта по подразбиране Form Форма Theme Изглед Theme selector Избор на Изглед Path to theme files Път към файловете с изгледи Available themes Налични Изгледи Adjust theme color Нагласи цвят на Изгледа Theme Options Настройки на Изгледа Paint audio rectified Рисувай аудиото ректифицирано <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Painting the waveform with an outline is more detailed, but requires more cpu.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If you experience slowness when painting many clips, or during animated scroll, unselect this option!</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Рисуването на вълната с контур е по-детайлно, но изисква процесорно време.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ако имате забавяне при много клипове, или по време на анимирано превъртане, размракирайте тази опция!</p></body></html> Paint audio with outline Рисуивай аудиото с контур Paint stereo audio as mono audio Рисувай стереото като моно аудио Draw lines at 0 and -6 dB Чертай линии на 0 и -6 децибела Style Options Настройки на Стила Select style Избери Стил Use selected style's palette Използвай палета на избрания стил Toolbars Ленти с инструменти Icon size Размер на Икона Button style Стил на Бутон Transport Console size Размер на Транспортната Конзола Language Език Interface Language Език на Интетрфейса Changing the language of the Interface will take effect after restarting Traverso! Смяната на езика на интерфейса ще влезе в сила след реастартиране на Traverso! ArmTracks Arm Tracks Зареди трак AudioClip Unable to Record to Track Не мога да записвам на трака AudioDevice doesn't have this Capture Bus: %1 (Track %2) АудиоУстройството няма този бус за запис: %1 (Трак %2) Toggle Mute Превключи Заглушаване Toggle Lock Превключи Заключване Remove Fades Премахни затихванията/усилванията Normalization Нормализиране Set Normalization level: Задай ниво за Нормализиране AudioClip: Normalize AudioClipEditDialog Dialog Диалог Clip Parameters Параметри на Клипа External Processing Външна Обработка hh:mm:ss.sss чч:мм:сс:ссс TextLabel ТекстовЕтикет End Край Length Дължина Track start Начало на трака Gain Усилване Name Име Fades Затихвания / Усилвания Fade In Усилване Mode Режим Bending Извиване Strength Сила &Linear &Линейно &Default &По подразбиране Fade Out Затихване Source AudioClipExternalProcessing Clip: External Processing Клип: Външна Обработка AudioClipManager Selection: Remove Clip Селекция: Премахни Клип Selection: Add Clip Селекция: Добави Клип Selection: Invert Селекция: Вмъкни AudioClipView Click to reset AudioFile ! Кликнете за да възстановите АудиоФайл ! Reset Audio File for Clip: %1 Възстанови Аудио Файла за Клип: %1 All files (*);;Audio files (*.wav *.flac) Всички файлове (*);;Аудио файлове (*.wav *.flac) No file selected! Няма избран файл! Succesfully set AudioClip file to %1 Успешно бе зададен АудиоКлип файл за %1 AudioDevice No Driver Loaded Не е зареден драйвер Audiodevice: Failed to create the Jack Driver АудиоУстройство: не може да се създаде Jack драйвер Audiodevice: Failed to create the ALSA Driver АудиоУстройство: не може да се създаде ALSA драйвер Audiodevice: Failed to create the PortAudio Driver АудиоУстройство: не може да се създаде PortAudio драйвер Audiodevice: Failed to create the PulseAudio Driver АудиоУстройство: не може да се създаде PulseAudio драйвер Audiodevice: Failed to create the CoreAudio Driver АудиоУстройство: не може да се създаде CoreAudio драйвер No Device Configured Няма конфигурирано устройство The Jack server has been shutdown! Jack сървъра беше спрян! AudioDevice:: Buffer underrun 'Storm' detected, switching to Null Driver АудиоУстройство: Засечено е прекъсване на буфер "Storm", превключвам на Нулев Драйвер AudioDevice:: For trouble shooting this problem, please see Chapter 11 from the user manual! АудиоУстройство: За решаване на този проблем, моля вижте Глава 11 от ръководството на потребителя AudioDeviceThread Unable to set Audiodevice Thread to realtime priority!!!This most likely results in unreliable playback/capture and lots of buffer underruns (== sound drops).In the worst case the program can even malfunction!Please make sure you run this program with realtime privileges!!! Не може да се зададе приоритет Реално Време на нишката на АудиоУстройството!!! Това най-вероятно ще доведе до нестабилно просвирване/запис и много буферни прекъсвания (==прекъсвания в звука). В по-лоши случаи работата на програмата също може да се наруши! Моля осигурете необходимия приоритет (Реално време) на програмата!!! AudioDriverConfigPage System default Системен Драйвер Form Форма Driver Selection Избор на Драйвер: Driver: Драйвер: Configure driver Конфигурирай Драйвера <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Duplex mode:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Defines if both the Playback and Capture buses </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">of your soundcard are to be used, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">or only the Playback or Capture bus(es).</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Дуплкс режим:</span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Определя дали и двата буса - за Запис и ВЪзпроизвеждане </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">на вашата карта ще се използват, </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">или само единия от тях.</p></body></html> Duplex mode Дуплекс режим Full Пълен Playback Просвирване Capture Запис <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Sample rate:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The sample rate used by the audio card.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">New projects will use this samplerate as </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">the project's sample rate on creation.</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Семплираща честота:</span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Семплиращата честота, която картата използва.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Новите проекти ще използват тази семплираща честота </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">като семплираща честота на проекта при създаването му.</p></body></html> Sample rate Семплираща честота 22050 22050 32000 32000 44100 44100 48000 48000 88200 88200 96000 96000 <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Buffer latency:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The latency introduced by the size of the audio buffers.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Some people need low latencies, if you don't need it, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">or don't know what it means, please leave the default setting!</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Закъснение на Буфера:</span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Закъснението представено от размера на аудио буфера.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Някои хора имат нужда от малко закъснение, ако вие нямате нужда, </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">или не знаете какво означава това, моля оставете стойноста по подразбиране!</p></body></html> Buffer latency (ms) Закъснение на Буфера Restart Driver Рестартиране на Драйвер Jack Jack Enable Jack transport control Разреши Jack transport control AudioSourcesManagerWidget Form Форма Remove sources Премахни източник Remove source Премахни източници Remove all sources Премахни всички източници Remove unused sources Премахни неизползваните източници AudioSources Аудио източници BehaviorConfigPage Form Форма Project Settings Настройки на проекта On close: При затваряне: Save Запази Ask Питай Don't save Не запазвай Load last used project at startup Зареди последно използвам проект при стартиране New Sheet Settings Number of tracks Брой тракове Audio Clip Settings Настройки на аудио клип Lock Audio Clips by default Заключвай аудио клиповете по подразбиране Playback Settings Настройки за просвирване <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Keep the play cursor in view while playing or recording.</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Пази курсора в полезрението при запис и просвирване.</p></body></html> Scroll playback Превърти просвирване Jump Скок Stay Centered Остани в центъра Animated Анимирано Continuously adjust audio while dragging Настройвай аудиото по време на влачене BusSelectorDialog Bus Selector Избор на бус Track Трак Capture Buses Бусове за запис Channels Канали Both И двата Left Ляво Right Дясно Playback Buses Бусове за просвирване CDWritingDialog CD Writing CD запис General Options Основни настройки Write current Sheet Запиши Write all Sheets Calculate and apply normalization Изчисли и приложи нормализиране Export wav and toc files only (don't write CD) Експортирай wav и toc файлове само (не записвай CD) Burning Device Устройство за записване Number of copies Номер на копия Simulate Симулация Speed Скорост auto авто 1x 1x 2x 2x 4x 4x 8x 8x 12x 12x 16x 16x 20x 20x 24x 24x 28x 28x 32x 32x 36x 36x 40x 40x 44x 44x 48x 48x Status Състояние Information Информация Start Writing Започни Записване Abort Прекрати Close Затвори ClipSelection Selection: Remove Clip Селекция: Премахни Клип Selection: Add Clip Селекциа: Добави Клип Select Clip Селектирай Клип ClipsViewPort Import %n audiofile(s) Вмъкни %n аудио файл(ове) Crop AudioClip: Magnetic Cut Curve There is allready a node at this exact position, not adding a new node Вече има точка точно на тази позиция, не се добавя нова Add CurveNode Добави Точка на кривата Remove CurveNode Премахни Точка на кривата CurveView Drag Node Влачи Точка Clear Nodes Изчисти Точка Dialog Dialog Диалог OK ОК Cancel Откажи DigitalClock Digital Clock Цифров часовник DriverInfo Change Audio Device settings Промени настройките на Аудио Устройството ExportDialog Export Експортирай General Options Основни Настройки Export current Sheet Експортирай настоящ Sheet Export all Sheets Експортирай всички Плотове Export directory Експортирай Директория Export status Статус на Експортиране - - Abort Export Прекрати Експортиране Start Export Започни Експортиране Close Затвори ExportFormatOptionsWidget Best Най-високо High Високо Medium Средно Fast Бързо Bitrate Битрейт Average Bitrate Среден Битрейт Maximum Bitrate Максимален Битрейт Export Format Options Настройки на формата за експортиране Format Options Настройки на формата Encoding Кодиране File Type Тип Файл Channels Канали Normalize Audio Нормализирай Аудио Bitdepth Bitdepth WavPack options (lossless compression) WavePack настройки (компресия без загуба) Compression type Вид компресия <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This option reduces the storage of some floating-point data files by up to about 10% by eliminating some information that has virtually no effect on the audio data. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">While this does technically make the compression lossy, it retains all the advantages of floating point data (&gt;600 dB of dynamic range, no clipping, and 25 bits of resolution). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This also affects large integer compression by limiting the resolution to 24 bits.</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Тази опция намалява размера на някой файлове с плаваща запетая до 10% чрез елиминиране на определена информация която на практика няма отношение към качеството на звука.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Макар че технически това вече излиза от рамките на компресията без загуба, остават всички предимства на плаващата запетая, (&gt;600 dB динамика, без клипиране , 25 битова резолюция). </p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Това също оказва влияние на голямата компресия с цели числа, като ограничава резолюцията до 24 бита.</p></body></html> Skip WVX for extra compression (semi-lossless) Пропусни WVX за допълнителна компресия Ogg Options Ogg настройки Quality (Smallest <-> Best) Качество (По-малък <-> По-добър) Encoding Method Метод на енкодинг MP3 Options Mp3 настройки Minimum Bitrate Минимален битрейт Quality (Fastest <-> Best) Качество (По-бързо <-> По-добро) Sample Rate Семплираща честота Conversion quality Качество на преобразуването ExternalProcessingDialog You have to supply an argument before starting the external process! Трябва да подадете аргумент преди да стартирате външен процес! Program <b>%1</b> crashed! Програмата <b>%1</b> прекъсна! Available arguments for the sox program Налични аргументи за sox програмата Program <b>%1</b> not installed, or insufficient permissions to run! Програмата <b>%1</b> не е инсталирана, или няма достатъчно позволения да се стартира! FadeBend Fade In: bend Засилване: извивка Fade Out: bend Затихване: извивка FadeCurve Fade Preset Настройки на Засилване / Затихване FadeMode Fade In: shape Засилване: форма Fade Out: shape Затихване: форма FadeRange Fade In: length Засилване: дължина Fade Out: length Затихване: дължина Fade In: remove Засилване: премахни Fade Out: remove Затихване: премахни FadeStrength Fade In: strength Засилване: сила Fade Out: strength Затихване: сила FileWidget My Computer Моя Компютър My Documents Моите Документи Parent Directory Горна Директория Refresh File View Опресни изгледа с файлове Import Import Audio File Вмъкни Аудио Файл Insert Silence Вмъкни Тишина Silence Тишина All files (*) Всички файлове(*) Audio files (*.wav *.flac *.ogg *.mp3 *.wv *.w64) Аудио файлове(*.wav *.flac *.ogg *.mp3 *.wv *.w64) Import audio source Вмъкни аудио източник ImportClipsDialog Import Audio Clips Вмъкни Аудио Клипове Import to Track: Вмъкни в Трак: Add Markers Добави Маркери InputEngine Modifier key actions are not supported from Context Menu Действията на определящите клавиши не се поддържат от контекстното меню Hold actions are not supported from Context Menu Действията със задържане на се поддържат от контекстното меню Command Plugin %1 not found! Командна Добавка %1 не бе намерена! Plugin %1 doesn't implement Command %2 Добавка %1 не поддържа Команда %2 InsertSilenceDialog Insert Silence Вмъкни Тишина Insert Silence (seconds): Вмъкни Тишина (секунди) Interface History История Resources Bin Място за ресурси Correlation Meter Корелационен Индикатор FFT Spectrum FFT спектър Traverso %1 (built with Qt %2) A multitrack audio recording and editing program. Look in the Help menu for more info. Traverso is brought to you by R. Sijrier and others, including all the people from the Free Software world who contributed the important technologies on which Traverso is based (Gcc, Qt, Xorg, Linux, and so on) Traverso %1 (със Qt %2)Многотракова програма за запис и обработка на аудио.Вижте Помощното меню за повече информация.Traverso е реализиран от R. Sijrier и други,включително всички хора от Free Software worldкоито спомогнаха с технологиите, на които Traverso е базиран (Gcc, Qt, Xorg, Linux, и т.н.) About Traverso За Traverso &Project &Проект &New... &Нов... &Open... &Отвори... &Save &Запази &Manage Project... &Управление на Проект &Export... &Експорт &CD Writing... &CD запис &Restore Backup... &Въстанови резервно копие &Quit &Изход &Edit &Редакция Undo Стъпка назад Redo Стъпка напред Import &Audio... Вмъкни &Аудио Insert Si&lence... Вмъкни Ти&шина &Snap &Захващане Snap items to edges of other items while dragging. Захвани обекта за краищата на други обекти при влачене. S&croll Playback Пр&евърти просвирване Keep play cursor in view while playing or recording. Пази курсора в полезрението при запис и възпроизвеждане &Show Effects &Покажи Ефекти Show effect plugins and automation curves on tracks Покажи линията на добавките и автоматизацията на траковете &View &Покажи Marker Editor... Редактор на маркери Transport Console Конзола за управление Project Проект Edit Редакция System Information Информация за Системата &Sheet &Плот New &Sheet(s)... Нов &Плот(ове) New &Track(s)... Нов &Трак(ове) Se&ttings На&стройки &Recording File Format Файлов Формат за &Запис &Resample Quality Качество на &Ресемплиране Best Най-добро High Високо Medium Средно Fast Бързо &Preferences... &Настройки &Help &Помощ &Getting Started &В Началото &User Manual &Ръководство на потребителя &About Traverso &Отностно Traverso <b>Description</b> <b>Описание</b> <b>Key Sequence</b> <b>Последователност клавиши</b> Open Audio Files Отвори Аудио Файлове Audio files (*.wav *.flac *.ogg *.mp3 *.wv *.w64) Аудио файлове(*.wav *.flac *.ogg *.mp3 *.wv *.w64) %1: %2 %1: %2 Opening User Manual in external browser! Отваря Ръководство на Потребителя във външа програма Traverso - Important Traverso - Важно A Project directory changed outside of Traverso. This is NOT supported! Please undo this change now! If you want to rename a Project, use the Project Manager instead! Директотията на проекта е променена извън Traverso Това НЕ СЕ поддържа! Моля отменете промените сега! Ако искате да преименувате Проект, използвайте Управление на Проект! Traverso - Project load failed Traverso - Зареждането на проект е неуспешно The requested Project `%1` could not be loaded for the following reason: '%2' You will now be given a list of available backups (if any) to restore the Project from. Проекта '%1' не може да се зареди поради следните причини: '%2' Сега ще видите списък с наличните резервни копия (ако има такива) за да възстановите Проекта от тях. Changed encoding for recording to %1 Кодирането на записа е сменено на %1 Changed resample quality to: %1 Качеството на ресемплиране променено на: %1 JackDriver Jack Driver: Couldn't connect to the jack server, is jack running? Jack драйвер: Не може да се осъществи връзка с jack сървър, стартиран ли е jack? Jack Driver: Connected successfully to the jack server! Jack драйвер: Връзката със Jack сървъра е успешна! KeyboardConfigPage No description set for this keymap Не е дадено описание за този киймап KeyMap Export Експортиране на киймап The exported keymap can be found here: %1 Експортирания киймап може да бъде намеррен тук %1 Form Форма Configure Keyboard Конфигурация на клавиатурата <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Double fact timeout:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The maximum time in miliseconds between 2 key presses </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">to determine if the 2 key presses are a double fact ( &lt;&lt; K &gt;&gt; or &lt;&lt; KK &gt;&gt;)</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> or 2 individual key presses ( a &lt; K &gt; and &lt; K &gt; action, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">or &lt; KK &gt; and &lt; KK &gt; action for example).</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Experienced users can set this value as low as 150 ms, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">if you don't have much experience yet, please leave the default of 180 ms.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">For more information, see chapter 7: Key Actions. of the User Manual</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Прекъсване за двойно събитие:</span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Максималното време в милисекунди между две натискания на клавиш </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">за да се определи дали имаме двойно натискане ( &lt;&lt; K &gt;&gt; or &lt;&lt; KK &gt;&gt;)</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> или просто две отделни натискания на клавиш ( a &lt; K &gt; and &lt; K &gt; action, </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">или &lt; KK &gt; и &lt; KK &gt; събития например).</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Опитните потребители биха моглли да използват стойност до 150 мс, </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ако все още сте неопитни, моля оставете стойноста на 180 мс.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">За повече информация,вижте глава 7: Клавишни действия. в Ръководство на Потербителя</p></body></html> <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Bitstream Vera Sans; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Double fact timeout (ms)</p></body></html> <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Bitstream Vera Sans; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Прекъсване за двойно събитие: (мс)</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Hold timeout:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The maximum time to consider a pressed key a hold key fact, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">like [ K ] or [ KK ].</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The shorter this time, the sooner a pressed key will be </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">detected as a hold action. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Experienced users can set this value as low as 110 ms, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">if you don't have much experience yet, please leave the default of 150 ms.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">For more information, see chapter 7: "Key Actions" of the User Manual.</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Прекъсване за задържане на клавиш:</span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Максималното време, за да се отчете задържане на клавиш, </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">като [ K ] или [ KK ].</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Колкото по-малко е времето, толкова по-бързо едно натискане </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">може да се определи като задържане. </p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Опитните потребители биха моглли да използват стойност до 110 мс, </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ако все още сте неопитни, моля оставете стойноста на 150 мс.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">За повече информация,вижте глава 7: Клавишни действия. в Ръководство на Потербителя.</p></body></html> <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Bitstream Vera Sans; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Hold timeout (ms)</p></body></html> <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Bitstream Vera Sans; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Прекъсване за задържане на клавиш (мс)</p></body></html> Keymap Киймап Select keymap Избери Киймап Export Keymap Експортирай Киймап Print Keymap Принтирай Киймап LanguageName English The name of this Language, e.g. German would be Deutch Английски MarkerDialog Markers Маркери Position Позиция Title Заглавие Options Настройки ISRC: ISRC: Apply to all Приложи за всички ... ... Pre-Emphasis Пре- наблягане Copy protection Защита против копиране Position: (MM:SS:75ths) Позиция: (ММ:СС:75ни) CD-Text CD Text Title: Заглавие: Performer: Изпълнител: Composer: Композитор: CD-Text optional CD-Текст незадължително Songwriter Автор на песента Arranger: Аранжьор: Message: Съобщение: &Remove &Премахни &Export &Експортирай &Ok &Ок &Cancel &Отмени MoveClip Copy Clip Копирай Клип Move Clip Мести Клип Move Clip To Start Премести Клип В Началото Move Clip To End Премести Клип В Края Fold Sheet Разгъни Плот Fold Track Разгъни Трак Fold Markers Разгъни Маркери MoveEdge Move Clip Edge Мести Край на Клип NewProjectDialog You must supply a name for the project! Трябва да дадете име на проекта! Traverso - Question Traverso - Въпрос The Project "%1" already exists, do you want to remove it and replace it with a new one ? Проекта %1 вече съшествува, искате ли да го премахнете и замените с нов? Yes Да No Не Couldn't create project (%1) Не може да се създаде проект (%1) Open Audio Files Отвори Аудио Файл Audio files (*.wav *.flac *.ogg *.mp3 *.wv *.w64) Аудио файлове(*.wav *.flac *.ogg *.mp3 *.wv *.w64) New Project Нов Проект Name Име Description Описание Engineer Инженер Import Audio Files Вмъкни Аудио Файлове Empty Project Прасен Проект ... ... Track Name Име на Трак File Файл Copy files to project directory Копирай файлове в проектната директория Number of Sheets Номер на Плотове Tracks per Sheet Тракове в Плот Use Template Използвай шаблон NewSheetDialog I can't create a new Sheet if there is no Project loaded!! Не може да се създава нов Плот ако не е зареден Проект! Added %n Sheet(s) Добавени %n Плот(а) New Sheet(s) Нов Плот(ове) New Sheet name Име на Нов Плот Sheet count Брой Плотове Track count Брой Тракове Use Template Използвай Шаблон NewTrackDialog I can't create a new Track if there is no Project loaded!! Не може да се създава нов Трак ако не е зареден Проект!! Added %n Track(s) Добавени %n Трак(а) New Track(s) Нов Трал Track name Име на Трак Track count Брой Тракове OpenProjectDialog <p>Project directory name <b>%1</b> is different from the Project title <b>%2</b>!</p><p>Did you rename the Project directory ? </p><p>Please rename the directory back to the Project title <b>%1</b>, and change the Project title with the Project Manager Dialog!</p> <p>Името на директорията на проекта <b>%1</b> е различно от името на Проекта <b>%2</b>!</p><p>Преименували ли сте проектната директория ? </p><p>Моля преименувайте директорията отново с името на Проекта <b>%1</b>, и променете заглавието на Проекта чрез диалога за Управление на Проекти!</p> Description: Описание: Created on: Създаден на: No Project selected! Няма избран Проект! Select a project and click the 'Load' button again Изберете Проект и кликнете бутона "Зареди" отново Project %1 does not exist, did you rename or remove the directory what that name ? Проект %1 не съществува, преименували ли сте или изтривали директория с това име? You must supply a name for the project! Трябва да дадете име на проекта! Project does not exist! (%1) Проекта не съществува! (%1) Traverso - Question Traverso - Важно Are you sure that you want to remove the project %1 ? It's not possible to undo it ! Сигурни ли сте, че искате да премахнете проекта %1? Това действие не може да се отмени! Choose an existing or create a new Project Directory Изберете съществуваща или създайте нова директория за Проекта Traverso - Warning Traverso - Предупреждение This directory is not writable by you! Не можете да записвате в тази директория! Please check permission for this directory or choose another one: %1 Моля, проверете за тази директория или изберете друга: %1 Unable to create Project directory! Не може да се създаде директория за Проекта Please check permission for this directory: %1 Моля, проверете позволенията за тази директория: %1 Traverso - Information Traverso: Информация Created new Project directory for you here: %1 Създадена е нова Проектна директория за вас тук:%1 Open Project Отвори Проект Selected Project Избран Проект Load Зареди Delete Изтрий Select Project Dir Избери Проектна Дир PADriver PADriver:: PortAudio error: %1 PADriver::PortAudio грешка" %1 PADriver:: hostapi %1 was not found by Portaudio! PADriver::hostapi %1 не бе намерен от Portaudio PaDriverPage Form Форма Portaudio drivers Portaudio драйвери <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">PortAudio Driver:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The driver which should drive the PortAudio backend</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">PortAudio supports many driver backends, some of which Traverso has native support for too. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It is recommended to use Traverso's native drivers instead of using PortAudio's, however, if the native drivers give problems, you might try the ones supplied by PortAudio instead!</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">PortAudio provides transparent driver support for multiple platforms, including Windows (see the wmme, direct x and asio options), and Mac OS X (see the CoreAudio and jack options)</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">PortAudio драйвер:</span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Драйвера, който трябва да управлява Portaudio платформа</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">PortAudio поддържа много драйверни платформи, някои от които Traverso също поддържа. </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Препоръчва се да използвате драйверите на Traverso's вместо PortAudio's, но, ако имате проблеми, може да опитате PortAudio!</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">PortAudio предоставя прозрачна драйверна поддръжка вклюително , including Windows (вижте, direct x и asio възможностите), и Mac OS X (вижте CoreAudio и jack възможностите)</p></body></html> Driver Драйвер PerformanceConfigPage Form Форма Audio file buffering Буфер на Аудио Файл <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Read buffer size:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The amount of audio data that can be stored in the </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">read buffers in seconds.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The default value of 1 second should do just fine.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">However, if you're tight on memory, you can make this value lower.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If you experience buffer underruns when the hard disk bandwidth is </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(almost) saturated, or when buffer underruns happen regularly due </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">the hard disk can't keep up for some reason, you can try a larger </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">value, like 1.5 or 2.0 seconds.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Keep in mind that when using a larger buffer, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">it will take considerably more time to move (i.e. seeking) </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">the playhead to another positions, since all the buffers </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(one for each audioclip * channel count) need to be refilled!</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Размер на буфера за четене:</span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Количеството аудио информация, която може да се съхрани в </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">в буфера за четене в секунди.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Стойноста по подразбиране от 1 секунда би трябвало да работи добре.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Все пак, ако не ви достига памет, може да намалите тази стойност.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ако има прекъсвания на буфера, когато трансфера на хард диска е </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(почти) претоварен, или ако това се случва редовно, защото </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">хард диска не се справя по някаква причина, можете да опитате по голяма</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">стойност, като 1.5 или 2.0 секунди.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Имайте впредвид, че по-голям буфер </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ще предизвика чувствително забавяне (търсене) </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">при преместване на курсора на нова позиция за просвирване, тъй като всички буфери </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(един за всеки аудио клип * броя канали) трябва да се запълни отново!</p></body></html> Read buffer size (seconds) Буфер за четене (секунди) info icon икона информация Changing the buffer size only will take into effect after (re)loading a project. Промяната на размера на буфера ще име ефект след следващото зареждане на проект. Painting Рисуване <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The number of times per second at which the Graphical</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Items are repainted during a jog action, like moving an</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">AudioClip, or changing the Gain.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The default frames per second of 35 is a perfect compromise </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">between smooth painting, and low cpu usage.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">However, if you find the painting to be not smooth enough,</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">change this value to a higher one, but keep in mind that it</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">will consume considerably more cpu!</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If for example moving an AudioClip still takes to much cpu,</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">you should consider to lower this value.</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Колко пъти в секунда Графичните</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Обекти се опресняват по време на операция като преместване на</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Аудо Клип, или промяна на Усилване.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Стойноста по подразбиране от 35 е перфектен компромис </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">между гладка картина и малко натоварване на процесора.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Все пак, ако искате по-бързо опресняване,</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">задайте по-висока стойност, но имайте вредвид, че</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">това ще отнеме допълнително процесорно време!</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ако преместването на Аудио Клип все още товари много процесора,</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">би трябвало да намалите тази стойност.</p></body></html> Jog repaint speed (fps) Опресняване при опрации (fps) <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Accelerates the painting of AudioClips and Tracks by using</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">the 3D engine of your graphics card.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Depending on your graphics card and driver support, this </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">can speed up painting considerably!</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Оптимизира визуализирането на Аудио клипвете и Траковете като използва</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 3D машината на вашата графична карта.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">В зависимост от вашата графична карта и драйвер, това </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">може чувствително да ускори визуалните операции!</p></body></html> Use hardware acceleration Използвай Хардуерно оптимизиране PluginSelectorDialog Plugin Selector Избор на Добавки Add Plugin too Постави също и добавка Plugin Name Има на Добавка Type Тип In/Out Вход/Изход OK ОК Cancel Отмени ProgressToolBar Importing file %1 of %2: %p% Вмъква файл %1 от %2: %p% Progress Toolbar Лента за прогреса Project Cannot create dir %1 Не може да се създаде директория %1 Created new Project %1 Създаден е нов Проект %1 Project %1: Cannot open project.tpf file! (Reason: %2) Проект %1: Не може да се отвори project.tpf файл! (Причина: %2) Project %1: Failed to parse project.tpf file! (Reason: %2) Проект %1: Не може да се интерпретира project.tpf файл! (Причина: %2) Project File Version does not match, unable to load Project! Версията на Проектния файл не съвпада, не може да се зареди проекта! Project %1 loaded Проект %1 е зареден Couldn't open Project properties file for writing! (File %1. Reason: %2) Не може да се пише в Проектния файл с настройки(Файл %1, Причина: %2) Project %1 saved Проект %1 е запазен. Project with title '%1' allready exists, not setting new title! Проект с име '%1' вече съществува, не е зададено ново име! Project directory %1 no longer exists, did you rename it? Shame on you! Please undo that, and come back later to rename your Project... Проектната директория %1 не съществува, случайно да сте я преименували? Как не ви е срам! Отменете това и после се върнете пак да преименувате Проекта... Traverso - Information Traverso: Информация Project title changed, Project will to be reloaded to ensure proper operation Името на проекта е променено, Проекта трябва да се презареди за правилна работа Sheet %1 added Плот %1 добавен Sheet '%1' doesn't exist! Плот '%1' не съществува! Remove Sheet %1 Премахни Плот %1 Export already in progress, cannot start it twice! Експортирането вече тече, не можете да го стартирате два пъти! Unable to create export directory! Please check permissions for this directory: %1 Не може да се създаде директория за експорт! Моля проверете позволенията за тази директория: %1 Detected clipping in exported audio! (%1) Засечено е клипиране (твърде високо ниво) в експортираното аудио!(%1) calculated norm factor: %1 изчислен фактор за нормализиране: %1 You're still recording, please stop recording first to be able to exit the application! Все още записвате. Моля спрете записа, за да можете да излезете от програмата! ProjectConverter Project file with version %1 cannot be converted, only files with version 2 can! Проектен файл със версия %1 не може да се конвертира, само файлове с версия 2 могат! Project %1: Failed to parse project.tpf file! (Reason: %2) Проект %1: Не може да се интерпретира project.tpf файл! (Причина: %2) Starting to convert Project from version 2 to version 3 Започва конвертиране от версия 2 към версия 3 Converting project.tpf file..... Done! Конвертира project.tpf файл.....Готово! <b>Need to convert %1 files</b> Трябва а се конвертират %1 файла Couldn't open Project properties file for writing! (File %1. Reason: %2) Не може да се пише в Проектния файл с настройки(Файл %1, Причина: %2) Project %1 converted Проект %1 конвертиран Saving converted project.tpf file.... Done! Записва конвертирания project.tpf файл.....Готово! Conversion finished succesfully Конвертирането завърши успешно No conversion description available! Няма налично описание за конвертиране! Conversion stopped on user request, you can continue to use this Project with Traverso <= 0.41.0, or reopen it with this version of Traverso and start the conversion again Конвертирането е спряно от потребителя, можете да продължите да използвате проекта със Traverso <= 0.41.0, или да го отоврите отново с тази версия на Traverso и да стартирате конвертирането отново ProjectConverterDialog Project Converter Конвертиране на Проекти Project XXX (no translation needed) Проект XXX (няма нужда от превод) Conversion information Информация за конвертиране Conversion progress Напредък на конвертиране Start conversion Започни конвертиране Stop conversion Спри конвертиране Load Project Зареди Проект Close Затвори ProjectInfoWidget Project Information Widget Приспособлени за Проектна Информация Bitdepth Битове - - Rate Честота Songs Песни Project Проект ProjectManager Save Project Запази Проект Do you want to save the Project before quiting? Искате ли да запазите Проекта преди излизане от програмата? Project %1 already exists! Проект %1 вече съществува! Unable to create new Project %1 Не мжое да се създаде нов Проект %1 Unable to load Project %1 Не може да се зареди Проект %1 No Project to save, open or create a Project first! Няма Проект за запазване, отворете или създайте нов първо! Choose a directory to store your Projects in Изберете директория за съхраняване на Проекта Traverso - Warning Traverso - Предупреждение No directory was selected, to retry open the 'Open Project Dialog' and click 'Select Project Directory' button Не е избрана директория, за да опитате отново, отворете диалога "Отвори Проект" и кликнете "Избери Проектна Директория" This directory is not writable by you! Вие не можете да записвате в тази директория! Please check permission for this directory or choose another one: %1 Моля, проверете позволенията за тази директория или изберете нова: %1 Using existing Project directory: %1 Използва настоящата Проектна директория: %1 Unable to create Project directory! Не може да се създаде директория за Проекта! Please check permission for this directory: %1 Моля, проверете позволенията за тази директория: %1 Created new Project directory for you here: %1 Създадена е нова Проектна директория за вас тук:%1 Project %1 no longer could be found! (Did you remove or rename the Project directory ?) Проект %1 вече не може да бъде намерен! Изтривали ли сте или преименували Проектната директория? Default Project created by Traverso Проект по подразбиране, създаден от Traverso Could not rename Project directory to %1 Не може да се преименува Проектната директория на %1 Projectfile backup: The project file %1 could not be opened for reading (Reason: %2) Резервно копие на проектен файл %1 не може да се отвори за четене! (Причина: %2) Cannot create dir %1 Не може да се създаде директория %1 ProjectManagerDialog No new Sheet name was supplied! Не е зададено име на нов Плот! Save Template Запази Шаблон Enter Template name Впишете име на Шаблон Unable to create directory %1! Не може да се създаде директория %1! Traverso - Information Traverso: Информация Template with name %1 already exists! Do you want to overwrite it? Шаблон с име %1 вече съшествува! Искате ли да го замените? Saved Project Template: %1 Запазен е Проектен Шаблон: %1 Couldn't open file %1 for writing! Не може да се отвори файл %1 за писане! Project with title '%1' allready exists, please supply a different title! Проект с име '%1' вече съществува, моля изберете друго име! Dialog Диалог Project Проект Informational Информационно Title Име Description Описание Engineer Инженер Export Експортиране Sheet(s) Плот(ове) Template Шаблон Sheets Плотове Sheet Name Име на Плот Tracks Тракове Length Дължина Selected Sheet Избран Плот Delete Изтрий Rename Преименувай New Sheet Нов Плот Create new Sheet Създай нов Плот CD Text CD текс Performer Изпълнител Disc ID: Диск ID: UPC EAN: UPS EAN: Genre: Жанр: Unused Неизползвано Undefined Недефинирано Adult Contemporary Adult Contemporary Alternative Rock Alternative Rock Childrens Childrens Classical Classical Contemporary Christian Contemporary Christian Country Country Dance Dance Easy Listening Easy Listening Erotic Erotic Folk Folk Gospel Gospel Hip Hop Hip Hop Jazz Jazz Latin Latin Musical Musical New Age New Age Opera Opera Operette Operette Pop Music Pop Music Rap Rap Reggae Reggae Rock Music Rock Music Rhythm and Blues Rhythm and Blues Sound Effects Sound Effects Spoken Word Spoken Word World Music World Music Arranger Аранжьор Songwriter Автор на песента Message Съобщение <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Undo last change</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Отмени последната промяна</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Redo last change</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Направи отново последната промяна</p></body></html> undotext отменитекст redotext възстановитекст QObject AudioClip АудиоКлип Curve Крива CurveNode Точка на Крива FadeCurve Крива Усилване/Затихване No error occurred Не са костатирани грешки An error occurred when reading from the file. Грешкам при четене от файла. An error occurred when writing to the file. Грешка при писане във файла. A fatal error occurred. Фатална грешка. The file could not be opened. Файла не мжое да се отвори. Resourc error Ресурсна грешка The operation was aborted. Операцията бе прекратена A timeout occurred. Превишаване на времето. An unspecified error occurred. Неопределена грешка. The file could not be removed. Файла не може да се премахне. The file could not be renamed. Файла не може да се преименува. The position in the file could not be changed. Позицията във файла не може да се промени. The file could not be resized. Файла не може да се оразмери. The file could not be accessed. Файла е недстъпен. The file could not be copied. Файла не може да се копира. Unknown error Непозната грешка. Marker маркер Sheet Плот TimeLine Времева линия Track Трак QuickStartDialog Traverso: Getting Started Traverso: В началото <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"><span style=" font-size:18pt; font-weight:600;">Traverso: Getting Started</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">When you record or import an audio file into Traverso, it shows up as an Audio Clip in one of the horizontal Tracks in the current Sheet. You can edit many aspects of these Clips by placing the mouse pointer over a Clip and pressing or holding different keys on your keyboard and mouse. You can also change settings of a Track, the Sheet as a whole, and other objects in the Sheet.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">To see a list of what commands are available for any given object in the Sheet, move the mouse over that object, and Right-Click (or press Q). The keyboard shortcuts for each command are shown in the menu. The notation used is shown below.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; K &gt; </span> means press and release the K key. (Like a click.)</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"><span style=" font-weight:600;">&lt;&lt; K &gt;&gt;</span> means press the K key two times fast. (Like a double click.)</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ K ]</span> means drag the mouse while holding down the K key.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; KL &gt; </span> means press the K and L keys at the same time.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ KL ] </span> means drag the mouse while holding down the K and L keys at the same time.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">Here are some basic commands:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; SPACE &gt;</span> is Play/Stop.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; SHIFT &gt;</span> sets the Playhead. (Blue vertical line where playing starts.)</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; W &gt;</span> sets the Work Cursor. (Red vertical line.)</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; V &gt; </span> moves the Playhead back to the Work Cursor.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ D ] </span> move objects around (Audio Clip, Curve Nodes, etc)</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ Z ]</span> zooms in and out.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ TAB ]</span> scroll omnidirectional (aka Shuttle) </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">And some Audio Clip Commands:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ E ] </span> drags a Clip's left or right edge.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ F ]</span> adjusts the length of a Clip's Fade In / Fade Out.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ G ] </span>addust the Gain of a clip (also works on Tracks, Sheet)</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; X &gt;</span> splits the Clip at the cursor's position.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">For more information, right-click on everything, or check out the Traverso manual.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"><span style=" font-size:18pt; font-weight:600;">Traverso: В началото</span></p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">Когато записвате или вмъквате аудио в Traverso, се показва АудиоКлип в един от хоризонталните Тракове в настоящия Плот. Вие можете да редактирате много аспекти на тези Клипове като поставите курсора на мишката върхи Клипа и натиснете или задържите определени клавиши на вашата клавиатура или мишка. Можете също да променяте настройките на Трака, на Плота като цяло, и на останалите обекти на Плота.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">За да видите списък с командите, които са налични за определен обект на Плота, преместете мишката върху този обект, и кликнете с Десен бутон (или натиснете Q). Клавишните комбинации за всяка команда са изписани в менюто. Системата за обозначаване е както следва.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; K &gt; </span>означава натискане и пускане на клавиша К. (Като кликване.)</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"><span style=" font-weight:600;">&lt;&lt; K &gt;&gt;</span> означава натискане и пускане на клавиша К бързо двда пъти. (Като двойно кликване.)</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ K ]</span> означава влачете с мишката, докато задържате клавиша K.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; KL &gt; </span> означава натиснете K и L едновременно.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ KL ] </span>означава влачете с мишката, докато задържате клавишите K и L едновременно.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">Ето някои основни команди:</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; SPACE &gt;</span> е Свири/Спри.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; SHIFT &gt;</span> наглася курсора за Просвирване. Синята вертикална линия от която започвав просвирването.)</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; W &gt;</span> наглася Работния курсор. (Червената вертикална линия.)</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; V &gt; </span> придвижва Курсора за просвирване обратно към Работния курсор.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ D ] </span> мести обекти (Аудио Клипове, Точки на Кривата, и др.)</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ Z ]</span> увеличава и намаля.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ TAB ]</span> превърта разнопосочно (също известно и като режим Совалка) </p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">И някои команди за Аудио Клип:</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ E ] </span> премества левия или десния край на клипа.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ F ]</span> наглася дължината на затихването/усилването в края/началото на клипа.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ G ] </span>наглася силата на клипа работи също и за Трак, Плот)</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; X &gt;</span> разделя клипа в позицията на курсора.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">За повече информация, кликвайте с десен бутон на всичко, или се консултирайте с Ръководство на Потербителя.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p></body></html> ReadSource Silence Тишина Could not open file Не мжое да се отвори файл Invalid channel count Невалиден брой канали File has zero channels Файла има нула канала The file does not exist! Файла не съществува No ReadSource error set No ReadSource error set RecordingConfigPage Form Форма Recording Записване <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">WAV</span> : A format without compression. Uses more hard disk space then compressed encoding formats, but needs very little cpu.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Limits : ~ 1.7 hours of recording time @ Stereo - 44.1 KHz</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">WavPack</span> : A format with compression, up to 2 times smaller compared to WAV, and no quality loss. Uses significantly more cpu then WAV, but with modern (year 2005 and above) cpu's this shouldn't be a problem.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Using this format stresses the hard disk much less, increasing hard disk live, and less chance of saturating the hard disk bandwidth.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Limits : ~ 5 hours recording time @ Stereo - 44.1 KHz</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">WAV64</span> : WAV format with 64 bit header, support by other programs is currently limited.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Limits : None, thousands of hours of recording time, supposed that your hard disk can hold it.</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">WAV</span> :Формат без компресиране. Използва повече място от копресираните формати, но не товари процесора.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ограничения : ~ 1.7 часа записно време @ Stereo - 44.1 KHz</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">WavPack</span> : Формта с компресия, до 2 пъти по-малък в сравнение с WAV, без загуба на качество. Използва чувствително повече процесорно време от WAV, но с модерните (след 2005 година) процесори това не би трябвало да е проблем.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Използването на този формат товари много по-малко твърдия диск, увеличава живота му, и намаалява рисковете от претоварване.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ограничения : ~ 5 часа записно време @ Stereo - 44.1 KHz</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">WAV64</span> : WAV формат с 64 bit хедър, поддръжката от други програми в момента е ограничена.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ограничения : Няма, хиляди часове записно време, ако диска може да ги поеме.</p></body></html> Encoding format Формат на Кодиране WavPack options WavPack настройки Compression type Тип Копресия <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This option reduces the storage of some floating-point data files by up to about 10% by eliminating some information that has virtually no effect on the audio data. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">While this does technically make the compression lossy, it retains all the advantages of floating point data (&gt;600 dB of dynamic range, no clipping, and 25 bits of resolution). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This also affects large integer compression by limiting the resolution to 24 bits.</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Тази опция намалява размера на някои файлове с плаваща запетая до 10% чрез елиминиране на определена информация която на практика няма отношение към качеството на звука.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Макар че технически това вече излиза от рамките на компресията без загуба, остават всички предимства на плаващата запетая, (&gt;600 dB динамика, без клипиране , 25 битова резолюция). </p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Това също оказва влияние на голямата компресия с цели числа, като ограничава резолюцията до 24 бита.</p></body></html> Skip WVX for extra compression (semi-lossless) Пропусни WVX за допълнителна компресия Resampling Ресемплиране Enable on the fly resampling (Playback only) Разреши ресемплирането в реално време On the fly resample quality Качество на ресемлирането в реално време Default export resample quality Стойност по подразбиране на качеството на ресемплиране Best Най-добро High Високо Medium Средно Fast Бързо ResourcesManager ResourcesManager:: Failed to initialize ReadSource %1 (Reason: %2) ResourcesManager:: Не може да се инициализира ресурс %1 (причина: %2) ResourcesManager: Received request to remove Audio Source %1but it is still in use by %2 AudioClips!!. NOT removing it! ResourcesManager: Получена е заявка за премахване на Аудио Източник %1 но той все още се използва от %2 Аудио Клипа!! НЕ СЕ премахва! ResourcesWidget Form Форма Sources Източници Files Файлове Name Име Length Дължина Start Начало End Край RestoreProjectBackupDialog Restore from backup Въстанови от резервно копие Set the date to restore the selected backup. Задай дата за възстановяване на резервното копие Current date and time: Настоящи дата и време Last backup: Последно резервно копие - - Date Дата Time Време SettingsDialog Behavior Поведение Appearance Изглед Sound System Звукова Система Audio Options Аудио Настройки Keyboard Клавиатура Performance Производителност Preferences - Traverso Преференции - Traverso Sheet Untitled Без име No artists name set Не е зададено име на артист Add Track Добави Трак Remove Track Премахни Трак No audio to export! (Is everything muted?) Няма аудо за експорт! (Може би всичко е заглушено?) Export start frame starts beyond export end frame!! Началното време за експорт е след неговто крайно време!! Export tries to render to 0 channels wav file?? Експортирането ще доведе до файл с 0 канала?? Hard Disk overload detected! Претоварване на твърдия диск! Failed to fill ReadBuffer in time Буфера за Четене не се запълни навреме! Failed to empty WriteBuffer in time Буфер за Писане не се изпразни навреме! No Tracks armed for recording! Няма заредени за запис тракове! Recording to %n Clip(s) Записва в %n Клип(а) SongInfoWidget SongInfoWidget Инструмент за информация за песента Song Песен - - Snap Прилепване Gain Усилване SMPTE SMPTE Zoom Лупа SpectralMeterConfigWidget FFT-Spectrum Configuration Конфигурация на FFT-Спектър Frequency Range Честотен обхват Show average spectrum Покажи средния спектър Number of bands: Номер на бандове: Lower dB value: Долна db сройност: Upper dB value: Горна db стойност: Hz Hz Lower Limit: Долен Лимит: Upper Limit: Горен Лимит: Advanced FFT Options Допълнителни FFT Настройки FFT Size: FFT размер 256 256 512 512 1024 1024 2048 1048 4096 4096 8192 8192 Rectangle Правоъгълник Hanning Ханинг Hamming Хаминг Blackman Блякман Windowing function: Прозоречна функция: Advanced Допълнителни Apply Приложи &Close &Затвори SpectralMeterView Screen Capture file name Име на Екранна Снимка FFT: Unable to write captured image to hard disk FFT: Не може да за се запише получената снимка на твърдия диск FFT: No avarage curve used, not data to export! FFT: Не се използва крива за средната стойност, няма информация за експортиране FFT: Enable avarage curve with < M > to generate data FFT: Разрешете кривата за средна сотйност със < M > за да се генерира информация FFT: No avarage data to export! FFT: Няма ифнормация за средната стойност за експортиране Select output format Изберете изходен формат Output format: Изходен формат: Export average dB curve Експортирай кривата за средни db SplitClip Split Clip Раздели Клип SysInfoToolBar System Information Информация за Системата SystemInfoWidget SystemInfoWidget SystemInfoWidget Card Name (na) Card Name (na) image image buffer size (na) buffer size (na) rate rate - GB - GB drivertype (na) drivertype (na) xruns (na) xruns (na) latency (na) latency (na) - % - % bitdepth bitdepth SystemResources Read Buffer Status Състояние на Буфер за Четене Write Buffer Status Състояние на Буфер за Писане TimeLine Add Marker Добави Маркер Remove Marker Премахни Маркер TimeLineView End Край Add Marker Прибваи Маркер You have to remove all other markers first. Трябва първо да премахнете всички маркери Drag Marker Влачи Маркер Clear Markers Изчисти Маркери Track Track: AudioClip with id %1 not found in Resources database! Трак: АудиоКлипа не може да бъде намерен в базата данни! Remove Clip Премахни Клип Add Clip Добави Клип Silence Others Заглуши останалите TrackPan Track Pan: %1 Панорама на Трак: %1 Track Pan Панорама на Трал TrackView Set Track name Задай име на Трак Enter new Track name Впиши ново име на Трак Track %1: %2 Трак %1:%2 TransportConsoleWidget Skip to Start Скочи в Началото Previous Snap Position Предна Точка на Прилепване Record Запис Play / Stop Свири/Спри Next Snap Position Следваща точка на прилепване Skip to End Скочи в Края Recording to %1 Tracks, encoding format: %2 Записва в %1 Трака, формат на кодиране:%2 TraversoCommands Gain Усилване Gain: Reset Усилване: Възстанови Panorama Панорама Panorama: Reset Панорама: Възстанови Import Audio Вмъкни Аудио Insert Silence Вмъкни Тишина Copy Clip Копирай Клип New Track Нов Трак Remove Clip Премахни Клип Remove Track Премахни Трак External Processing Външна Обработка (De)Select All (Де)Селектирай Всичко Move Clip Премести Клип Drag Edge Влачи Края Move Or Resize Clip Премести и оразмери Клип Split Раздели Arm Tracks Зареди Тракове Fold Sheet Fold Track Сгъни Трак Fold Markers Сгъни Маркери Vertical In Вертикално Увеличаване Horizontal Out Хоризонтално Намаляне Horizontal In Хоризонтално Увеличаване Vertical Out Вертикално Намаляне Omnidirectional Разнопосочно Horizontal Хоризонтално Vertical Вертикално Right Дясно Left Ляво Up Горе Down Долу (De)Select Magnetic Cut traverso-0.49.4/resources/translations/traverso_cs.qm000644 001750 001750 00000617365 11430303020 023407 0ustar00remonremon000000 000000 ֍3֍p֍R֍=pC,zЎ  *@E+s+R5toEq[H5qH5_\H5֡VEJz AwGG5ٜeį] ng4dS**0Y++@++ã+q3:!W5S6S07t0%70^:+2R;0<0@@@GHw9J6UJ6̿J6GJJ,L-,LzpMNjVO$-R_RST}VlX%X+XY.jZdZkjZsMZ Z5h[ %Y)[ %&[`[2`$>aF0[aDp7Jg%b<IfY8:88wYE?x~Ũtɬ$FwڛyYSq ;$4o&q,2e*,>>`M~$H$. {Q X#Q'1{/a 5_bzejnwDN֓h4%2v w__~z rx7N^ƤƂm-vm:, . .0EmL0{m[ _CrfRqxv ez'zN‚/ee V1xR6iPΔq\<lC}D*mȺ[Qu.o.[[l:|t p>Zڑy1 .t aa'+5*i6UJ9Oy}B9JoeLoMCxngmT}dShW"+ϥϥʗ]U#˿ϸJKк9故gD4͎7^>gqCʆ \(5]8:Gţ8I 8II(^hT'l"zv:VTxn1pEPIÊI Idy1v?^i,ok,BϕImWoW7WI[4)?˅ T~-Gdjq, vvրo!sX(O^}OE`榼aYإI$EFߟnQy4UU1x u)Q$)s'~*Y]|,Nq#,N,Nm48-;;4;= \= =FCH SYcU-i`k2|~sRxu!%KH5"+jkL %.J$qЎYYtK3z#'.jɴ)N2֪*!"bu2cD ; P  eM~b^/BW mo(*K3 *)H/=/A1e?PDAZZ:6[;۲\uS]=Z]=_QZZ_Qalb#ijls{W%l SadPyJuJ !.W?zݐ|%wP );no[E?ZNRiVoO V/ܲp   JAvJJNr\Ac_:Y_:`a~3kmUnPQrUlC,<3`Za(8U%       Cd RpFZ\,`Y`?Œ!lkĠRԍխ_ '3 9 ldde""J#n9ϕ8Cc#CwDKrKKCpNdLPbPPvQ-2VQmt!sNN#UK9\)}TÛܦ}+İnycMWroL !M B 1+Y b 0 D.gQ Mg] Mg} Y [[I [ڳ ]Wq ^Q; g h>ġ N IBq .X_ *: 1E , xu 3| e- Ea Eh  몠P \p \|   . 2Y 9./ !X3 & 'nT *L =a ASl Cb LZ~1^ dp h?- h?p hс lP l[k l rD# ITF -W  n (  ʿ # vT| O ف F  o& , 1 {q!  #(m %$ߛ 0KnD 7b Ff GIX L. Q6^k ]H h).0 zC YPt YPǿ FT Kq  K im } t) M ɂeR Ӱ^- ` | T ܄~ ޤP >K T 9K e{ d ^ I  I| Y ( - * > ,Jd[B ,g` ,g` ,g`z 1 " 25%ɲ 3aM 6k 7Ie ;!uE >2 G-% N0T Q3 ? SA ^ $ _% b b ; bڅ$ iuPh t`Z t` zto ~7 ~7 ~7 Q sW  si  Ã"p _!#V xWV [Tϥ  43 )3,  @ sg ڞv5 ڞ ڞ'V ػ ߆^  ddk ]ڍ y% G 1 ^V ަ F !/rP 3Gyl 3Gy 3f 3hy 4K8 5Jh0 7vzne 7vz 8Fq 8y: =O: Q\c" RZ Zy _` `% eV<V jn nPW ql% .0d t Xy~ R .)   . s` b тk0 ͤ]  u./_csospYfv(/M=zGUc.g&sp%p<)pq/yzy%tazP|lq|ls@XPP9Pg{rNU>Gj$ir_}CuڱL-Ą9X$!O   %^"g(}dO-J.72nuc@wGxKUbfgght*y1/|>*P]b]fh"|q.y7UKb,K#-^ߠ:S&ix Odstranit ukzku Remove Clip AddRemoveClip0Odstranit vybran ukzkyRemove Selected Clips AddRemoveClip22AlsaDevicesPage33AlsaDevicesPage<html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">ZaYzen:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Pou~t skute n nebo virtualn zaYzen ALSA.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Skute nm zaYzenm je zvukov karta instalovan ve Vaaem systmu.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Virtuln zaYzen bylo vytvoYeno v souboru: .asoundrc, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> kter je  asto umstn ve Vaa domovsk slo~ce.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Jestli~e si nejste jist, pou~ijte vchoz zaYzen. Toto bude pou~ito jako zvukov zaYzen. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Konfigurovno Vaa distribuc, nebo zaYzenm, kter pojmenovv Vaai zvukovou kartu.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ve druhm pYpad se, prosm, ujistte, ~e ~dn aplikace nepou~v Vaai zvukovou kartu, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">jinak by ovlada nebyl schopen inicializovat!</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Kvoli dalam informacm si prohldnte kapitolu 3.1: "The Driver Backend - Backend (zadn  st) ovlada e" v u~ivatelsk pYru ce</p></body></html> [

Device:

The real or virtual ALSA device to be used.

A real device is the audiocard installed in your system.

A virtual device is one created in the .asoundrc file,

often located in your home folder.

If unsure, use either the default device, this will use the audiodevice

configured by your distribution, or the device that names your audio card.

In the latter case, please make sure no application uses the audiocard,

else the driver won't be able to initialize!

For more info see chapter 3.1: "The Driver Backend" of the User Manual

AlsaDevicesPage<html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;"> slo period:</span> </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Zvuk je spravovn v malch kouscch nazvanch periody. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Tato hodnota ur uje, kolik je tchto kousko, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">kter mo~e pou~t ovlada zvukov karty.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Vchoz hodnota by mla pracovat dobYe, a podv optimln chovn latence.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Bohu~el nkter ALSA ovlada e obsahujc programov chyby nepracuj korektn </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">s vchoz hodnotou 2, pokud zskte velice kostrbat zvuk, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">prosm, pokuste se pou~t hodnotu periody 3.</p></body></html>

Number of Periods:

Audio is managed in small chunks called periods.

This value determines how many of these chunks are

to be used by the driver of the audiocard.

The default should work just fine, and gives optimal latency behavior.

However, some (buggy) alsa drivers don't work correctly

with the default of 2, if you experience very choppy audio,

please try to use 3 periods.

AlsaDevicesPage b<html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Rozmalen se je vyu~vno k tomu, aby byl zvuk  istja. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Nejlepam zposobem, jak to popsat, je pYedstavit si malovn s mnoha te kami. Jestli~e se na n podvte zblzka, uvidte ka~dou te ku a obraz nen moc jasn. Jestli~e se na n budete dvat z dlky, obraz se stane jasnjam, proto~e Vaae o i/mozek nechaj te ky, aby se za aly tYst, aby se tm uhladil celkov dojem. Jde potom o nejasnou pYedlohu a zvlat pak o velmi osobn volbu, jak ur it, kter roztYesen je nejlepa. Pro vtainu lid to pYedstavuje plnou magii. Kdokoli b~c na 16bitech, jen~ se star o kvalitu nebo m nazbyt vpo etnho  asu CPU by ml pou~t "tYesen". Trojhelnkov (Triangular) je pravdpodobn nejlepam kompromisem mezi kvalitou a velikost pou~itch prostYedko (CPU) (je velmi rychl), ale tvarovan je tm nejlepam</p></body></html>

Dither is used to make the audio cleaner.

The best way to describe it is to imagine a painting with many dots. If you view it up close you can see each dot and the image is not very clear. If you view it from far away the image becomes clearer because your eyes/brain dither the dots to smooth out the image. It is a murky subject and obviously a very personal choice as to what dither is the best. For most people it is just plain magic. Anyone running at 16bit who cares about quality or has CPU cycles to spare should run with dither. Triangular is probably the best compromise of quality vs cpu cost (its very fast), but shaped is the best

AlsaDevicesPageALSA zaYzen ALSA DeviceAlsaDevicesPageZaYzenDeviceAlsaDevicesPageChvt seDitherAlsaDevicesPageFormulYFormAlsaDevicesPage }dnNoneAlsaDevicesPage slo periodyNr. of periodsAlsaDevicesPageObdlnkov RectangularAlsaDevicesPageTvarovanShapedAlsaDevicesPageTrojhelnkov TriangularAlsaDevicesPageALSA ovlada : nelze otevYt PCM zaYzen %1 pro playback. Ustoupilo se do zachytvn-pouze re~imuVALSA Driver: Cannot open PCM device %1 for playback. Falling back to capture-only mode AlsaDriverALSA ovlada : zachytvac zaYzen %1 se ji~ pou~v. Prosm, zastavte aplikaci, kter jej pou~v, a spusete Traverso znovuqALSA Driver: The capture device %1 is already in use. Please stop the application using it and run Traverso again AlsaDriverALSA ovlada : zaYzen %1 umo~Hujc playback se ji~ pou~v. Prosm, zastavte aplikaci, kter jej pou~v, a spusete Traverso znovurALSA Driver: The playback device %1 is already in use. Please stop the application using it and run Traverso again AlsaDriverALSA ovlada : neschopen konfigurovat technick vybaven po ta e. Pou~v je jin aplikace?OALSA Driver: Unable to configure hardware, is it in use by another application? AlsaDriverALSA ovlada : Namte oprvnn otevYt zvukov zaYzen %1 pro zachytvnOALSA Driver: You do not have permission to open the audio device %1 for capture AlsaDriverALSA ovlada : Namte oprvnn otevYt zvukov zaYzen %1 pro pYehrvnPALSA Driver: You do not have permission to open the audio device %1 for playback AlsaDriverALSA ovlada : snd_pcm_open(capture_handle, ...) selhalo (neznm typ chyby)MALSA Driver: snd_pcm_open(capture_handle, ...) failed with unknown error type AlsaDriverALSA ovlada : nelze otevYt PCM zaYzen %1 pro zachytvn. Ustoupilo se do pYehrvn-pouze re~imuOALSA: Cannot open PCM device %1 for capture. Falling back to playback-only mode AlsaDriverzsnd_pcm_open(playback_handle, ..) selhalo (neznm typ chyby)@snd_pcm_open(playback_handle, ..) failed with unknown error type AlsaDriver<html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Vykreslovn  asovho probhu vlny s obrysem je podrobnja, ale vy~aduje vce vkonu procesoru.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Jestli~e mte zkuaenost se zpomalenm pYi vykreslovn mnoha ukzek, nebo bhem animovanho rolovn, zruate vbr tto volby!</p></body></html>9

Painting the waveform with an outline is more detailed, but requires more cpu.

If you experience slowness when painting many clips, or during animated scroll, unselect this option!

AppearenceConfigPage*Nastavit barvu tmatuAdjust theme colorAppearenceConfigPageDostupn tmataAvailable themesAppearenceConfigPageStyl tla tek Button styleAppearenceConfigPageZmna jazyka u~ivatelskho rozhran se projev a~ po novm spuatn Traversa!RChanging the language of the Interface will take effect after restarting Traverso!AppearenceConfigPageVchoz jazykDefault LanguageAppearenceConfigPage6Nakreslit  ry na 0 a -6 dBDraw lines at 0 and -6 dBAppearenceConfigPageFormulYFormAppearenceConfigPageVelikost ikon Icon sizeAppearenceConfigPagePouze ikony Icons onlyAppearenceConfigPage8Jazyk u~ivatelskho rozhranInterface LanguageAppearenceConfigPage JazykLanguageAppearenceConfigPageDBarva pro zobrazen zvuku upravenaPaint audio rectifiedAppearenceConfigPageFBarva pro zobrazen zvuku s obrysemPaint audio with outlineAppearenceConfigPageBarva pro zobrazen stereofonnho zvuku jako u monofonnho zvuku Paint stereo audio as mono audioAppearenceConfigPage.Cesta k souborom tmatuPath to theme filesAppearenceConfigPage>Vybrat vchoz adresY projektuSelect default project dirAppearenceConfigPageVybrat styl Select styleAppearenceConfigPageVolby stylu Style OptionsAppearenceConfigPage Text pod ikonamiText below IconsAppearenceConfigPageText vedle ikonText beside IconsAppearenceConfigPagePouze text Text onlyAppearenceConfigPageTmaThemeAppearenceConfigPageVolby tmatu Theme OptionsAppearenceConfigPageVoli tmatTheme selectorAppearenceConfigPage Nstrojov liatyToolbarsAppearenceConfigPage8Velikost transportn konzoleTransport Console sizeAppearenceConfigPage:Pou~t paletu vybranho styluUse selected style's paletteAppearenceConfigPageAktivovat stopy Arm Tracks ArmTracks|Zvukov zaYzen nem tuto zachytvac sbrnici: %1 (Stopa %2)8AudioDevice doesn't have this Capture Bus: %1 (Track %2) AudioClipNormalizace Normalization AudioClip&Odstranit prolnn Remove Fades AudioClip8Nastavit roveH normalizace:Set Normalization level: AudioClip"PYepnout uzam en Toggle Lock AudioClip"PYepnout ztlumen Toggle Mute AudioClip6Neschopen nahrvat do stopyUnable to Record to Track AudioClip&Vchoz&DefaultAudioClipEditDialog&Linern&LinearAudioClipEditDialogOhbnBendingAudioClipEditDialog Parametry ukzkyClip ParametersAudioClipEditDialog DialogDialogAudioClipEditDialog KonecEndAudioClipEditDialog"Vnja zpracovnExternal ProcessingAudioClipEditDialog2Postupn zeslen signluFade InAudioClipEditDialog2Postupn slbnut signluFade OutAudioClipEditDialogProlnnFadesAudioClipEditDialogZeslenGainAudioClipEditDialog DlkaLengthAudioClipEditDialog Re~imModeAudioClipEditDialog NzevNameAudioClipEditDialogSlaStrengthAudioClipEditDialog Textov jmenovka TextLabelAudioClipEditDialogZa t stopu Track startAudioClipEditDialoghh:mm:ss.sss hh:mm:ss.sssAudioClipEditDialog2Ukzka: vnja zpracovnClip: External ProcessingAudioClipExternalProcessing(Vbr: pYidat ukzkuSelection: Add ClipAudioClipManager"Vbr: invertovatSelection: InvertAudioClipManager.Vbr: odstranit ukzkuSelection: Remove ClipAudioClipManagerfVaechny soubory (*);;Zvukov soubory (*.wav *.flac))All files (*);;Audio files (*.wav *.flac) AudioClipViewjKlepnout, aby mohl bt zvukov soubor znovu nastaven!Click to reset AudioFile ! AudioClipView4Nebyl vybrn ~dn soubor!No file selected! AudioClipViewXZnovu nastavit zvukov soubor pro ukzku: %1Reset Audio File for Clip: %1 AudioClipViewjSoubor se zvukovou ukzkou byl span nastaven na %1$Succesfully set AudioClip file to %1 AudioClipViewZvukov zaYzen:: bylo zjiatno 'Storm' podte en vyrovnvac pamei. PYepn se na nulov ovlada HAudioDevice:: Buffer underrun 'Storm' detected, switching to Null Driver AudioDeviceZvukov zaYzen:: Kvoli zvad zposobujc tento problm, si, prosm, prohldnte kapitolu 11 u~ivatelsk pYru ky!\AudioDevice:: For trouble shooting this problem, please see Chapter 11 from the user manual! AudioDevicezZvukov zaYzen: doalo k selhn pYi vytvYen ovlada e ALSA-Audiodevice: Failed to create the ALSA Driver AudioDeviceZvukov zaYzen: doalo k selhn pYi vytvYen ovlada e CoreAudio2Audiodevice: Failed to create the CoreAudio Driver AudioDevicezZvukov zaYzen: doalo k selhn pYi vytvYen ovlada e Jack-Audiodevice: Failed to create the Jack Driver AudioDeviceZvukov zaYzen: doalo k selhn pYi vytvYen ovlada e PortAudio2Audiodevice: Failed to create the PortAudio Driver AudioDeviceZvukov zaYzen: doalo k selhn pYi vytvYen ovlada e PulseAudio3Audiodevice: Failed to create the PulseAudio Driver AudioDevice@Nebylo uzposobeno ~dn zaYzenNo Device Configured AudioDevice4Nebyl nahrn ~dn ovlada No Driver Loaded AudioDevice2Jack server byl zastaven!"The Jack server has been shutdown! AudioDeviceNeschopen nastavit vlkno zvukovho zaYzen na prioritu provdn v relnm  ase! Toto je vtainou vsledkem nespolehlivho zaYzen umo~Hujc pYehrvn/zachytvn a mnoha podte en vyrovnvac pamei (== poklesy zvuku - sound drops). V nejhoram pYpad mo~e dokonce dojt k selhn programu! Prosm, ujistte se, ~e tento program spouatte s privilegiem provdn v relnm  ase!Unable to set Audiodevice Thread to realtime priority!!!This most likely results in unreliable playback/capture and lots of buffer underruns (== sound drops).In the worst case the program can even malfunction!Please make sure you run this program with realtime privileges!!!AudioDeviceThread 2205022050AudioDriverConfigPage 3200032000AudioDriverConfigPage 4410044100AudioDriverConfigPage 4800048000AudioDriverConfigPage 8820088200AudioDriverConfigPage 9600096000AudioDriverConfigPage <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> <span style=" font-weight:600;">Latence vyrovnvac pamei:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Latence pYedstavovan velikost zvukov vyrovnvac pamei.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NkteY lid potYebuj nzk latence. Jestli~e toto nepotYebujete, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">nebo nevte, co to znamen, prosm, opusete za ponechn vchozho nastaven!</p></body></html>`

Buffer latency:

The latency introduced by the size of the audio buffers.

Some people need low latencies, if you don't need it,

or don't know what it means, please leave the default setting!

AudioDriverConfigPage~<html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;"> Duplexn re~im:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">PYesn stanovuje, jestli jsou pou~vny ob sbrnice, pYehrvn a zachycen, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Vaa zvukov karty sou asn, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">nebo pouze sbrnice pYehrvn nebo pouze zachycen.</p></body></html>

Duplex mode:

Defines if both the Playback and Capture buses

of your soundcard are to be used,

or only the Playback or Capture bus(es).

AudioDriverConfigPage<html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Vzorkovac kmito et:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Vzorkovac kmito et pou~van zvukovou kartou.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Nov projekty budou pou~vat tento vzorkovac kmito et jako </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">svoj vzorkovac kmito et pYi svm vytvoYen.</p></body></html>'

Sample rate:

The sample rate used by the audio card.

New projects will use this samplerate as

the project's sample rate on creation.

AudioDriverConfigPage>Latence vyrovnvac pamti (ms)Buffer latency (ms)AudioDriverConfigPageZachytvnCaptureAudioDriverConfigPage&PYizposobit ovlada Configure driverAudioDriverConfigPageVbr ovlada eDriver SelectionAudioDriverConfigPageOvlada :Driver:AudioDriverConfigPagedDuplexn re~im (umo~Hujc komunikaci obma smry) Duplex modeAudioDriverConfigPage@Povolit Jack transportn ovlada Enable Jack transport controlAudioDriverConfigPageFormulYFormAudioDriverConfigPagePlnFullAudioDriverConfigPageJackJackAudioDriverConfigPagePYehrvnPlaybackAudioDriverConfigPage*Znovu spustit ovlada Restart DriverAudioDriverConfigPage&Vzorkovac kmito et Sample rateAudioDriverConfigPage2Vchoz nastaven systmuSystem defaultAudioDriverConfigPageZdroje zvuku AudioSourcesAudioSourcesManagerWidgetFormulYFormAudioSourcesManagerWidget0Odstranit vaechny zdrojeRemove all sourcesAudioSourcesManagerWidgetOdstranit zdroj Remove sourceAudioSourcesManagerWidget Odstranit zdrojeRemove sourcesAudioSourcesManagerWidget8Odstranit nepou~van zdrojeRemove unused sourcesAudioSourcesManagerWidget<html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">PYi pYehrvn nebo nahrvan udr~ujte ukazatel (b~ec) pYehrvn pYed o ima. .</p></body></html>

Keep the play cursor in view while playing or recording.

BehaviorConfigPageKreslenAnimatedBehaviorConfigPageZeptat seAskBehaviorConfigPage0Nastaven zvukov ukzkyAudio Clip SettingsBehaviorConfigPageFSouvisle upravovat zvuk pYi thnut(Continuously adjust audio while draggingBehaviorConfigPageNeukldat Don't saveBehaviorConfigPageDruhFormBehaviorConfigPage Sko itJumpBehaviorConfigPageZNahrt naposledy pou~van projekt na za tku!Load last used project at startupBehaviorConfigPagejUzam t zvukov ukzky za pou~it vchozho nastavenLock Audio Clips by defaultBehaviorConfigPage,Nastaven novho listuNew Sheet SettingsBehaviorConfigPagePo et stopNumber of tracksBehaviorConfigPageNa zvr: On close:BehaviorConfigPage(Nastaven pYehrvnPlayback SettingsBehaviorConfigPage$Nastaven projektuProject SettingsBehaviorConfigPage Ulo~itSaveBehaviorConfigPage(Proj~dt pYehrvnScroll playbackBehaviorConfigPage Zostat ve stYedu Stay CenteredBehaviorConfigPageObaBothBusSelectorDialogVoli sbrnice Bus SelectorBusSelectorDialog(Zachytvac sbrnice Capture BusesBusSelectorDialog KanlyChannelsBusSelectorDialogLevLeftBusSelectorDialogRSbrnice zaYzen umo~Hujcho pYehrvnPlayback BusesBusSelectorDialog PravRightBusSelectorDialog StopaTrackBusSelectorDialog12x12xCDWritingDialog16x16xCDWritingDialog1x1xCDWritingDialog20x20xCDWritingDialog24x24xCDWritingDialog28x28xCDWritingDialog2x2xCDWritingDialog32x32xCDWritingDialog36x36xCDWritingDialog40x40xCDWritingDialog44x44xCDWritingDialog48x48xCDWritingDialog4x4xCDWritingDialog8x8xCDWritingDialogPYeruaitAbortCDWritingDialog&Vypalovac zaYzenBurning DeviceCDWritingDialogZpis na CD CD WritingCDWritingDialog<Vypo tat a pou~t normalizaci!Calculate and apply normalizationCDWritingDialog ZavYtCloseCDWritingDialogtExportovat pouze *.wav a *.toc soubory (nezapisovat na CD).Export wav and toc files only (don't write CD)CDWritingDialogVaeobecn volbyGeneral OptionsCDWritingDialogInformace InformationCDWritingDialogPo et kopiNumber of copiesCDWritingDialogNapodobitSimulateCDWritingDialogRychlostSpeedCDWritingDialog Za t se zpisem Start WritingCDWritingDialogStavStatusCDWritingDialog(Zapsat vaechny listyWrite all SheetsCDWritingDialog(Zapsat sou asn listWrite current SheetCDWritingDialogsamo innautoCDWritingDialogVybrat ukzku Select Clip ClipSelection(Vbr: pYidat ukzkuSelection: Add Clip ClipSelection.Vbr: odstranit ukzkuSelection: Remove Clip ClipSelection8Importovat %n zvukov soubor:Importovat %n zvukov soubory:Importovat %n zvukov souboryImport %n audiofile(s) ClipsViewPort$PYidat uzel kYivky Add CurveNodeCurve*Odstranit uzel kYivkyRemove CurveNodeCurvetPYesn na tto pozici je ji~ uzel. Nebude pYidn nov uzelFThere is allready a node at this exact position, not adding a new nodeCurvePro istit uzly Clear Nodes CurveViewThnout uzel Drag Node CurveView ZruaitCancelDialog DialogDialogDialogOKOKDialog Digitln hodiny Digital Clock DigitalClockFZmnit nastaven zvukovho zaYzenChange Audio Device settings DriverInfo-- ExportDialogZruait export Abort Export ExportDialog ZavYtClose ExportDialogExportovatExport ExportDialog0Exportovat vaechny listyExport all Sheets ExportDialog0Exportovat sou asn listExport current Sheet ExportDialog$Exportovat adresYExport directory ExportDialogExportovat stav Export status ExportDialogVaeobecn volbyGeneral Options ExportDialogZahjit export Start Export ExportDialog <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Tato volba redukuje hromadn nkterch datovch souboro s pohyblivou (desetinnou)  rkou a~ do asi 10% eliminac nkterch informac, kter na zvukov data v podstat nemaj vliv. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">I kdy~ toto technicky zposobuje, ~e komprese je ztrtov, ponechv to vaechny vhody dat s pohyblivou (desetinnou)  rkou (&gt;600 dB dynamickho rozsahu, ~dn stYhn, a rozliaen 25 bito). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Tak to rozshle ovlivn celkovou compresi omezenm rozliaen na 24 bito.</p></body></html>B

This option reduces the storage of some floating-point data files by up to about 10% by eliminating some information that has virtually no effect on the audio data.

While this does technically make the compression lossy, it retains all the advantages of floating point data (>600 dB of dynamic range, no clipping, and 25 bits of resolution).

This also affects large integer compression by limiting the resolution to 24 bits.

ExportFormatOptionsWidget&Promrn datov tokAverage BitrateExportFormatOptionsWidgetNejlepaBestExportFormatOptionsWidgetDatov hloubkaBitdepthExportFormatOptionsWidgetDatov tokBitrateExportFormatOptionsWidget KanlyChannelsExportFormatOptionsWidgetDruh kompreseCompression typeExportFormatOptionsWidgetKvalita pYevoduConversion qualityExportFormatOptionsWidgetZakdovnEncodingExportFormatOptionsWidget"Metoda zakdovnEncoding MethodExportFormatOptionsWidget*Volby exportu formtuExport Format OptionsExportFormatOptionsWidget RychlFastExportFormatOptionsWidgetTyp souboru File TypeExportFormatOptionsWidgetVolby formtuFormat OptionsExportFormatOptionsWidget VysokHighExportFormatOptionsWidget"Volby formtu MP3 MP3 OptionsExportFormatOptionsWidget2Nejvta mo~n datov tokMaximum BitrateExportFormatOptionsWidgetPromrnMediumExportFormatOptionsWidget&Nejmena datov tokMinimum BitrateExportFormatOptionsWidget"Normalizovat zvukNormalize AudioExportFormatOptionsWidget"Volby formtu Ogg Ogg OptionsExportFormatOptionsWidgetFKvalita (nejrychleja <-> nejlepa)Quality (Fastest <-> Best)ExportFormatOptionsWidget>Kvalita (nejmena <-> nejlepa)Quality (Smallest <-> Best)ExportFormatOptionsWidget&Vzorkovac kmito et Sample RateExportFormatOptionsWidgetjPYesko it WVX pro extra kompresi (na pol bezztrtov).Skip WVX for extra compression (semi-lossless)ExportFormatOptionsWidgetHVolby WavPack (bezztrtov komprese)&WavPack options (lossless compression)ExportFormatOptionsWidgetnNezvisle promnn, kter jsou dostupn pro program sox'Available arguments for the sox programExternalProcessingDialog<Program <b>%1</b> se zhroutil!Program %1 crashed!ExternalProcessingDialogProgram <b>%1</b> nen nainstalovn, nebo nemte dostate n oprvnn pro jeho spuatn!DProgram %1 not installed, or insufficient permissions to run!ExternalProcessingDialogPYedtm, ne~ bude moci za t vnja proces, muste doplnit nezvisle promnnou!DYou have to supply an argument before starting the external process!ExternalProcessingDialog>Postupn zeslen signlu: ohyb Fade In: bendFadeBend@Postupn zeslaben signlu: ohybFade Out: bendFadeBend&PYedvolba prolnn Fade Preset FadeCurve>Postupn zeslen signlu: tvarFade In: shapeFadeMode@Postupn zeslaben signlu: tvarFade Out: shapeFadeMode@Postupn zeslen signlu: dlkaFade In: length FadeRangeHPostupn zeslen signlu: odstranitFade In: remove FadeRangeBPostupn zeslaben signlu: dlkaFade Out: length FadeRangeJPostupn zeslaben signlu: odstranitFade Out: remove FadeRange>Postupn zeslen signlu: slaFade In: strength FadeStrength@Postupn zeslaben signlu: slaFade Out: strength FadeStrengthMoj po ta  My Computer FileWidgetMoje dokumenty My Documents FileWidget$Rodi ovsk adresYParent Directory FileWidget0Obnovit nhled na souborRefresh File View FileWidget&Vaechny soubory (*) All files (*)ImportjZvukov soubory (*.wav *.flac *.ogg *.mp3 *.wv *.w64)1Audio files (*.wav *.flac *.ogg *.mp3 *.wv *.w64)Import2Importovat zvukov souborImport Audio FileImport0Importovat zvukov zdrojImport audio sourceImportVlo~it tichoInsert SilenceImport TichoSilenceImportPYidat zna ky Add MarkersImportClipsDialog2Importovat zvukov ukzkyImport Audio ClipsImportClipsDialog(Importovat do stopy:Import to Track:ImportClipsDialogTPYkazov pYdavn modul %1 nebyl nalezen!Command Plugin %1 not found! InputEnginedAkce dr~en nejsou podporovny z kontextovho menu0Hold actions are not supported from Context Menu InputEngineAkce podle bl~e ur ujcho kl e nejsou podporovny z kontextovho menu8Modifier key actions are not supported from Context Menu InputEngineJPYdavn modul %1 neprovd pYkaz %2&Plugin %1 doesn't implement Command %2 InputEngineVlo~it tichoInsert SilenceInsertSilenceDialog6Vlo~it ticho (v sekundch):Insert Silence (seconds):InsertSilenceDialog %1: %2%1: %2 Interface(&O aplikaci Traverso&About Traverso Interface&Zpis na CD...&CD Writing... Interface&Upravovat&Edit Interface&Exportovat... &Export... Interface&Jak za t&Getting Started Interface&Npovda&Help Interface*&Spravovat projekt...&Manage Project... Interface&Nov...&New... Interface&OtevYt...&Open... Interface&Preference...&Preferences... Interface&Projekt&Project Interface&Ukon it&Quit InterfaceR&Souborov formt pou~van pYi nahrvn&Recording File Format Interface,&Kvalita pYevzorkovn&Resample Quality Interface$&Obnovit zlohu...&Restore Backup... Interface&Ulo~it&Save Interface &List&Sheet Interface&Ukzat efekty &Show Effects Interface&PYichytit&Snap Interface*&U~ivatelsk pYru ka &User Manual Interface&Zobrazit&View Interface<b>Popis</b>Description Interface.<b>Kl ov sekvence</b>Key Sequence InterfacejAdresY projektu se zmnil na vn Traversa. To NEN podporovno! Prosm, vraete nyn tuto zmnu! Jestli~e si pYejete zmnit nzev projektu, pou~ijte msto toho projektov mana~er!A Project directory changed outside of Traverso. This is NOT supported! Please undo this change now! If you want to rename a Project, use the Project Manager instead! Interface&O aplikaci TraversoAbout Traverso InterfacejZvukov soubory (*.wav *.flac *.ogg *.mp3 *.wv *.w64)1Audio files (*.wav *.flac *.ogg *.mp3 *.wv *.w64) InterfaceNejlepaBest InterfaceZZposob zakdovn pYi nahrvn zmnn na: %1$Changed encoding for recording to %1 InterfaceHKvalita pYevzorkovn zmnna na: %1Changed resample quality to: %1 Interface.MYi vzjemnch vztahoCorrelation Meter InterfaceUpravovatEdit InterfaceFFT akla FFT Spectrum Interface RychlFast Interface VysokHigh InterfaceHistorieHistory Interface&Importovat &zvuk...Import &Audio... Interface Vlo~it ti&cho...Insert Si&lence... InterfaceDr~et b~ec ozna ujc pozici pYi pYehrvn v dohledu, kdy~ se pYehrv nebo nahrv.4Keep play cursor in view while playing or recording. Interface*Upravovatel zna ek...Marker Editor... InterfacePromrnMedium Interface Nov &list(y)...New &Sheet(s)... Interface"Nov &stopa(y)...New &Track(s)... Interface.OtevYt zvukov souboryOpen Audio Files InterfacefOtevYe u~ivatelskou pYru ku v externm prohl~e i!(Opening User Manual in external browser! InterfaceProjektProject InterfaceUdlat znovuRedo InterfaceKoa se zdroji Resources Bin Interface*P&roj~dt pYehrvnS&croll Playback InterfaceNa&staven Se&ttings InterfaceUkzat efektov pYdavn moduly a kYivky automatizace na stopch3Show effect plugins and automation curves on tracks InterfacevPYi pYetahovn pYichytit polo~ky k okrajom jinch polo~ek.2Snap items to edges of other items while dragging. Interface&Informace o systmuSystem Information InterfaceVPo~adovan projekt `%1` nemohl bt na ten z nsledujcch dovodo: '%2' Nyn dostanete seznam dostupnch zloh (jestli~e njak jsou), abyste z nich mohl projekt obnovit.The requested Project `%1` could not be loaded for the following reason: '%2' You will now be given a list of available backups (if any) to restore the Project from. Interface&Transportn konzoleTransport Console InterfaceTraverso %1 (sestaveno s Qt %2) Mnohastop audionahrvac a upravovac program. Pro vce informac se podvejte do npovdy v hlavn nstrojov liat. Traverso Vm pYina R. Sijrier a dala, v to zahrnuje vaechny lidi ze svta svobodnho softwaru, kteY pYispli dole~itmi technologiemi, na nich~ je Traverso zalo~eno (Gcc, Qt, Xorg, Linux, atd.)KTraverso %1 (built with Qt %2) A multitrack audio recording and editing program. Look in the Help menu for more info. Traverso is brought to you by R. Sijrier and others, including all the people from the Free Software world who contributed the important technologies on which Traverso is based (Gcc, Qt, Xorg, Linux, and so on) Interface&Traverso - dole~itTraverso - Important InterfaceFTraverso - selhalo nahrn projektuTraverso - Project load failed InterfaceVrtit zptUndo InterfacepOvlada Jack: Probhlo span pYipojen k Jack serveru!7Jack Driver: Connected successfully to the jack server! JackDriverOvlada Jack: Nebylo mo~n se spojit s Jack serverem. Je Jack spuatn?BJack Driver: Couldn't connect to the jack server, is jack running? JackDriver<html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Bitstream Vera Sans; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Dvoj skute n pYeruaen (ms)</p></body></html>Z

Double fact timeout (ms)

KeyboardConfigPage<html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Bitstream Vera Sans; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Dr~en pYeruaen (ms)</p></body></html>S

Hold timeout (ms)

KeyboardConfigPage<html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Dvoj skute n pYeruaen:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Maximln  as v milisekundch mezi stisknutm dvou klves: </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Je tYeba rozhodnout, zda dva stisky klves jsou skute n dvoj stisknut, ( &lt;&lt; K &gt;&gt; nebo &lt;&lt; KK &gt;&gt;)</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> nebo dv individuln stisknut klvesy ( a &lt; K &gt; a &lt; K &gt; akce, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">nebo &lt; KK &gt; a &lt; KK &gt; napY. akce).</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Zkuaen u~ivatel mohou nastavit tuto hodnotu na 150 ms. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Jestli~e jeat nemte mnoho zkuaenost, prosm, ponechejte vchoz hodnotu na 180 ms.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Abyste zskal vce informac, prohlednte si kapitolu 7: Key Actions (Klvesov akce) v U~ivatelsk pYru ce.</p></body></html>

Double fact timeout:

The maximum time in miliseconds between 2 key presses

to determine if the 2 key presses are a double fact ( << K >> or << KK >>)

or 2 individual key presses ( a < K > and < K > action,

or < KK > and < KK > action for example).

Experienced users can set this value as low as 150 ms,

if you don't have much experience yet, please leave the default of 180 ms.

For more information, see chapter 7: Key Actions. of the User Manual

KeyboardConfigPage<html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Dr~en pYeruaen:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Maximln  as, kdy je mo~no pova~ovat stisknutou klvesu za skute n dr~en klvesy, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">jako [ K ] nebo [ KK ].</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> m je tento  as krata, tm dYve bude stisknut klvesa </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">zjiatna jako akce dr~en klvesy. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Zkuaen u~ivatel mohou nastavit tuto hodnotu na 110 ms, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Jestli~e jeat nejste pYlia zkuaen, nastavte hodnotu na 150 ms.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Abyste zskal vce informac, prohlednte si kapitolu 7: Key Actions (Klvesov akce) v U~ivatelsk pYru ce.</p></body></html>7

Hold timeout:

The maximum time to consider a pressed key a hold key fact,

like [ K ] or [ KK ].

The shorter this time, the sooner a pressed key will be

detected as a hold action.

Experienced users can set this value as low as 110 ms,

if you don't have much experience yet, please leave the default of 150 ms.

For more information, see chapter 7: "Key Actions" of the User Manual.

KeyboardConfigPage,PYizposobit klvesniciConfigure KeyboardKeyboardConfigPage,Exportovat mapu klves Export KeymapKeyboardConfigPageFormulYFormKeyboardConfigPage$Export mapy klves KeyMap ExportKeyboardConfigPageMapa klvesKeymapKeyboardConfigPage\Pro tuto mapu klves nen nastaven ~dn popis"No description set for this keymapKeyboardConfigPage(Tisknout mapu klves Print KeymapKeyboardConfigPage$Vybrat mapu klves Select keymapKeyboardConfigPageVExportovan mapa klves se nachz zde: %1+The exported keymap can be found here: %1KeyboardConfigPage CzechEnglish LanguageName&Zruait&Cancel MarkerDialog&Exportovat&Export MarkerDialog&OK&Ok MarkerDialog&Odstranit&Remove MarkerDialog...... MarkerDialogPou~t na vae Apply to all MarkerDialogAran~r: Arranger: MarkerDialogCD TextCD-Text MarkerDialog"Voliteln CD TextCD-Text optional MarkerDialogSkladatel: Composer: MarkerDialog0Ochrana proti koprovnCopy protection MarkerDialog ISRC:ISRC: MarkerDialog Zna kyMarkers MarkerDialog Vzkaz:Message: MarkerDialog VolbyOptions MarkerDialog inkujc: Performer: MarkerDialog PozicePosition MarkerDialog*Pozice: (MM:SS:75ths)Position: (MM:SS:75ths) MarkerDialogPYed-zdoraznn Pre-Emphasis MarkerDialogSkladatel psn Songwriter MarkerDialog NzevTitle MarkerDialog Nzev:Title: MarkerDialog Koprovat ukzku Copy ClipMoveClipPYelo~it zna ky Fold MarkersMoveClipPYelo~it list Fold SheetMoveClipPYelo~it stopu Fold TrackMoveClip PYesunout ukzku Move ClipMoveClip2PYesunout ukzku na konecMove Clip To EndMoveClip6PYesunout ukzku na za tekMove Clip To StartMoveClip,PYesunout okraj ukzkyMove Clip EdgeMoveEdge......NewProjectDialogjZvukov soubory (*.wav *.flac *.ogg *.mp3 *.wv *.w64)1Audio files (*.wav *.flac *.ogg *.mp3 *.wv *.w64)NewProjectDialogLKoprovat soubory do adresYe projektuCopy files to project directoryNewProjectDialog6Nelze vytvoYit projekt (%1)Couldn't create project (%1)NewProjectDialog Popis DescriptionNewProjectDialogPrzdn projekt Empty ProjectNewProjectDialogPYipravitEngineerNewProjectDialog SouborFileNewProjectDialog4Importovat zvukov souboryImport Audio FilesNewProjectDialog NzevNameNewProjectDialogNov projekt New ProjectNewProjectDialogNeNoNewProjectDialog sla listoNumber of SheetsNewProjectDialog.OtevYt zvukov souboryOpen Audio FilesNewProjectDialogProjekt "%1" ji~ existuje. Chcete jej odstranit a nahradit novm?YThe Project "%1" already exists, do you want to remove it and replace it with a new one ?NewProjectDialogNzev stopy Track NameNewProjectDialog&Stopy na jeden listTracks per SheetNewProjectDialog Traverso - dotazTraverso - QuestionNewProjectDialogPou~t aablonu Use TemplateNewProjectDialogAnoYesNewProjectDialog<Muste doplnit nzev projektu!'You must supply a name for the project!NewProjectDialog"PYidn %n list(y)$PYidny %n list(y) PYidny %n listyAdded %n Sheet(s)NewSheetDialog~Nemohu vytvoYit nov list, jestli~e nebyl nahrn ~dn projekt!:I can't create a new Sheet if there is no Project loaded!!NewSheetDialog Nov nzev listuNew Sheet nameNewSheetDialogNov list(y) New Sheet(s)NewSheetDialog&Celkov po et listo Sheet countNewSheetDialog$Celkov po et stop Track countNewSheetDialogPou~t aablonu Use TemplateNewSheetDialog PYidna %n stopa PYidny %n stopy PYidny %n stopyAdded %n Track(s)NewTrackDialogNemohu vytvoYit novou stopu, jestli~e nebyl nahrn ~dn projekt!:I can't create a new Track if there is no Project loaded!!NewTrackDialogNov stopa(y) New Track(s)NewTrackDialog$Celkov po et stop Track countNewTrackDialogNzev stopy Track nameNewTrackDialog.<p>Nzev adresYe projektu <b>%1</b> se odliauje od nzvu projektu. <b>%2</b>!</p><p>PYejmenoval jste adresY projektu? </p><p>Prosm, pYejmenujte nzev adresYe nazpt, aby se shodoval s nzvem projektu <b>%1</b>, a zmHte nzev projektu za vyu~it dialogu sprvce projektu!</p>

Project directory name %1 is different from the Project title %2!

Did you rename the Project directory ?

Please rename the directory back to the Project title %1, and change the Project title with the Project Manager Dialog!

OpenProjectDialogJste si jist, ~e chcete odstranit projekt (%1) ? Nen mo~n vrtit tento krok zpt!TAre you sure that you want to remove the project %1 ? It's not possible to undo it !OpenProjectDialog|Vybrat njak stvajc nebo vytvoYit nov adresY pro projekt4Choose an existing or create a new Project DirectoryOpenProjectDialoglNov adresY pro projekt byl pro Vs vytvoYen zde: %1 /Created new Project directory for you here: %1 OpenProjectDialogVytvoYeno: Created on:OpenProjectDialog SmazatDeleteOpenProjectDialog Popis: Description:OpenProjectDialog NahrtLoadOpenProjectDialog6Nebyl vybrn ~dn projekt!No Project selected!OpenProjectDialogOtevYt projekt Open ProjectOpenProjectDialogProsm, zkontrolujte oprvnn pro tento adresY nebo vyberte jin: %1FPlease check permission for this directory or choose another one: %1OpenProjectDialoghProsm, zkontrolujte oprvnn pro tento adresY: %1.Please check permission for this directory: %1OpenProjectDialogProjekt "%1" neexistuje. PYejmenoval jste nebo odstranil adresY? Jak je jeho nzev?RProject %1 does not exist, did you rename or remove the directory what that name ?OpenProjectDialog0Projekt neexistuje! (%1)Project does not exist! (%1)OpenProjectDialog.Vybrat adresY projektuSelect Project DirOpenProjectDialogfVybrat projekt a opt klepnout na tla tko 'Nahrt'2Select a project and click the 'Load' button againOpenProjectDialogVybran projektSelected ProjectOpenProjectDialogNTento adresY nen Vmi zapisovateln! (This directory is not writable by you! OpenProjectDialog(Traverso - informaceTraverso - InformationOpenProjectDialog Traverso - dotazTraverso - QuestionOpenProjectDialog&Traverso - varovnTraverso - WarningOpenProjectDialogJNeschopen vytvoYit adresY projektu! %Unable to create Project directory! OpenProjectDialog<Muste doplnit nzev projektu!'You must supply a name for the project!OpenProjectDialog>PA vlada :: PortAudio chyba: %1PADriver:: PortAudio error: %1PADriverfPA ovlada :: hostapi %1 nebylo nalezeno Portaudiem!1PADriver:: hostapi %1 was not found by Portaudio!PADriver <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">PortAudio ovlada :</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ovlada , kter by ml ovldat PortAudio backend.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">PortAudio podporuje mnoho zvukovch backendo Pro nkter z nich m Traverso svoji vlastn podporu tak. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Doporu uje se pou~vat vlastn Traverso ovlada e namsto tch od PortAudio. A koli, pokud vlastn Traverso ovlada e zposobuj problmy, mohl byste namsto nich vyzkouaet ty, kter poskytuje PortAudio!</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">PortAudio poskytuje jasnou podporu ovlada o pro  etn platformy, v etn Windows (viz wmme, direct x a asio volby), a Mac OS X (viz CoreAudio a jack volby)</p></body></html>

PortAudio Driver:

The driver which should drive the PortAudio backend

PortAudio supports many driver backends, some of which Traverso has native support for too.

It is recommended to use Traverso's native drivers instead of using PortAudio's, however, if the native drivers give problems, you might try the ones supplied by PortAudio instead!

PortAudio provides transparent driver support for multiple platforms, including Windows (see the wmme, direct x and asio options), and Mac OS X (see the CoreAudio and jack options)

 PaDriverPageOvlada Driver PaDriverPageFormulYForm PaDriverPage$Portaudio ovlada ePortaudio drivers PaDriverPageH<html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Velikost vyrovnvac pamti ur en pro  ten:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mno~stv zvukovch dat, kter mohou bt ukldna ve </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">vyrovnvac pamti ur en pro  ten v sekundch.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Vchoz hodnota, kter je nastavena na jednu sekundu, by mla vyhovovat.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A koli, jestli~e se Vm nedostv pamti, mo~ete tuto hodnotu sn~it.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Jestli~e se setkte s podte enm vyrovnvac pamti, kdy~ bude aYka psma </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">pevnho disku (tmY) nasycena, nebo kdy~ se stane, ~e vyrovnvac pame podte e </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> kvoli tomu, ~e pevn disk z njakho dovodu nemo~e sthat, mo~ete vyzkouaet vta </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">hodnotu, jako 1.5 nebo 2.0 sekund.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mjte na mysli, ~e kdy~ pou~ijete vta vyrovnvac pame, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">zabere to vrazn vce  asu (to jest hledn) </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> tec hlav (playhead) pYesunout se na jinou pozici, vzhledem ke vaem vyrovnvacm pamtem. </p> <p style=" margin-top:0px; margin-bo +

Read buffer size:

The amount of audio data that can be stored in the

read buffers in seconds.

The default value of 1 second should do just fine.

However, if you're tight on memory, you can make this value lower.

If you experience buffer underruns when the hard disk bandwidth is

(almost) saturated, or when buffer underruns happen regularly due

the hard disk can't keep up for some reason, you can try a larger

value, like 1.5 or 2.0 seconds.

Keep in mind that when using a larger buffer,

it will take considerably more time to move (i.e. seeking)

the playhead to another positions, since all the buffers

(one for each audioclip * channel count) need to be refilled!

PerformanceConfigPage~<html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Zrychluje vykreslovn zvukovch ukzek a stop</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">pou~itm 3D prostYedko Vaa grafick karty.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">V zvislosti na Vaa grafick kart a podpoYe ovlada o </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">toto mo~e vznamn zvtait rychlost vykreslovn!</p></body></html>8

Accelerates the painting of AudioClips and Tracks by using

the 3D engine of your graphics card.

Depending on your graphics card and driver support, this

can speed up painting considerably!

PerformanceConfigPage<html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> slo, kolikrt za sekundu jsou grafick detaily<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">znovu vykresleny bhem akce, kdy se jimi hbe, jakou je pYesun</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">zvukov ukzky, nebo zmny koeficientu zeslen.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Vchoz nastaven hodnoty vykreslovn rme ko za sekundu na 35 </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> je dokonalm kompromisem mezi hladkm vykreslovnm a nzkm zat~enm procesoru.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SamozYejm, pokud Vm bude pYipadat, ~e vykreslovn nen dostate n</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">hladk, zvyate tuto hodnotu, ale stle mjte na pamti, ~e tento krok</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">povede k vrazn vyaam nrokom na procesor!</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Jestli~e napY. pYesun zvukov ukzky stle bude vy~adovat pYlia vkonu procesoru</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ml byste zv~it sn~en tto hodnoty.</p></body></html> ~

The number of times per second at which the Graphical

Items are repainted during a jog action, like moving an

AudioClip, or changing the Gain.

The default frames per second of 35 is a perfect compromise

between smooth painting, and low cpu usage.

However, if you find the painting to be not smooth enough,

change this value to a higher one, but keep in mind that it

will consume considerably more cpu!

If for example moving an AudioClip still takes to much cpu,

you should consider to lower this value.

PerformanceConfigPage`Ukldn zvukovho souboru do vyrovnvac pamtiAudio file bufferingPerformanceConfigPageZmna velikosti vyrovnvac pamti se uskute n pouze po (znovu)na ten projektu.QChanging the buffer size only will take into effect after (re)loading a project.PerformanceConfigPageDruhFormPerformanceConfigPageLRychlost vykreslovn pYi pohybu (fps)Jog repaint speed (fps)PerformanceConfigPageVykreslovnPaintingPerformanceConfigPagelVelikost vyrovnvac pamti ur en pro  ten (sekundy)Read buffer size (seconds)PerformanceConfigPage6Pou~t hardwarov zrychlenUse hardware accelerationPerformanceConfigPage Informa n ikona info iconPerformanceConfigPage4PYidat tak pYdavn modulAdd Plugin tooPluginSelectorDialog ZruaitCancelPluginSelectorDialogVstup/VstupIn/OutPluginSelectorDialogOKOKPluginSelectorDialog.Nzev pYdavnho modulu Plugin NamePluginSelectorDialog.Voli pYdavnch moduloPlugin SelectorPluginSelectorDialogDruhTypePluginSelectorDialogJImportuje se soubor %1 z (ze) %2: %p%Importing file %1 of %2: %p%ProgressToolBar6Nstrojov liata s probhemProgress ToolbarProgressToolBar6Nelze vytvoYit adresY (%1)Cannot create dir %1ProjectNebylo mo~n otevYt soubor Vlastnosti projektu pro zpis (Soubor %1. Dovod: %2)HCouldn't open Project properties file for writing! (File %1. Reason: %2)Project0VytvoYen nov projekt %1Created new Project %1Project\Detekovno stYhn v exportovanm zvuku! (%1))Detected clipping in exported audio! (%1)ProjectXExport ji~ probh. Nelze jej za t dvakrt!2Export already in progress, cannot start it twice!Project"Projekt %1 nahrnProject %1 loadedProject"Projekt %1 ulo~enProject %1 saved ProjecttProjektt %1: Nelze otevYt soubor project.tpf! (Dovod: %2)6Project %1: Cannot open project.tpf file! (Reason: %2)ProjectProjektt %1: Selhalo proveden rozboru souboru project.tpf! (Dovod: %2):Project %1: Failed to parse project.tpf file! (Reason: %2)ProjectxNeodpovd verze souboru projektu. Neschopen na st projekt!Je potYeba pYevst %1 souboro</b>Need to convert %1 filesProjectConverter6PYevod byl dokon en spanConversion finished succesfullyProjectConverterbPYevod byl zastaven na ~dost u~ivatele. Mo~ete pokra ovat v pou~vn tohoto projektu s Traverso <= 0.41.0, nebo jej znovu otevYt touto verz Traversa a z t s pYevodem znovuConversion stopped on user request, you can continue to use this Project with Traverso <= 0.41.0, or reopen it with this version of Traverso and start the conversion againProjectConverterVPYevd se soubor project.tpf ..... Hotovo!&Converting project.tpf file..... Done!ProjectConverterNebylo mo~n otevYt soubor 'Vlastnosti projektu' pro zpis (Soubor %1. Dovod: %2)HCouldn't open Project properties file for writing! (File %1. Reason: %2)ProjectConverterJK dispozici nen ~dn popis pYevodu!$No conversion description available!ProjectConverter&Projekt %1 pYevedenProject %1 convertedProjectConverterProjekt %1: Selhalo proveden rozboru souboru project.tpf! (Dovod: %2):Project %1: Failed to parse project.tpf file! (Reason: %2)ProjectConverterSoubor projektu verze %1 nemo~e bt pYeveden. Pouze soubory verze 2 bt mohou!PProject file with version %1 cannot be converted, only files with version 2 can!ProjectConverterhUkld se pYeveden soubor project.tpf ..... Hotovo!+Saving converted project.tpf file.... Done!ProjectConverterVZa n pYevod projektu z verze 2 na verzi 37Starting to convert Project from version 2 to version 3ProjectConverter ZavYtCloseProjectConverterDialog&Informace o pYevoduConversion informationProjectConverterDialogProbh pYevoduConversion progressProjectConverterDialogNahrt projekt Load ProjectProjectConverterDialog$PYevodnk projektuProject ConverterProjectConverterDialogVProjekt XXX (nen potYeba ~dnho pYekladu)#Project XXX (no translation needed)ProjectConverterDialog Za t s pYevodemStart conversionProjectConverterDialogZastavit pYevodStop conversionProjectConverterDialog--ProjectInfoWidgetDatov hloubkaBitdepthProjectInfoWidgetProjektProjectProjectInfoWidget>Udltko informujc o projektuProject Information WidgetProjectInfoWidgetFrekvenceRateProjectInfoWidget PsnSongsProjectInfoWidget2Nelze vytvoYit adresY %1Cannot create dir %1ProjectManagerpVyberte adresY, do kterho budete ukldat Vaae projekty,Choose a directory to store your Projects inProjectManagerZAdresY projektu nemohl bt pYejmenovn na %1(Could not rename Project directory to %1ProjectManagerlNov adresY pro projekt byl pro Vs vytvoYen zde: %1 /Created new Project directory for you here: %1 ProjectManagerVVchoz projekt vytvoYen aplikac Traverso#Default Project created by TraversoProjectManagerjChcete ulo~it projekt pYedtm, ne~ ukon te aplikaci?/Do you want to save the Project before quiting?ProjectManagerNen zde ~dn projekt, kter by mohl bt ulo~en. Nejprve otevYete nebo vytvoYte projekt!3No Project to save, open or create a Project first!ProjectManagerNebyl vybrn ~dn adresY. Chcete-li to zkusit znovu, otevYete dialog 'OtevYt projekt' a klepnte na tla tko 'Vybrat adresY projektu' oNo directory was selected, to retry open the 'Open Project Dialog' and click 'Select Project Directory' button ProjectManagerProsm, zkontrolujte oprvnn pro tento adresY nebo vyberte jin: %1FPlease check permission for this directory or choose another one: %1ProjectManagerhProsm, zkontrolujte oprvnn pro tento adresY: %1.Please check permission for this directory: %1ProjectManager0Projekt %1 ji~ existuje!Project %1 already exists!ProjectManagerProjekt %1 nemohl bt nalezen. (Odstranil jste nebo pYejmenoval adresY projektu?)WProject %1 no longer could be found! (Did you remove or rename the Project directory ?)ProjectManagerZloha souboru projektu: Soubor projektu %1 nemohl bt otevYen pro  ten (Dovod: %2)TProjectfile backup: The project file %1 could not be opened for reading (Reason: %2)ProjectManagerUlo~it projekt Save ProjectProjectManagerNTento adresY nen Vmi zapisovateln! (This directory is not writable by you! ProjectManager&Traverso - varovnTraverso - WarningProjectManagerJNeschopen vytvoYit adresY projektu! %Unable to create Project directory! ProjectManagerDNeschopen vytvoYit nov projekt %1Unable to create new Project %1ProjectManager6Neschopen nahrt projekt %1Unable to load Project %1ProjectManagerTPou~v se stvajc adresY projektu: %1 %Using existing Project directory: %1 ProjectManager<html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Znovu: posledn zmna</p></body></html>

Redo last change

ProjectManagerDialog<html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Zpt: posledn zmna</p></body></html>

Undo last change

ProjectManagerDialogSoudob vyzrlAdult ContemporaryProjectManagerDialog"Alternativn rockAlternative RockProjectManagerDialogAran~rArrangerProjectManagerDialogCD TextCD TextProjectManagerDialogDti ChildrensProjectManagerDialogKlasick ClassicalProjectManagerDialog$KYeseansk soudobContemporary ChristianProjectManagerDialogRNebylo mo~n otevYt soubor %1 pro zpis!"Couldn't open file %1 for writing!ProjectManagerDialogCountryCountryProjectManagerDialog$VytvoYit nov listCreate new SheetProjectManagerDialogTane nDanceProjectManagerDialog SmazatDeleteProjectManagerDialog Popis DescriptionProjectManagerDialog DialogDialogProjectManagerDialogFID disku (prokaz toto~nosti disku):Disc ID:ProjectManagerDialog(Lehce poslouchatelnEasy ListeningProjectManagerDialogPYipravitEngineerProjectManagerDialog&Zadat nzev aablonyEnter Template nameProjectManagerDialogErotickEroticProjectManagerDialogExportovatExportProjectManagerDialogFolkFolkProjectManagerDialog }nr:Genre:ProjectManagerDialogGospelovGospelProjectManagerDialogHip HopHip HopProjectManagerDialogInforma n InformationalProjectManagerDialogJazzJazzProjectManagerDialog Romnsk (Latin)LatinProjectManagerDialog DlkaLengthProjectManagerDialog VzkazMessageProjectManagerDialogMuziklovMusicalProjectManagerDialog$Nov vk (New Age)New AgeProjectManagerDialogNov list New SheetProjectManagerDialog>Nebyl doplnn nov nzev listu!No new Sheet name was supplied!ProjectManagerDialog OperaOperaProjectManagerDialogOperetaOperetteProjectManagerDialog inkujc PerformerProjectManagerDialogPop (Pop music) Pop MusicProjectManagerDialogProjektProjectProjectManagerDialog~Projekt s nzvem '%1' ji~ existuje. Prosm, doplHte jin nzev!IProject with title '%1' allready exists, please supply a different title!ProjectManagerDialogRapRapProjectManagerDialog ReggaeReggaeProjectManagerDialogPYejmenovatRenameProjectManagerDialog Rhythm and BluesRhythm and BluesProjectManagerDialogRock Rock MusicProjectManagerDialogUlo~it aablonu Save TemplateProjectManagerDialog8Ulo~ena aablona projektu: %1Saved Project Template: %1ProjectManagerDialogVybran listSelected SheetProjectManagerDialogNzev listu Sheet NameProjectManagerDialogList(y)Sheet(s)ProjectManagerDialog ListySheetsProjectManagerDialogSkladatel psn SongwriterProjectManagerDialogZvukov efekty Sound EffectsProjectManagerDialogMluven slovo Spoken WordProjectManagerDialog`ablonaTemplateProjectManagerDialogh`ablona s nzvem %1 ji~ existuje! Chcete ji pYepsat?CTemplate with name %1 already exists! Do you want to overwrite it?ProjectManagerDialog NzevTitleProjectManagerDialog StopyTracksProjectManagerDialog(Traverso - informaceTraverso - InformationProjectManagerDialogJUPC EAN (UPC Universal Product Code):UPC EAN:ProjectManagerDialog<Neschopen vytvoYit adresY %1!Unable to create directory %1!ProjectManagerDialogNestanoven UndefinedProjectManagerDialogNepou~vanUnusedProjectManagerDialog6Svtov hudba (World Music) World MusicProjectManagerDialogznovu textredotextProjectManagerDialogzpt textundotextProjectManagerDialog4Vyskytla se fatln chyba.A fatal error occurred.QObject,Vyskytlo se pYeruaen.A timeout occurred.QObjectNPYi  ten ze souboru se vyskytla chyba.-An error occurred when reading from the file.QObjectXPYi zapisovn do souboru se vyskytla chyba.+An error occurred when writing to the file.QObjectBVyskytla se bl~e neur en chyba.An unspecified error occurred.QObjectZvukov ukzka AudioClipQObject KYivkaCurveQObjectUzel kYivky CurveNodeQObject KYivka prolnn FadeCurveQObject Zna kaMarkerQObject2Nevyskytla se ~dn chybaNo error occurredQObjectChyba zdroje Resourc errorQObjectListSheetQObjectDNebylo mo~n pYistoupit k souboru.The file could not be accessed.QObject:Soubor nemohl bt zkoprovn.The file could not be copied.QObject4Soubor nemohl bt otevYen.The file could not be opened.QObject8Soubor nemohl bt odstrann.The file could not be removed.QObject<Soubor nemohl bt pYejmenovn.The file could not be renamed.QObjectJNemohla bt zmnna velikost souboru.The file could not be resized.QObject*Operace byla zruaena.The operation was aborted.QObjectJPozice v souboru nemohla bt zmnna..The position in the file could not be changed.QObject asov pYmkaTimeLineQObject StopaTrackQObjectNeznm chyba Unknown errorQObjectA<html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"><span style=" font-size:18pt; font-weight:600;">Traverso: Jak za t</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">Kdy~ nahrvte nebo importujete njak zvukov soubor do aplikace Traverso, ukazuje se jako zvukov ukzka v jedn z vodorovnch stop v sou asnm list. Mo~ete upravovat mnoho strnek tchto ukzek tm, ~e umstte ukazatel myai nad ukzku a stisknete nebo budete dr~et rozn klvesy na vaa klvesnici a myai. Mo~ete tak mnit nastaven stopy, listu jako celku, a dalach objekto v listu.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">Abyste vidli seznam pYkazo, kter jsou dostupn pro kterkoli vybran objekt v listu, pYesuHte mya nad objekt, a klepnte pravm tla tkem myai (nebo stisknte Q). Klvesov zkratky pro ka~d pYkaz se zobrazuj v nabdce. Pou~van zposob zpisu je ukzn n~e.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; K &gt; </span>Znamen, ~e mte stisknout a upustit klvesu K (jako klepnut, klik).</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"><span style=" font-weight:600;">&lt;&lt; K &gt;&gt;</span> Znamen, ~e mte stisknout klvesu K dvakrt rychleji (jako dvojit klepnut, klik).</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ K ]</span> Znamen, ~e mte thnout mya zatmco podr~te klvesu K.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; KL &gt; </span>Znamen, ~e mte stisknout klvesy K a L sou asn.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ KL ] </span>Znamen, ~e mte thnout mya zatmco podr~te klvesy K a L sou asn.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">Zde jsou nkter zkladn pYkazy:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; SPACE &gt;</span> Vykon pYkaz pYehrvat/zastavit.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; SHIFT &gt;</span> Nastav hrac hlavu (modr svisl  ra ukazujc, kde za n pYehrvn).</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; W &gt;</span> Nastav pracovn b~ec ( erven svisl  ra).</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; V &gt; </span> PYesune hrac hlavu nazpt k pracovnmu b~ci.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ D ] </span> PYesune objekt kolem (zvukov ukzka, uzel kYivky, atd.).</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ Z ]</span> PYibli~uje a oddaluje.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ TAB ]</span> Roluje vaemi smry (tak znm jako "jezdit tam a zpt", raketopln - Shuttle). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">A Nkter pYkazy ke zvukovm ukzkm:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ E ] </span> Thne ukzku k jeho levmu nebo pravmu okraji.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ F ]</span> PYizposob dlku zeslen/zeslaben signlu ukzky.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ G ] </span>PYizposob koeficient zeslen ukzky (tak funguje u stop, listo).</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; X &gt;</span> Rozdl ukzku na pozici b~ce.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">Abyste zskali vce informac, sta abyste poklepali pravm tla tkem myai na cokoli, nebo se mrknte na npovdu k aplikaci Traverso.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p></body></html>

Traverso: Getting Started

When you record or import an audio file into Traverso, it shows up as an Audio Clip in one of the horizontal Tracks in the current Sheet. You can edit many aspects of these Clips by placing the mouse pointer over a Clip and pressing or holding different keys on your keyboard and mouse. You can also change settings of a Track, the Sheet as a whole, and other objects in the Sheet.

To see a list of what commands are available for any given object in the Sheet, move the mouse over that object, and Right-Click (or press Q). The keyboard shortcuts for each command are shown in the menu. The notation used is shown below.

< K > means press and release the K key. (Like a click.)

<< K >> means press the K key two times fast. (Like a double click.)

[ K ] means drag the mouse while holding down the K key.

< KL > means press the K and L keys at the same time.

[ KL ] means drag the mouse while holding down the K and L keys at the same time.

Here are some basic commands:

< SPACE > is Play/Stop.

< SHIFT > sets the Playhead. (Blue vertical line where playing starts.)

< W > sets the Work Cursor. (Red vertical line.)

< V > moves the Playhead back to the Work Cursor.

[ D ] move objects around (Audio Clip, Curve Nodes, etc)

[ Z ] zooms in and out.

[ TAB ] scroll omnidirectional (aka Shuttle)

And some Audio Clip Commands:

[ E ] drags a Clip's left or right edge.

[ F ] adjusts the length of a Clip's Fade In / Fade Out.

[ G ] addust the Gain of a clip (also works on Tracks, Sheet)

< X > splits the Clip at the cursor's position.

For more information, right-click on everything, or check out the Traverso manual.

QuickStartDialog&Traverso: Jak za tTraverso: Getting StartedQuickStartDialog6Nebylo mo~n otevYt souborCould not open file ReadSource:Soubor m nulov po et kanloFile has zero channels ReadSource*Neplatn po et kanloInvalid channel count ReadSourceHNen stanovena chyba  ten ze zdrojeNo ReadSource error set ReadSource TichoSilence ReadSource$Soubor neexistuje!The file does not exist! ReadSourcev<html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">WAV</span> : Formt bez komprese. Pou~v vce diskovho prostoru ne~ komprimovan kdovac formty, ale potYebuje velmi mlo vkonu procesoru.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Omezen : ~ 1.7 hodin nahrvacho  asu; stereo - 44.1 kHz</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">WavPack</span> : Formt s kompres je pYi srovnn s WAV dvakrt mena, a pYitom netrp ~dnou ztrtou kvality. Pou~v daleko vce vkonu procesoru ne~ WAV, ale u modernch (rok 2005 a mlada) procesoro by toto neml bt problm.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Pou~vn tohoto formtu zat~uje pevn disk mnohem mn. Prodlu~uje ~ivotnost pevnho disku, a zmenauje mo~nost, ~e bude nasycena aYka vlnovho psma pevnho disku.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Omezen : ~ 5 hodin nahrvacho  asu; stereo - 44.1 kHz</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">WAV64</span> : WAV formt s 64 bit hlavi kou. Podpora jinmi programy je v sou asn dob omezen.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Omezen : }dn. Tisce hodin nahrvacho  asu, za pYedpokladu, ~e Va pevn disk je bude schopen pojmout.</p></body></html> k

WAV : A format without compression. Uses more hard disk space then compressed encoding formats, but needs very little cpu.

Limits : ~ 1.7 hours of recording time @ Stereo - 44.1 KHz

WavPack : A format with compression, up to 2 times smaller compared to WAV, and no quality loss. Uses significantly more cpu then WAV, but with modern (year 2005 and above) cpu's this shouldn't be a problem.

Using this format stresses the hard disk much less, increasing hard disk live, and less chance of saturating the hard disk bandwidth.

Limits : ~ 5 hours recording time @ Stereo - 44.1 KHz

WAV64 : WAV format with 64 bit header, support by other programs is currently limited.

Limits : None, thousands of hours of recording time, supposed that your hard disk can hold it.

RecordingConfigPage <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Tato volba zmenauje hromadn nkterch datovch souboro s pohyblivou desetinnou  rkou okolo a~ asi 10 % odstrannm nkterch informac, kter v podstat nemaj ~dn  inek na zvukov data. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">PYesto~e toto technicky dl kompresi ztrtovou, ponechv to vaechny vhody datovch souboro s pohyblivou desetinnou  rkou (&gt;600 dB dynamickho rozsahu, ~dn oaizen kvality, a 25 bitov rozliaen). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Toto tak ovlivHuje rozshlou celo selnou kompresi omezenm rozliaen na 24 bito.</p></body></html>B

This option reduces the storage of some floating-point data files by up to about 10% by eliminating some information that has virtually no effect on the audio data.

While this does technically make the compression lossy, it retains all the advantages of floating point data (>600 dB of dynamic range, no clipping, and 25 bits of resolution).

This also affects large integer compression by limiting the resolution to 24 bits.

RecordingConfigPageNejlepaBestRecordingConfigPageDruh kompreseCompression typeRecordingConfigPageRVchoz kvalita pYevzorkovn pYi exportuDefault export resample qualityRecordingConfigPage`Povolit pYevzorkovn za bhu (pouze pYehrvn),Enable on the fly resampling (Playback only)RecordingConfigPage>Formt pou~van pro zakdovnEncoding formatRecordingConfigPage RychlFastRecordingConfigPageFormulYFormRecordingConfigPage VysokHighRecordingConfigPagePromrnMediumRecordingConfigPage:Kvalita pYevzorkovn za bhuOn the fly resample qualityRecordingConfigPageNahrv RecordingRecordingConfigPagePYevzorkovn ResamplingRecordingConfigPagenPYesko it WVX pro zvlatn kompresi (napol bezztrtov).Skip WVX for extra compression (semi-lossless)RecordingConfigPageVolby WavPackWavPack optionsRecordingConfigPageSprvce zdrojo:: Byl pYijat po~adavek na odstrann zdroje zvuku %1, ale ten je stle pou~vn %2 zvukovmi ukzkami! NEN proto odstraHovn!wResourcesManager: Received request to remove Audio Source %1but it is still in use by %2 AudioClips!!. NOT removing it!ResourcesManagerSprvce zdrojo:: Selhalo pYi inicializaci zdroje pro  ten %1 (Dovod: %2)CResourcesManager:: Failed to initialize ReadSource %1 (Reason: %2)ResourcesManagerUkon itEndResourcesWidgetSouboryFilesResourcesWidgetDruhFormResourcesWidget DlkaLengthResourcesWidget NzevNameResourcesWidget ZdrojeSourcesResourcesWidget Za tStartResourcesWidget--RestoreProjectBackupDialog*Sou asn datum a  as:Current date and time:RestoreProjectBackupDialog DatumDateRestoreProjectBackupDialog Posledn zloha: Last backup:RestoreProjectBackupDialog"Obnovit ze zlohyRestore from backup RestoreProjectBackupDialogfNastavit datum, kdy m bt obnovena vybran zloha.,Set the date to restore the selected backup.RestoreProjectBackupDialog asTimeRestoreProjectBackupDialog Vzhled AppearanceSettingsDialogVolby zvuku Audio OptionsSettingsDialogChovnBehaviorSettingsDialogKlvesniceKeyboardSettingsDialog Vkon PerformanceSettingsDialog*Traverso - preferencePreferences - TraversoSettingsDialogZvukov systm Sound SystemSettingsDialogPYidat stopu Add TrackSheetxPo te n snmek exportu za n za koncovm snmkem exportu!3Export start frame starts beyond export end frame!!SheetjExport se pokoua pYevdt do souboru wav s 0 kanly?/Export tries to render to 0 channels wav file??SheetDoalo k selhn pYi pokusu vyprzdnit vyrovnvac pame ur enou pro zapisovn v as#Failed to empty WriteBuffer in timeSheetDoalo k selhn pYi pokusu naplnit vyrovnvac pame ur enou pro  ten v as!Failed to fill ReadBuffer in timeSheetLBylo odhaleno pYet~en pevnho disku!Hard Disk overload detected!SheetXPro nahrvn nebyly aktivovny ~dn stopy!No Tracks armed for recording!Sheet:Nebylo stanoveno jmno umlceNo artists name setSheet~}dn zvuk, kter by mohl bt exportovn (Vaechno je ztlumeno?)*No audio to export! (Is everything muted?)Sheet(Nahrv do %n ukzky(Nahrv do %n ukzek(Nahrv do %n ukzekRecording to %n Clip(s)SheetOdstranit stopu Remove TrackSheetBez nzvuUntitledSheet--SongInfoWidgetZeslenGainSongInfoWidget SMPTESMPTESongInfoWidgetPYichytitSnapSongInfoWidget PseHSongSongInfoWidgetPUdltko, kter podv informaci o psniSongInfoWidgetSongInfoWidgetPYibl~enZoomSongInfoWidgetHz HzSpectralMeterConfigWidget&ZavYt&CloseSpectralMeterConfigWidget10241024SpectralMeterConfigWidget20482048SpectralMeterConfigWidget256256SpectralMeterConfigWidget40964096SpectralMeterConfigWidget512512SpectralMeterConfigWidget81928192SpectralMeterConfigWidgetPokro ilAdvancedSpectralMeterConfigWidget&Pokro il volby FFTAdvanced FFT OptionsSpectralMeterConfigWidget Pou~tApplySpectralMeterConfigWidgetBlackmanBlackmanSpectralMeterConfigWidgetVelikost FFT: FFT Size:SpectralMeterConfigWidget*Konfigurace FFT aklyFFT-Spectrum ConfigurationSpectralMeterConfigWidget"Frekven n rozsahFrequency RangeSpectralMeterConfigWidgetHammingHammingSpectralMeterConfigWidgetHanningHanningSpectralMeterConfigWidgetSpodn mez: Lower Limit:SpectralMeterConfigWidget$Spodn hodnota dB:Lower dB value:SpectralMeterConfigWidgetPo et psem:Number of bands:SpectralMeterConfigWidgetObdlnkov RectangleSpectralMeterConfigWidget,Ukzat promrnou akluShow average spectrumSpectralMeterConfigWidgetHorn mez: Upper Limit:SpectralMeterConfigWidget"Horn hodnota dB:Upper dB value:SpectralMeterConfigWidget$Funkce oknkovn:Windowing function:SpectralMeterConfigWidget<Exportovat promrnou kYivku dBExport average dB curveSpectralMeterViewnFFT: Povoli promrnou kYivku s < M > pro generovn dat5FFT: Enable avarage curve with < M > to generate dataSpectralMeterViewFFT: Nepou~v se ~dn promrn kYivka. Nejsou data pro export!/FFT: No avarage curve used, not data to export!SpectralMeterViewJFFT: Nejsou promrn data pro export!FFT: No avarage data to export!SpectralMeterViewjFFT: Neschopen zapsat zachycen obrzek na pevn disk0FFT: Unable to write captured image to hard diskSpectralMeterView Vstupn formt:Output format:SpectralMeterViewJNzev souboru se zachycenm obrazovkyScreen Capture file nameSpectralMeterView,Vybrat vstupn formtSelect output formatSpectralMeterViewRozdlit ukzku Split Clip SplitClip&Informace o systmuSystem InformationSysInfoToolBar - % - %SystemInfoWidget- GB- GBSystemInfoWidget Nzev karty (na)Card Name (na)SystemInfoWidgetTUdltko, kter podv informaci o systmuSystemInfoWidgetSystemInfoWidgetDatov hloubkabitdepthSystemInfoWidget@Velikost vyrovnvac pamti (na)buffer size (na)SystemInfoWidgetDruh disku (na)drivertype (na)SystemInfoWidget ObrazimageSystemInfoWidgetLatence (na) latency (na)SystemInfoWidgetFrekvencerateSystemInfoWidgetXruns (na) xruns (na)SystemInfoWidgetPStav vyrovnvac pamti ur en pro  tenRead Buffer StatusSystemResourcesZStav vyrovnvac pamti ur en pro zapisovnWrite Buffer StatusSystemResourcesPYidat zna ku Add MarkerTimeLine Odstranit zna ku Remove MarkerTimeLinePYidat zna ku Add Marker TimeLineViewVy istit zna ky Clear Markers TimeLineViewThnout zna ku Drag Marker TimeLineView KonecEnd TimeLineView`Nejprve muste odstranit vaechny ostatn zna ky.+You have to remove all other markers first. TimeLineViewPYidat ukzkuAdd ClipTrack Odstranit ukzku Remove ClipTrackZtiait ostatnSilence OthersTrackStopa: Zvukov ukzka s id %1 nebyla nalezena ve zdrojov databzi!BTrack: AudioClip with id %1 not found in Resources database!TrackPanorma stopy Track PanTrackPan$Panorma stopy: %1 Track Pan: %1TrackPan.Vlo~it nov nzev stopyEnter new Track name TrackView(Nastavit nzev stopySet Track name TrackViewStopa %1: %2 Track %1: %2 TrackView0Dala pozice pYichytnutNext Snap PositionTransportConsoleWidget PYehrt/Zastavit Play / StopTransportConsoleWidget8PYedchoz pozice pYichytnutPrevious Snap PositionTransportConsoleWidget NahrtRecordTransportConsoleWidgetNNahrv do %1 stop, kdovac formt: %2+Recording to %1 Tracks, encoding format: %2TransportConsoleWidget$PYesko it na konec Skip to EndTransportConsoleWidget(PYesko it na za tek Skip to StartTransportConsoleWidget(Od)zna it vae(De)Select AllTraversoCommandsAktivovat stopy Arm TracksTraversoCommands Koprovat ukzku Copy ClipTraversoCommandsDoloDownTraversoCommandsThnout okraj Drag EdgeTraversoCommands"Vnja zpracovnExternal ProcessingTraversoCommandsPYelo~it zna ky Fold MarkersTraversoCommandsPYelo~it list Fold SheetTraversoCommandsPYelo~it stopu Fold TrackTraversoCommandsZeslenGainTraversoCommands6Zeslen: znovu nastartovat Gain: ResetTraversoCommandsVodorovn HorizontalTraversoCommandsVodorovn v Horizontal InTraversoCommandsVodorovn venHorizontal OutTraversoCommandsImportovat zvuk Import AudioTraversoCommandsVlo~it tichoInsert SilenceTraversoCommandsLevLeftTraversoCommands PYesunout ukzku Move ClipTraversoCommands@PYesunout zmnit velikost ukzkyMove Or Resize ClipTraversoCommandsNov stopa New TrackTraversoCommandsVaesmrovOmnidirectionalTraversoCommandsPanormaPanoramaTraversoCommands6Panorma: znovu nastartovatPanorama: ResetTraversoCommands Odstranit ukzku Remove ClipTraversoCommandsOdstranit stopu Remove TrackTraversoCommands PravRightTraversoCommandsRozdlitSplitTraversoCommands NahoruUpTraversoCommands SvislVerticalTraversoCommandsSvisl v Vertical InTraversoCommandsSvisl ven Vertical OutTraversoCommandstraverso-0.49.4/resources/translations/traverso_bg.qm000644 001750 001750 00000607031 11430303020 023357 0ustar00remonremon000000 000000 AaF0aDUp7g%`.Ic8*818YƇ~{Ũt ɬ$ 8FڛyYIqo; #}4oq_-[>>Vڟ~$$.NQ^ɴ Ot#Q'1x/a;5_bwfe%jwDN֓el8__z_ Œr7 NUƤP--;:|, 7. H.0EkR0{k[  X_ChXfInqv(v e6z'֒zNL+‚Xm/eb$R6#<j)}Q*kȺ[PHs.m.6[ѭ[l:M|tfrٖ>Qڑ|M1  .jH a_+5*g6L9OyъBJocbLoMCnGgCmTd}dSMBϥϥʗ]U˿ϸHк故d4ǵ7^>qCď S(5"8:G[8I8II(^ITpl"xv:M!xn1EORՋIFII;y 1s^^,e`, UϕGWm=W<W H14j?Ŋ +T{G+jH,vvրe!$XOU@OE^榼8إGEFvnHF4aU1n uH$)ir'~!*YT1,No,Nn,N48 ;;;= = e=gFC}H SYaU-i^k2ysRLu%ْH5h]L T{.nIzOq&ЎP>tz#!h2ɴN& ֪_!"`5s aF ; Pc e\C~b^"Bhm((*K3^*/=/A1\?PDA\ZZ:[;̯\uRK]=P]=_QQ;_Qaib#gjls {N`%j,adGHJkRJ.N?Jݐ%mg)no RhE˯?ZRg4oN: /ͥp `  JAtJJNp\AF_:P_:a~&kLmSonPQrLlCo<d3^qZaU%    3 d ХRnDR`Pw`}Œ!b`ĠHԍןխzV:b'H 9 ld/der""I5#l9ϕCYCmD§KrIKCfNb>PXPlVQ-VQmisNLLPK9Q\ @zPÛ}İlyZ\MWpoK-  w 1+ލ b 0 D.]X MgT Mg Yi [[Y [ ]W ^Q8 g h>S IB | .XB  1  xua 3 e # EXc E^  몠G \f \+    2 9." !O & 'ni *L. =a AJ Cb! LZ~$S dp h?z h? hd lP< l[ lDŽ rDv IJ  d ُ l @  ʿ # vK3 O ف F  e   {q G #(߱ %$ 0Kld 73 Fd] GIG L.Q Q6^ ]y h).# z} YPr YP; FK Ko ʬ  ic } t MՍ ɂeQK ӰT WU | O ܄~ ޤ >K 3 9K [ d    I ( * > ,JdR ,g` ,g`> ,g`| 1 " 25% 3a 6k 7IH ;!k >% G-y N0J Q3 SA ^ _/ b b, bڅ iuPA t`Qz t` ztn ~7o ~7 ~7+ z s  sf  à _! xN# [T g 4I )3O  seG ڞk ڞ ڞ ػ ߆ " dd ]p y¡ G 1{ ^Ma ҅ FÓ !/pB 3Gy 3Gy 3\d 3^d 4K8 5J^% 7vzd\ 7vz 8Fq 8y: =Oq Q\cb RZ Zy _V ` eV<L jn nPN qlq .#g ru XyB !D   qT тi" ͤ  u."_csoq%pY\{(/M]=zG/Uc.g&sp%p<rpq/yOy%tXzP|lg|l @P;PPںNg|rNTF>Gmj rfCuڱĄ9O!\O s > %e"e(}Z-J..@2nua@uGxKUHbfggfVty1|>*P]YS]\"|o.oj7UIK#-^ߠ>Si7B@89 :;8? Remove Clip AddRemoveClip07B@89 871@0=8B5 :;8?>25Remove Selected Clips AddRemoveClip22AlsaDevicesPage33AlsaDevicesPage<html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">#AB@>9AB2>:</span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">AB8=A:>B> 8;8 28@BC0;=> ALSA 0C48> CAB@>9AB2> 70 87?>;720=5.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 50;=> CAB@>9AB2> 5 0C48> :0@B0B0, 8=AB0;8@0=0 2 A8AB5<0B0 28.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">8@BC0;=> CAB@>9AB2> 5 B0:>20, :>5B> 5 AJ74045=> 2 .asoundrc D09;0, </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">:>9B> G5AB> A5 =0<8@0 2J2 20H0B0 home ?0?:0.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">:> =5 AB5 A83C@=8, 87?>;7209B5 CAB@>9AB>2 ?> ?>4@0718@0=5, B>20 I5 87?>;720 0C48> CAB@>9AB2>B> </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">:>=D83C@8@0=> >B 20H0B0 48AB@81CF8O, 8;8 CAB@>9AB2>B>, :>5B> =>A8 8<5B> =0 20H0B0 0C48> :0@B0.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">>A;5, <>;O, C1545B5 A5, G5 =O<0 ?@>3@0<8, :>8B> 87?>;720B CAB@>9AB2>B>, </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">8=0G5 4@0925@0 =O<0 40 <>65 40 A5 8=8F80;878@0!</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">0 ?>25G5 8=D>@<0F8O 286B5 3;020 3.1: "The Driver Backend" 2 @J:>2>4AB2> =0 ?>B@518B5;O</p></body></html> [

Device:

The real or virtual ALSA device to be used.

A real device is the audiocard installed in your system.

A virtual device is one created in the .asoundrc file,

often located in your home folder.

If unsure, use either the default device, this will use the audiodevice

configured by your distribution, or the device that names your audio card.

In the latter case, please make sure no application uses the audiocard,

else the driver won't be able to initialize!

For more info see chapter 3.1: "The Driver Backend" of the User Manual

AlsaDevicesPageT<html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">@>9 5@8>48:</span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">C48>B> A5 >1@01>B20 =0 <0;:8 G0AB8, =0@5G5=8 ?5@8>48.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">"078 AB>9=>AB >?@545;O :>;:> >B B578 G0AB8 </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">I5 A5 87?>;720B >B 4@0925@0 =0 0C48> :0@B0B0.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">!B>9=>AB0 ?> ?>4@0718@0=5 B@O120 40 5 , 8 4020 >?B8<0;=0 DC=:F8>=0;=>AB =0 A8AB5<0B0.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">>=O:>30 >10G5, =O:>9 (;>H8) alsa 4@0925@8 =5 @01>BOB :>@5:B> </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">AJA B078 AB>9=>AB 2, 0:> 8<0B5 ?@5:JA20=8O 2 0C48>B>, </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><>;O >?8B09B5 40 87?>;720B5 3 ?5@8>40.</p></body></html>

Number of Periods:

Audio is managed in small chunks called periods.

This value determines how many of these chunks are

to be used by the driver of the audiocard.

The default should work just fine, and gives optimal latency behavior.

However, some (buggy) alsa drivers don't work correctly

with the default of 2, if you experience very choppy audio,

please try to use 3 periods.

AlsaDevicesPage j<html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Dither A5 87?>;720, 70 40 A5 =0?@028 0C48>B> ?>-G8AB>. </p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">09-4>1@8O =0G8= 40 A8 3> ?@54AB028<, 5 40 A8 ?@54AB028< @8AC=:0 A <=>3> B>G:8. :> 3;540B5 >B1;87> 28640B5 2AO:0 B>G:0, => :0@B8=0B0 =5 5 OA=0. :> 3;540B5 >10G5 >B40;5G5, :0@B8=0B0 AB020 ?>-G8AB0, 70I>B> >G8B5 8 <>7J:0 28 @07<820B B>G:8B5 8 A<5:G020B 87>1@065=85B>. ">20 5 <=>3> AC15:B82=> 8 >G5284=> 5 2J?@>A =0 ;8G5= 871>@ :J45 5 =09-4>1@5 40 A5 87?>;720 dither. 0 ?>25G5B> E>@0 B>20 A8 5 A0<> B5>@8O. A8G:> 5 =0 16 18B0, :>9 3> 5 3@860 70 :0G5AB2>B> 8;8 8<0 A2>1>4=> ?@>F5A>@=> 2@5<5 40 87?>;720 dither. Triangular 5 25@>OB=> =09-4>1@8O :><?@><8A <564C :0G5AB>2 8 =0B>20@20=5 =0 ?@>F5A>@0 (<=>3> 5 1J@7), => shaped 5 =09-:0G5AB25=</p></body></html>

Dither is used to make the audio cleaner.

The best way to describe it is to imagine a painting with many dots. If you view it up close you can see each dot and the image is not very clear. If you view it from far away the image becomes clearer because your eyes/brain dither the dots to smooth out the image. It is a murky subject and obviously a very personal choice as to what dither is the best. For most people it is just plain magic. Anyone running at 16bit who cares about quality or has CPU cycles to spare should run with dither. Triangular is probably the best compromise of quality vs cpu cost (its very fast), but shaped is the best

AlsaDevicesPageALSA CAB@>9AB2> ALSA DeviceAlsaDevicesPage#AB@>9AB>2DeviceAlsaDevicesPage.Dither (1C:2. B@5?B5=5)DitherAlsaDevicesPage $>@<0FormAlsaDevicesPageO<0NoneAlsaDevicesPage@>9 5@8>48Nr. of periodsAlsaDevicesPageRectangular RectangularAlsaDevicesPage ShapedShapedAlsaDevicesPageTriangular TriangularAlsaDevicesPageALSA @0925@: 5 <>65 40 A5 >B2>@8 70 ?@>A28@20=5 CAB@>9AB2>B> %1. @JI0<5 A5 :J< @568< A0<> 70?8A.VALSA Driver: Cannot open PCM device %1 for playback. Falling back to capture-only mode AlsaDriverALSA @0925@: #AB@>9AB2>B> 70 70?8A %1 5 705B>. >;O A?@5B5 ?@>3@0<0B0, :>OB> 3> 87?>;720 8 AB0@B8@09B5 >B=>2> Traverso.qALSA Driver: The capture device %1 is already in use. Please stop the application using it and run Traverso again AlsaDriverALSA @0925@: #AB@>9AB2>B> 70 ?@>A28@20=5 %1 5 705B>. >;O A?@5B5 ?@>3@0<0B0, :>OB> 3> 87?>;720 8 AB0@B8@09B5 >B=>2> Traverso.rALSA Driver: The playback device %1 is already in use. Please stop the application using it and run Traverso again AlsaDriverALSA @0925@: 5 <>30 40 :>=D83C@8@0< E0@4C5@0 - 87?>;720 ;8 3> =O:>O 4@C30 ?@>3@0<0?OALSA Driver: Unable to configure hardware, is it in use by another application? AlsaDriverALSA @0925@: O<0B5 ?@020 70 40 87?>;720B5 B>20 CAB@>9AB2> 70 70?8AOALSA Driver: You do not have permission to open the audio device %1 for capture AlsaDriverALSA @0925@: O<0B5 ?@020 70 40 87?>;720B5 B>20 CAB@>9AB2> 70 ?@>A28@20=5PALSA Driver: You do not have permission to open the audio device %1 for playback AlsaDriverALSA @0925@: snd_pcm_open(capture_handle, ...) =5 CA?O - =5?>7=0B0 3@5H:0MALSA Driver: snd_pcm_open(capture_handle, ...) failed with unknown error type AlsaDriverALSA: 5 <>65 40 A5 >B2>@8 70 70?8A CAB@>9AB2>B> %1. @JI0<5 A5 :J< @568< A0<> ?@>A28@20=5.OALSA: Cannot open PCM device %1 for capture. Falling back to playback-only mode AlsaDriverxsnd_pcm_open(playback_handle, ..) =5 CA?O - =5?>7=0B0 3@5H:0@snd_pcm_open(playback_handle, ..) failed with unknown error type AlsaDriver`<html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 8AC20=5B> =0 2J;=0B0 A :>=BC@ 5 ?>-45B09;=>, => 878A:20 ?@>F5A>@=> 2@5<5.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">:> 8<0B5 70102O=5 ?@8 <=>3> :;8?>25, 8;8 ?> 2@5<5 =0 0=8<8@0=> ?@52J@B0=5, @07<@0:8@09B5 B078 >?F8O!</p></body></html>9

Painting the waveform with an outline is more detailed, but requires more cpu.

If you experience slowness when painting many clips, or during animated scroll, unselect this option!

AppearenceConfigPage.03;0A8 F2OB =0 73;540Adjust theme colorAppearenceConfigPage0;8G=8 73;548Available themesAppearenceConfigPage!B8; =0 CB>= Button styleAppearenceConfigPage!<O=0B0 =0 578:0 =0 8=B5@D59A0 I5 2;575 2 A8;0 A;54 @50AB0@B8@0=5 =0 Traverso!RChanging the language of the Interface will take effect after restarting Traverso!AppearenceConfigPage(78: ?> ?>4@0718@0=5Default LanguageAppearenceConfigPage>'5@B09 ;8=88 =0 0 8 -6 45F815;0Draw lines at 0 and -6 dBAppearenceConfigPage $>@<0FormAppearenceConfigPage 07<5@ =0 :>=0 Icon sizeAppearenceConfigPage!0<> 8:>=8 Icons onlyAppearenceConfigPage&78: =0 =B5B@D59A0Interface LanguageAppearenceConfigPage78:LanguageAppearenceConfigPage: 8AC209 0C48>B> @5:B8D8F8@0=>Paint audio rectifiedAppearenceConfigPage2 8AC8209 0C48>B> A :>=BC@Paint audio with outlineAppearenceConfigPage@ 8AC209 AB5@5>B> :0B> <>=> 0C48> Paint stereo audio as mono audioAppearenceConfigPage6JB :J< D09;>25B5 A 873;548Path to theme filesAppearenceConfigPage\715@5B5 48@5:B>@8O =0 ?@>5:B0 ?> ?>4@0718@0=5Select default project dirAppearenceConfigPage715@8 !B8; Select styleAppearenceConfigPage$0AB@>9:8 =0 !B8;0 Style OptionsAppearenceConfigPage""5:AB ?>4 8:>=8B5Text below IconsAppearenceConfigPage "5:AB 4> 8:>=8B5Text beside IconsAppearenceConfigPage!0<> B5:AB Text onlyAppearenceConfigPage 73;54ThemeAppearenceConfigPage(0AB@>9:8 =0 73;540 Theme OptionsAppearenceConfigPage71>@ =0 73;54Theme selectorAppearenceConfigPage&5=B8 A 8=AB@C<5=B8ToolbarsAppearenceConfigPage> 07<5@ =0 "@0=A?>@B=0B0 >=7>;0Transport Console sizeAppearenceConfigPageB7?>;7209 ?0;5B0 =0 871@0=8O AB8;Use selected style's paletteAppearenceConfigPage0@548 B@0: Arm Tracks ArmTrackslC48>#AB@>9AB2>B> =O<0 B>78 1CA 70 70?8A: %1 ("@0: %2)8AudioDevice doesn't have this Capture Bus: %1 (Track %2) AudioClip>@<0;878@0=5 Normalization AudioClipB@5<0E=8 70B8E20=8OB0/CA8;20=8OB0 Remove Fades AudioClip60409 =82> 70 >@<0;878@0=5Set Normalization level: AudioClip(@52:;NG8 0:;NG20=5 Toggle Lock AudioClip*@52:;NG8 03;CH020=5 Toggle Mute AudioClip85 <>30 40 70?8A20< =0 B@0:0Unable to Record to Track AudioClip &> ?>4@0718@0=5&DefaultAudioClipEditDialog&8=59=>&LinearAudioClipEditDialog72820=5BendingAudioClipEditDialog$0@0<5B@8 =0 ;8?0Clip ParametersAudioClipEditDialog 80;>3DialogAudioClipEditDialog@09EndAudioClipEditDialog J=H=0 1@01>B:0External ProcessingAudioClipEditDialog#A8;20=5Fade InAudioClipEditDialog0B8E20=5Fade OutAudioClipEditDialog,0B8E20=8O / #A8;20=8OFadesAudioClipEditDialog#A8;20=5GainAudioClipEditDialogJ;68=0LengthAudioClipEditDialog  568<ModeAudioClipEditDialog<5NameAudioClipEditDialog!8;0StrengthAudioClipEditDialog"5:AB>2B8:5B TextLabelAudioClipEditDialog0G0;> =0 B@0:0 Track startAudioClipEditDialogGG:<<:AA:AAA hh:mm:ss.sssAudioClipEditDialog,;8?: J=H=0 1@01>B:0Clip: External ProcessingAudioClipExternalProcessing*!5;5:F8O: >1028 ;8?Selection: Add ClipAudioClipManager !5;5:F8O: <J:=8Selection: InvertAudioClipManager.!5;5:F8O: @5<0E=8 ;8?Selection: Remove ClipAudioClipManager`A8G:8 D09;>25 (*);;C48> D09;>25 (*.wav *.flac))All files (*);;Audio files (*.wav *.flac) AudioClipViewN;8:=5B5 70 40 2J7AB0=>28B5 C48>$09; !Click to reset AudioFile ! AudioClipView"O<0 871@0= D09;!No file selected! AudioClipViewDJ7AB0=>28 C48> $09;0 70 ;8?: %1Reset Audio File for Clip: %1 AudioClipViewN#A?5H=> 15 704045= C48>;8? D09; 70 %1$Succesfully set AudioClip file to %1 AudioClipViewC48>#AB@>9AB2>: 0A5G5=> 5 ?@5:JA20=5 =0 1CD5@ "Storm", ?@52:;NG20< =0 C;52 @0925@HAudioDevice:: Buffer underrun 'Storm' detected, switching to Null Driver AudioDeviceC48>#AB@>9AB2>: 0 @5H020=5 =0 B>78 ?@>1;5<, <>;O 286B5 ;020 11 >B @J:>2>4AB2>B> =0 ?>B@518B5;O\AudioDevice:: For trouble shooting this problem, please see Chapter 11 from the user manual! AudioDevicefC48>#AB@>9AB2>: =5 <>65 40 A5 AJ74045 ALSA 4@0925@-Audiodevice: Failed to create the ALSA Driver AudioDevicepC48>#AB@>9AB2>: =5 <>65 40 A5 AJ74045 CoreAudio 4@0925@2Audiodevice: Failed to create the CoreAudio Driver AudioDevicefC48>#AB@>9AB2>: =5 <>65 40 A5 AJ74045 Jack 4@0925@-Audiodevice: Failed to create the Jack Driver AudioDevicepC48>#AB@>9AB2>: =5 <>65 40 A5 AJ74045 PortAudio 4@0925@2Audiodevice: Failed to create the PortAudio Driver AudioDevicerC48>#AB@>9AB2>: =5 <>65 40 A5 AJ74045 PulseAudio 4@0925@3Audiodevice: Failed to create the PulseAudio Driver AudioDevice:O<0 :>=D83C@8@0=> CAB@>9AB2>No Device Configured AudioDevice(5 5 70@545= 4@0925@No Driver Loaded AudioDevice0Jack AJ@2J@0 15H5 A?@O=!"The Jack server has been shutdown! AudioDevice5 <>65 40 A5 704045 ?@8>@8B5B  50;=> @5<5 =0 =8H:0B0 =0 C48>#AB@>9AB2>B>!!! ">20 =09-25@>OB=> I5 4>2545 4> =5AB018;=> ?@>A28@20=5/70?8A 8 <=>3> 1CD5@=8 ?@5:JA20=8O (==?@5:JA20=8O 2 72C:0).  ?>-;>H8 A;CG08 @01>B0B0 =0 ?@>3@0<0B0 AJI> <>65 40 A5 =0@CH8! >;O >A83C@5B5 =5>1E>48<8O ?@8>@8B5B ( 50;=> 2@5<5) =0 ?@>3@0<0B0!!!Unable to set Audiodevice Thread to realtime priority!!!This most likely results in unreliable playback/capture and lots of buffer underruns (== sound drops).In the worst case the program can even malfunction!Please make sure you run this program with realtime privileges!!!AudioDeviceThread 2205022050AudioDriverConfigPage 3200032000AudioDriverConfigPage 4410044100AudioDriverConfigPage 4800048000AudioDriverConfigPage 8820088200AudioDriverConfigPage 9600096000AudioDriverConfigPage<html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">0:JA=5=85 =0 CD5@0:</span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">0:JA=5=85B> ?@54AB025=> >B @07<5@0 =0 0C48> 1CD5@0.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">O:>8 E>@0 8<0B =C640 >B <0;:> 70:JA=5=85, 0:> 285 =O<0B5 =C640, </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">8;8 =5 7=05B5 :0:2> >7=0G020 B>20, <>;O >AB025B5 AB>9=>AB0 ?> ?>4@0718@0=5!</p></body></html>`

Buffer latency:

The latency introduced by the size of the audio buffers.

Some people need low latencies, if you don't need it,

or don't know what it means, please leave the default setting!

AudioDriverConfigPage<html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">C?;:A @568<:</span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">?@545;O 40;8 8 420B0 1CA0 - 70 0?8A 8 *7?@>8725640=5 </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">=0 20H0B0 :0@B0 I5 A5 87?>;720B, </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">8;8 A0<> 548=8O >B BOE.</p></body></html>

Duplex mode:

Defines if both the Playback and Capture buses

of your soundcard are to be used,

or only the Playback or Capture bus(es).

AudioDriverConfigPage<html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">!5<?;8@0I0 G5AB>B0:</span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">!5<?;8@0I0B0 G5AB>B0, :>OB> :0@B0B0 87?>;720.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">>28B5 ?@>5:B8 I5 87?>;720B B078 A5<?;8@0I0 G5AB>B0 </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">:0B> A5<?;8@0I0 G5AB>B0 =0 ?@>5:B0 ?@8 AJ74020=5B> <C.</p></body></html>'

Sample rate:

The sample rate used by the audio card.

New projects will use this samplerate as

the project's sample rate on creation.

AudioDriverConfigPage(0:JA=5=85 =0 CD5@0Buffer latency (ms)AudioDriverConfigPage 0?8ACaptureAudioDriverConfigPage*>=D83C@8@09 @0925@0Configure driverAudioDriverConfigPage"71>@ =0 @0925@:Driver SelectionAudioDriverConfigPage@0925@:Driver:AudioDriverConfigPageC?;5:A @568< Duplex modeAudioDriverConfigPage< 07@5H8 Jack transport controlEnable Jack transport controlAudioDriverConfigPage $>@<0FormAudioDriverConfigPage J;5=FullAudioDriverConfigPageJackJackAudioDriverConfigPage@>A28@20=5PlaybackAudioDriverConfigPage. 5AB0@B8@0=5 =0 @0925@Restart DriverAudioDriverConfigPage$!5<?;8@0I0 G5AB>B0 Sample rateAudioDriverConfigPage !8AB5<5= @0925@System defaultAudioDriverConfigPageC48> 87B>G=8F8 AudioSourcesAudioSourcesManagerWidget $>@<0FormAudioSourcesManagerWidget2@5<0E=8 2A8G:8 87B>G=8F8Remove all sourcesAudioSourcesManagerWidget$@5<0E=8 87B>G=8F8 Remove sourceAudioSourcesManagerWidget"@5<0E=8 87B>G=8:Remove sourcesAudioSourcesManagerWidgetB@5<0E=8 =587?>;720=8B5 87B>G=8F8Remove unused sourcesAudioSourcesManagerWidgetL<html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">078 :C@A>@0 2 ?>;57@5=85B> ?@8 70?8A 8 ?@>A28@20=5.</p></body></html>

Keep the play cursor in view while playing or recording.

BehaviorConfigPage=8<8@0=>AnimatedBehaviorConfigPage 8B09AskBehaviorConfigPage.0AB@>9:8 =0 0C48> :;8?Audio Clip SettingsBehaviorConfigPageL0AB@>9209 0C48>B> ?> 2@5<5 =0 2;0G5=5(Continuously adjust audio while draggingBehaviorConfigPage5 70?07209 Don't saveBehaviorConfigPage $>@<0FormBehaviorConfigPage!:>:JumpBehaviorConfigPage^0@548 ?>A;54=> 87?>;720< ?@>5:B ?@8 AB0@B8@0=5!Load last used project at startupBehaviorConfigPageR0:;NG209 0C48> :;8?>25B5 ?> ?>4@0718@0=5Lock Audio Clips by defaultBehaviorConfigPageNew Sheet SettingsBehaviorConfigPage@>9 B@0:>25Number of tracksBehaviorConfigPage@8 70B20@O=5: On close:BehaviorConfigPage00AB@>9:8 70 ?@>A28@20=5Playback SettingsBehaviorConfigPage(0AB@>9:8 =0 ?@>5:B0Project SettingsBehaviorConfigPage 0?078SaveBehaviorConfigPage(@52J@B8 ?@>A28@20=5Scroll playbackBehaviorConfigPage AB0=8 2 F5=BJ@0 Stay CenteredBehaviorConfigPage 420B0BothBusSelectorDialog71>@ =0 1CA Bus SelectorBusSelectorDialogCA>25 70 70?8A Capture BusesBusSelectorDialog 0=0;8ChannelsBusSelectorDialogO2>LeftBusSelectorDialog*CA>25 70 ?@>A28@20=5Playback BusesBusSelectorDialog OA=>RightBusSelectorDialog"@0:TrackBusSelectorDialog12x12xCDWritingDialog16x16xCDWritingDialog1x1xCDWritingDialog20x20xCDWritingDialog24x24xCDWritingDialog28x28xCDWritingDialog2x2xCDWritingDialog32x32xCDWritingDialog36x36xCDWritingDialog40x40xCDWritingDialog44x44xCDWritingDialog48x48xCDWritingDialog4x4xCDWritingDialog8x8xCDWritingDialog@5:@0B8AbortCDWritingDialog.#AB@>9AB2> 70 70?8A20=5Burning DeviceCDWritingDialogCD 70?8A CD WritingCDWritingDialog>7G8A;8 8 ?@8;>68 =>@<0;878@0=5!Calculate and apply normalizationCDWritingDialog0B2>@8CloseCDWritingDialogf:A?>@B8@09 wav 8 toc D09;>25 A0<> (=5 70?8A209 CD).Export wav and toc files only (don't write CD)CDWritingDialog"A=>2=8 =0AB@>9:8General OptionsCDWritingDialog=D>@<0F8O InformationCDWritingDialog><5@ =0 :>?8ONumber of copiesCDWritingDialog!8<C;0F8OSimulateCDWritingDialog!:>@>ABSpeedCDWritingDialog"0?>G=8 0?8A20=5 Start WritingCDWritingDialog!JAB>O=85StatusCDWritingDialogWrite all SheetsCDWritingDialog 0?8H8Write current SheetCDWritingDialog02B>autoCDWritingDialog!5;5:B8@09 ;8? Select Clip ClipSelection*!5;5:F80: >1028 ;8?Selection: Add Clip ClipSelection.!5;5:F8O: @5<0E=8 ;8?Selection: Remove Clip ClipSelection2<J:=8 %n 0C48> D09;(>25)Import %n audiofile(s) ClipsViewPort.>1028 ">G:0 =0 :@820B0 Add CurveNodeCurve2@5<0E=8 ">G:0 =0 :@820B0Remove CurveNodeCurven5G5 8<0 B>G:0 B>G=> =0 B078 ?>78F8O, =5 A5 4>102O =>20FThere is allready a node at this exact position, not adding a new nodeCurve7G8AB8 ">G:0 Clear Nodes CurveView;0G8 ">G:0 Drag Node CurveView B:068CancelDialog 80;>3DialogDialogOKDialog&8D@>2 G0A>2=8: Digital Clock DigitalClockR@><5=8 =0AB@>9:8B5 =0 C48> #AB@>9AB2>B>Change Audio Device settings DriverInfo-- ExportDialog*@5:@0B8 :A?>@B8@0=5 Abort Export ExportDialog0B2>@8Close ExportDialog:A?>@B8@09Export ExportDialog4:A?>@B8@09 2A8G:8 ;>B>25Export all Sheets ExportDialog2:A?>@B8@09 =0AB>OI SheetExport current Sheet ExportDialog,:A?>@B8@09 8@5:B>@8OExport directory ExportDialog,!B0BCA =0 :A?>@B8@0=5 Export status ExportDialog"A=>2=8 0AB@>9:8General Options ExportDialog(0?>G=8 :A?>@B8@0=5 Start Export ExportDialog <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">"078 >?F8O =0<0;O20 @07<5@0 =0 =O:>9 D09;>25 A ?;020I0 70?5B0O 4> 10% G@57 5;8<8=8@0=5 =0 >?@545;5=0 8=D>@<0F8O :>OB> =0 ?@0:B8:0 =O<0 >B=>H5=85 :J< :0G5AB2>B> =0 72C:0.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">0:0@ G5 B5E=8G5A:8 B>20 25G5 87;870 >B @0<:8B5 =0 :><?@5A8OB0 157 703C10, >AB020B 2A8G:8 ?@548<AB20 =0 ?;020I0B0 70?5B0O, (&gt;600 dB 48=0<8:0, 157 :;8?8@0=5 , 25 18B>20 @57>;NF8O). </p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">">20 AJI> >:0720 2;8O=85 =0 3>;O<0B0 :><?@5A8O A F5;8 G8A;0, :0B> >3@0=8G020 @57>;NF8OB0 4> 24 18B0.</p></body></html>B

This option reduces the storage of some floating-point data files by up to about 10% by eliminating some information that has virtually no effect on the audio data.

While this does technically make the compression lossy, it retains all the advantages of floating point data (>600 dB of dynamic range, no clipping, and 25 bits of resolution).

This also affects large integer compression by limiting the resolution to 24 bits.

ExportFormatOptionsWidget!@545= 8B@59BAverage BitrateExportFormatOptionsWidget09-28A>:>BestExportFormatOptionsWidgetBitdepthBitdepthExportFormatOptionsWidget8B@59BBitrateExportFormatOptionsWidget 0=0;8ChannelsExportFormatOptionsWidget84 :><?@5A8OCompression typeExportFormatOptionsWidget60G5AB2> =0 ?@5>1@07C20=5B>Conversion qualityExportFormatOptionsWidget>48@0=5EncodingExportFormatOptionsWidget"5B>4 =0 5=:>48=3Encoding MethodExportFormatOptionsWidgetH0AB@>9:8 =0 D>@<0B0 70 5:A?>@B8@0=5Export Format OptionsExportFormatOptionsWidget J@7>FastExportFormatOptionsWidget"8? $09; File TypeExportFormatOptionsWidget(0AB@>9:8 =0 D>@<0B0Format OptionsExportFormatOptionsWidget 8A>:>HighExportFormatOptionsWidgetMp3 =0AB@>9:8 MP3 OptionsExportFormatOptionsWidget$0:A8<0;5= 8B@59BMaximum BitrateExportFormatOptionsWidget !@54=>MediumExportFormatOptionsWidget"8=8<0;5= 18B@59BMinimum BitrateExportFormatOptionsWidget$>@<0;878@09 C48>Normalize AudioExportFormatOptionsWidgetOgg =0AB@>9:8 Ogg OptionsExportFormatOptionsWidget@0G5AB2> (>-1J@7> <-> >-4>1@>)Quality (Fastest <-> Best)ExportFormatOptionsWidget@0G5AB2> (>-<0;J: <-> >-4>1J@)Quality (Smallest <-> Best)ExportFormatOptionsWidget$!5<?;8@0I0 G5AB>B0 Sample RateExportFormatOptionsWidgetL@>?CA=8 WVX 70 4>?J;=8B5;=0 :><?@5A8O.Skip WVX for extra compression (semi-lossless)ExportFormatOptionsWidgetRWavePack =0AB@>9:8 (:><?@5A8O 157 703C10)&WavPack options (lossless compression)ExportFormatOptionsWidgetF0;8G=8 0@3C<5=B8 70 sox ?@>3@0<0B0'Available arguments for the sox programExternalProcessingDialog<@>3@0<0B0 <b>%1</b> ?@5:JA=0!Program %1 crashed!ExternalProcessingDialog@>3@0<0B0 <b>%1</b> =5 5 8=AB0;8@0=0, 8;8 =O<0 4>AB0BJG=> ?>72>;5=8O 40 A5 AB0@B8@0!DProgram %1 not installed, or insufficient permissions to run!ExternalProcessingDialog|"@O120 40 ?>4045B5 0@3C<5=B ?@548 40 AB0@B8@0B5 2J=H5= ?@>F5A!DYou have to supply an argument before starting the external process!ExternalProcessingDialog$0A8;20=5: 87282:0 Fade In: bendFadeBend$0B8E20=5: 87282:0Fade Out: bendFadeBendD0AB@>9:8 =0 0A8;20=5 / 0B8E20=5 Fade Preset FadeCurve 0A8;20=5: D>@<0Fade In: shapeFadeMode 0B8E20=5: D>@<0Fade Out: shapeFadeMode$0A8;20=5: 4J;68=0Fade In: length FadeRange&0A8;20=5: ?@5<0E=8Fade In: remove FadeRange$0B8E20=5: 4J;68=0Fade Out: length FadeRange&0B8E20=5: ?@5<0E=8Fade Out: remove FadeRange0A8;20=5: A8;0Fade In: strength FadeStrength0B8E20=5: A8;0Fade Out: strength FadeStrength>O ><?NBJ@ My Computer FileWidget>8B5 >:C<5=B8 My Documents FileWidget >@=0 8@5:B>@8OParent Directory FileWidget2?@5A=8 873;540 A D09;>25Refresh File View FileWidget"A8G:8 D09;>25(*) All files (*)ImportdC48> D09;>25(*.wav *.flac *.ogg *.mp3 *.wv *.w64)1Audio files (*.wav *.flac *.ogg *.mp3 *.wv *.w64)Import"<J:=8 C48> $09;Import Audio FileImport*<J:=8 0C48> 87B>G=8:Import audio sourceImport<J:=8 "8H8=0Insert SilenceImport "8H8=0SilenceImport>1028 0@:5@8 Add MarkersImportClipsDialog(<J:=8 C48> ;8?>25Import Audio ClipsImportClipsDialog<J:=8 2 "@0::Import to Track:ImportClipsDialogF><0=4=0 >102:0 %1 =5 15 =0<5@5=0!Command Plugin %1 not found! InputEnginez59AB28OB0 AJA 704J@60=5 =0 A5 ?>44J@60B >B :>=B5:AB=>B> <5=N0Hold actions are not supported from Context Menu InputEngine59AB28OB0 =0 >?@545;OI8B5 :;028H8 =5 A5 ?>44J@60B >B :>=B5:AB=>B> <5=N8Modifier key actions are not supported from Context Menu InputEngineB>102:0 %1 =5 ?>44J@60 ><0=40 %2&Plugin %1 doesn't implement Command %2 InputEngine<J:=8 "8H8=0Insert SilenceInsertSilenceDialog.<J:=8 "8H8=0 (A5:C=48)Insert Silence (seconds):InsertSilenceDialog %1: %2%1: %2 Interface$&B=>AB=> Traverso&About Traverso Interface&CD 70?8A&CD Writing... Interface& 540:F8O&Edit Interface&:A?>@B &Export... Interface& 0G0;>B>&Getting Started Interface &><>I&Help Interface*&#?@02;5=85 =0 @>5:B&Manage Project... Interface&>2...&New... Interface&B2>@8...&Open... Interface&0AB@>9:8&Preferences... Interface&@>5:B&Project Interface &7E>4&Quit Interface.$09;>2 $>@<0B 70 &0?8A&Recording File Format Interface20G5AB2> =0 & 5A5<?;8@0=5&Resample Quality Interface2&JAB0=>28 @575@2=> :>?85&Restore Backup... Interface&0?078&Save Interface &;>B&Sheet Interface&>:068 D5:B8 &Show Effects Interface&0E20I0=5&Snap Interface6& J:>2>4AB2> =0 ?>B@518B5;O &User Manual Interface&>:068&View Interface<b>?8A0=85</b>Description Interface><b>>A;54>20B5;=>AB :;028H8</b>Key Sequence InterfaceX8@5:B>B8OB0 =0 ?@>5:B0 5 ?@><5=5=0 872J= Traverso ">20  ! ?>44J@60! >;O >B<5=5B5 ?@><5=8B5 A530! :> 8A:0B5 40 ?@58<5=C20B5 @>5:B, 87?>;7209B5 #?@02;5=85 =0 @>5:B!A Project directory changed outside of Traverso. This is NOT supported! Please undo this change now! If you want to rename a Project, use the Project Manager instead! Interface0 TraversoAbout Traverso InterfacedC48> D09;>25(*.wav *.flac *.ogg *.mp3 *.wv *.w64)1Audio files (*.wav *.flac *.ogg *.mp3 *.wv *.w64) Interface09-4>1@>Best InterfaceH>48@0=5B> =0 70?8A0 5 A<5=5=> =0 %1$Changed encoding for recording to %1 InterfaceV0G5AB2>B> =0 @5A5<?;8@0=5 ?@><5=5=> =0: %1Changed resample quality to: %1 Interface,>@5;0F8>=5= =48:0B>@Correlation Meter Interface 540:F8OEdit InterfaceFFT A?5:BJ@ FFT Spectrum Interface J@7>Fast Interface 8A>:>High InterfaceAB>@8OHistory Interface<J:=8 &C48>Import &Audio... Interface<J:=8 "8&H8=0Insert Si&lence... Interfacen078 :C@A>@0 2 ?>;57@5=85B> ?@8 70?8A 8 2J7?@>8725640=54Keep play cursor in view while playing or recording. Interface& 540:B>@ =0 <0@:5@8Marker Editor... Interface !@54=>Medium Interface>2 &;>B(>25)New &Sheet(s)... Interface>2 &"@0:(>25)New &Track(s)... Interface(B2>@8 C48> $09;>25Open Audio Files InterfacehB20@O  J:>2>4AB2> =0 >B@518B5;O 2J2 2J=H0 ?@>3@0<0(Opening User Manual in external browser! Interface @>5:BProject Interface!BJ?:0 =0?@54Redo Interface OAB> 70 @5AC@A8 Resources Bin Interface*@&52J@B8 ?@>A28@20=5S&croll Playback Interface0&AB@>9:8 Se&ttings Interfacev>:068 ;8=8OB0 =0 4>102:8B5 8 02B><0B870F8OB0 =0 B@0:>25B53Show effect plugins and automation curves on tracks Interfacen0E20=8 >15:B0 70 :@08I0B0 =0 4@C38 >15:B8 ?@8 2;0G5=5.2Snap items to edges of other items while dragging. Interface.=D>@<0F8O 70 !8AB5<0B0System Information InterfaceL@>5:B0 '%1' =5 <>65 40 A5 70@548 ?>@048 A;54=8B5 ?@8G8=8: '%2' !530 I5 2848B5 A?8AJ: A =0;8G=8B5 @575@2=8 :>?8O (0:> 8<0 B0:820) 70 40 2J7AB0=>28B5 @>5:B0 >B BOE.The requested Project `%1` could not be loaded for the following reason: '%2' You will now be given a list of available backups (if any) to restore the Project from. Interface*>=7>;0 70 C?@02;5=85Transport Console InterfaceTTraverso %1 (AJA Qt %2)=>3>B@0:>20 ?@>3@0<0 70 70?8A 8 >1@01>B:0 =0 0C48>.86B5 ><>I=>B> <5=N 70 ?>25G5 8=D>@<0F8O.Traverso 5 @50;878@0= >B R. Sijrier 8 4@C38,2:;NG8B5;=> 2A8G:8 E>@0 >B Free Software world:>8B> A?><>3=0E0 A B5E=>;>388B5, =0 :>8B> Traverso 5 1078@0= (Gcc, Qt, Xorg, Linux, 8 B.=.)KTraverso %1 (built with Qt %2) A multitrack audio recording and editing program. Look in the Help menu for more info. Traverso is brought to you by R. Sijrier and others, including all the people from the Free Software world who contributed the important technologies on which Traverso is based (Gcc, Qt, Xorg, Linux, and so on) Interface Traverso - 06=>Traverso - Important InterfaceXTraverso - 0@5640=5B> =0 ?@>5:B 5 =5CA?5H=>Traverso - Project load failed Interface!BJ?:0 =0704Undo InterfacedJack 4@0925@: @J7:0B0 AJA Jack AJ@2J@0 5 CA?5H=0!7Jack Driver: Connected successfully to the jack server! JackDriverJack 4@0925@: 5 <>65 40 A5 >AJI5AB28 2@J7:0 A jack AJ@2J@, AB0@B8@0= ;8 5 jack?BJack Driver: Couldn't connect to the jack server, is jack running? JackDriver<html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Bitstream Vera Sans; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">@5:JA20=5 70 42>9=> AJ18B85: (<A)</p></body></html>Z

Double fact timeout (ms)

KeyboardConfigPage<html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Bitstream Vera Sans; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">@5:JA20=5 70 704J@60=5 =0 :;028H (<A)</p></body></html>S

Hold timeout (ms)

KeyboardConfigPage^<html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">@5:JA20=5 70 42>9=> AJ18B85:</span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">0:A8<0;=>B> 2@5<5 2 <8;8A5:C=48 <564C 425 =0B8A:0=8O =0 :;028H </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">70 40 A5 >?@545;8 40;8 8<0<5 42>9=> =0B8A:0=5 ( &lt;&lt; K &gt;&gt; or &lt;&lt; KK &gt;&gt;)</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 8;8 ?@>AB> 425 >B45;=8 =0B8A:0=8O =0 :;028H ( a &lt; K &gt; and &lt; K &gt; action, </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">8;8 &lt; KK &gt; 8 &lt; KK &gt; AJ18B8O =0?@8<5@).</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">?8B=8B5 ?>B@518B5;8 18E0 <>3;;8 40 87?>;720B AB>9=>AB 4> 150 <A, </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">0:> 2A5 >I5 AB5 =5>?8B=8, <>;O >AB025B5 AB>9=>AB0 =0 180 <A.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">0 ?>25G5 8=D>@<0F8O,286B5 3;020 7: ;028H=8 459AB28O. 2  J:>2>4AB2> =0 >B5@18B5;O</p></body></html>

Double fact timeout:

The maximum time in miliseconds between 2 key presses

to determine if the 2 key presses are a double fact ( << K >> or << KK >>)

or 2 individual key presses ( a < K > and < K > action,

or < KK > and < KK > action for example).

Experienced users can set this value as low as 150 ms,

if you don't have much experience yet, please leave the default of 180 ms.

For more information, see chapter 7: Key Actions. of the User Manual

KeyboardConfigPage<html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">@5:JA20=5 70 704J@60=5 =0 :;028H:</span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">0:A8<0;=>B> 2@5<5, 70 40 A5 >BG5B5 704J@60=5 =0 :;028H, </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">:0B> [ K ] 8;8 [ KK ].</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">>;:>B> ?>-<0;:> 5 2@5<5B>, B>;:>20 ?>-1J@7> 54=> =0B8A:0=5 </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><>65 40 A5 >?@545;8 :0B> 704J@60=5. </p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">?8B=8B5 ?>B@518B5;8 18E0 <>3;;8 40 87?>;720B AB>9=>AB 4> 110 <A, </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">0:> 2A5 >I5 AB5 =5>?8B=8, <>;O >AB025B5 AB>9=>AB0 =0 150 <A.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">0 ?>25G5 8=D>@<0F8O,286B5 3;020 7: ;028H=8 459AB28O. 2  J:>2>4AB2> =0 >B5@18B5;O.</p></body></html>7

Hold timeout:

The maximum time to consider a pressed key a hold key fact,

like [ K ] or [ KK ].

The shorter this time, the sooner a pressed key will be

detected as a hold action.

Experienced users can set this value as low as 110 ms,

if you don't have much experience yet, please leave the default of 150 ms.

For more information, see chapter 7: "Key Actions" of the User Manual.

KeyboardConfigPage8>=D83C@0F8O =0 :;0280BC@0B0Configure KeyboardKeyboardConfigPage$:A?>@B8@09 89<0? Export KeymapKeyboardConfigPage $>@<0FormKeyboardConfigPage,:A?>@B8@0=5 =0 :89<0? KeyMap ExportKeyboardConfigPage 89<0?KeymapKeyboardConfigPageF5 5 4045=> >?8A0=85 70 B>78 :89<0?"No description set for this keymapKeyboardConfigPage @8=B8@09 89<0? Print KeymapKeyboardConfigPage715@8 89<0? Select keymapKeyboardConfigPageb:A?>@B8@0=8O :89<0? <>65 40 1J45 =0<5@@5= BC: %1+The exported keymap can be found here: %1KeyboardConfigPage=3;89A:8English LanguageName&B<5=8&Cancel MarkerDialog&:A?>@B8@09&Export MarkerDialog&:&Ok MarkerDialog&@5<0E=8&Remove MarkerDialog...... MarkerDialog"@8;>68 70 2A8G:8 Apply to all MarkerDialog@0=6L>@: Arranger: MarkerDialogCD TextCD-Text MarkerDialog.CD-"5:AB =5704J;68B5;=>CD-Text optional MarkerDialog><?>78B>@: Composer: MarkerDialog,0I8B0 ?@>B82 :>?8@0=5Copy protection MarkerDialog ISRC:ISRC: MarkerDialog0@:5@8Markers MarkerDialog!J>1I5=85:Message: MarkerDialog0AB@>9:8Options MarkerDialog7?J;=8B5;: Performer: MarkerDialog>78F8OPosition MarkerDialog*>78F8O: (:!!:75=8)Position: (MM:SS:75ths) MarkerDialog@5- =01;O30=5 Pre-Emphasis MarkerDialog 2B>@ =0 ?5A5=B0 Songwriter MarkerDialog03;0285Title MarkerDialog03;0285:Title: MarkerDialog>?8@09 ;8? Copy ClipMoveClip 073J=8 0@:5@8 Fold MarkersMoveClip 073J=8 ;>B Fold SheetMoveClip 073J=8 "@0: Fold TrackMoveClip5AB8 ;8? Move ClipMoveClip(@5<5AB8 ;8?  @0OMove Clip To EndMoveClip0@5<5AB8 ;8?  0G0;>B>Move Clip To StartMoveClip$5AB8 @09 =0 ;8?Move Clip EdgeMoveEdge......NewProjectDialogdC48> D09;>25(*.wav *.flac *.ogg *.mp3 *.wv *.w64)1Audio files (*.wav *.flac *.ogg *.mp3 *.wv *.w64)NewProjectDialogN>?8@09 D09;>25 2 ?@>5:B=0B0 48@5:B>@8OCopy files to project directoryNewProjectDialogB5 <>65 40 A5 AJ74045 ?@>5:B (%1)Couldn't create project (%1)NewProjectDialog?8A0=85 DescriptionNewProjectDialog@0A5= @>5:B Empty ProjectNewProjectDialog=65=5@EngineerNewProjectDialog$09;FileNewProjectDialog(<J:=8 C48> $09;>25Import Audio FilesNewProjectDialog<5NameNewProjectDialog>2 @>5:B New ProjectNewProjectDialog5NoNewProjectDialog ><5@ =0 ;>B>25Number of SheetsNewProjectDialog"B2>@8 C48> $09;Open Audio FilesNewProjectDialog@>5:B0 %1 25G5 AJH5AB2C20, 8A:0B5 ;8 40 3> ?@5<0E=5B5 8 70<5=8B5 A =>2?YThe Project "%1" already exists, do you want to remove it and replace it with a new one ?NewProjectDialog<5 =0 "@0: Track NameNewProjectDialog"@0:>25 2 ;>BTracks per SheetNewProjectDialog"Traverso - J?@>ATraverso - QuestionNewProjectDialog 7?>;7209 H01;>= Use TemplateNewProjectDialog0YesNewProjectDialog@"@O120 40 4045B5 8<5 =0 ?@>5:B0!'You must supply a name for the project!NewProjectDialog&>1025=8 %n ;>B(0)Added %n Sheet(s)NewSheetDialogn5 <>65 40 A5 AJ74020 =>2 ;>B 0:> =5 5 70@545= @>5:B!:I can't create a new Sheet if there is no Project loaded!!NewSheetDialog<5 =0 >2 ;>BNew Sheet nameNewSheetDialog>2 ;>B(>25) New Sheet(s)NewSheetDialog@>9 ;>B>25 Sheet countNewSheetDialog@>9 "@0:>25 Track countNewSheetDialog 7?>;7209 (01;>= Use TemplateNewSheetDialog&>1025=8 %n "@0:(0)Added %n Track(s)NewTrackDialogp5 <>65 40 A5 AJ74020 =>2 "@0: 0:> =5 5 70@545= @>5:B!!:I can't create a new Track if there is no Project loaded!!NewTrackDialog>2 "@0; New Track(s)NewTrackDialog@>9 "@0:>25 Track countNewTrackDialog<5 =0 "@0: Track nameNewTrackDialogD<p><5B> =0 48@5:B>@8OB0 =0 ?@>5:B0 <b>%1</b> 5 @07;8G=> >B 8<5B> =0 @>5:B0 <b>%2</b>!</p><p>@58<5=C20;8 ;8 AB5 ?@>5:B=0B0 48@5:B>@8O ? </p><p>>;O ?@58<5=C209B5 48@5:B>@8OB0 >B=>2> A 8<5B> =0 @>5:B0 <b>%1</b>, 8 ?@><5=5B5 703;0285B> =0 @>5:B0 G@57 480;>30 70 #?@02;5=85 =0 @>5:B8!</p>

Project directory name %1 is different from the Project title %2!

Did you rename the Project directory ?

Please rename the directory back to the Project title %1, and change the Project title with the Project Manager Dialog!

OpenProjectDialog!83C@=8 ;8 AB5, G5 8A:0B5 40 ?@5<0E=5B5 ?@>5:B0 %1? ">20 459AB285 =5 <>65 40 A5 >B<5=8!TAre you sure that you want to remove the project %1 ? It's not possible to undo it !OpenProjectDialogz715@5B5 AJI5AB2C20I0 8;8 AJ7409B5 =>20 48@5:B>@8O 70 @>5:B04Choose an existing or create a new Project DirectoryOpenProjectDialogf!J74045=0 5 =>20 @>5:B=0 48@5:B>@8O 70 20A BC::%1 /Created new Project directory for you here: %1 OpenProjectDialog!J74045= =0: Created on:OpenProjectDialog 7B@89DeleteOpenProjectDialog?8A0=85: Description:OpenProjectDialog 0@548LoadOpenProjectDialog&O<0 871@0= @>5:B!No Project selected!OpenProjectDialogB2>@8 @>5:B Open ProjectOpenProjectDialogt>;O, ?@>25@5B5 70 B078 48@5:B>@8O 8;8 8715@5B5 4@C30: %1FPlease check permission for this directory or choose another one: %1OpenProjectDialogf>;O, ?@>25@5B5 ?>72>;5=8OB0 70 B078 48@5:B>@8O: %1.Please check permission for this directory: %1OpenProjectDialog@>5:B %1 =5 AJI5AB2C20, ?@58<5=C20;8 ;8 AB5 8;8 87B@820;8 48@5:B>@8O A B>20 8<5?RProject %1 does not exist, did you rename or remove the directory what that name ?OpenProjectDialog6@>5:B0 =5 AJI5AB2C20! (%1)Project does not exist! (%1)OpenProjectDialog&715@8 @>5:B=0 8@Select Project DirOpenProjectDialogb715@5B5 @>5:B 8 :;8:=5B5 1CB>=0 "0@548" >B=>2>2Select a project and click the 'Load' button againOpenProjectDialog71@0= @>5:BSelected ProjectOpenProjectDialogR5 <>65B5 40 70?8A20B5 2 B078 48@5:B>@8O!(This directory is not writable by you! OpenProjectDialog(Traverso: =D>@<0F8OTraverso - InformationOpenProjectDialog Traverso - 06=>Traverso - QuestionOpenProjectDialog2Traverso - @54C?@5645=85Traverso - WarningOpenProjectDialogV5 <>65 40 A5 AJ74045 48@5:B>@8O 70 @>5:B0%Unable to create Project directory! OpenProjectDialog@"@O120 40 4045B5 8<5 =0 ?@>5:B0!'You must supply a name for the project!OpenProjectDialog<PADriver::PortAudio 3@5H:0" %1PADriver:: PortAudio error: %1PADriver^PADriver::hostapi %1 =5 15 =0<5@5= >B Portaudio1PADriver:: hostapi %1 was not found by Portaudio!PADriver <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">PortAudio 4@0925@:</span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">@0925@0, :>9B> B@O120 40 C?@02;O20 Portaudio ?;0BD>@<0</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">PortAudio ?>44J@60 <=>3> 4@0925@=8 ?;0BD>@<8, =O:>8 >B :>8B> Traverso AJI> ?>44J@60. </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">@5?>@JG20 A5 40 87?>;720B5 4@0925@8B5 =0 Traverso's 2<5AB> PortAudio's, =>, 0:> 8<0B5 ?@>1;5<8, <>65 40 >?8B0B5 PortAudio!</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">PortAudio ?@54>AB02O ?@>7@0G=0 4@0925@=0 ?>44@J6:0 2:;N8B5;=> , including Windows (286B5, direct x 8 asio 2J7<>6=>AB8B5), 8 Mac OS X (286B5 CoreAudio 8 jack 2J7<>6=>AB8B5)</p></body></html>

PortAudio Driver:

The driver which should drive the PortAudio backend

PortAudio supports many driver backends, some of which Traverso has native support for too.

It is recommended to use Traverso's native drivers instead of using PortAudio's, however, if the native drivers give problems, you might try the ones supplied by PortAudio instead!

PortAudio provides transparent driver support for multiple platforms, including Windows (see the wmme, direct x and asio options), and Mac OS X (see the CoreAudio and jack options)

 PaDriverPage@0925@Driver PaDriverPage $>@<0Form PaDriverPage$Portaudio 4@0925@8Portaudio drivers PaDriverPage<html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;"> 07<5@ =0 1CD5@0 70 G5B5=5:</span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">>;8G5AB2>B> 0C48> 8=D>@<0F8O, :>OB> <>65 40 A5 AJE@0=8 2 </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">2 1CD5@0 70 G5B5=5 2 A5:C=48.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">!B>9=>AB0 ?> ?>4@0718@0=5 >B 1 A5:C=40 18 B@O120;> 40 @01>B8 4>1@5.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A5 ?0:, 0:> =5 28 4>AB830 ?0<5B, <>65 40 =0<0;8B5 B078 AB>9=>AB.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">:> 8<0 ?@5:JA20=8O =0 1CD5@0, :>30B> B@0=AD5@0 =0 E0@4 48A:0 5 </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(?>GB8) ?@5B>20@5=, 8;8 0:> B>20 A5 A;CG20 @54>2=>, 70I>B> </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">E0@4 48A:0 =5 A5 A?@02O ?> =O:0:20 ?@8G8=0, <>65B5 40 >?8B0B5 ?> 3>;O<0</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">AB>9=>AB, :0B> 1.5 8;8 2.0 A5:C=48.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><09B5 2?@54284, G5 ?>-3>;O< 1CD5@ </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">I5 ?@548728:0 GC2AB28B5;=> 70102O=5 (BJ@A5=5) </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">?@8 ?@5<5AB20=5 =0 :C@A>@0 =0 =>20 ?>78F8O 70 ?@>A28@20=5, BJ9 :0B> 2A8G:8 1CD5@8 </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(548= 70 2A5:8 0C48> :;8? * 1@>O :0=0;8) B@O120 40 A5 70?J;=8 >B=>2>!</p></body></html> +

Read buffer size:

The amount of audio data that can be stored in the

read buffers in seconds.

The default value of 1 second should do just fine.

However, if you're tight on memory, you can make this value lower.

If you experience buffer underruns when the hard disk bandwidth is

(almost) saturated, or when buffer underruns happen regularly due

the hard disk can't keep up for some reason, you can try a larger

value, like 1.5 or 2.0 seconds.

Keep in mind that when using a larger buffer,

it will take considerably more time to move (i.e. seeking)

the playhead to another positions, since all the buffers

(one for each audioclip * channel count) need to be refilled!

PerformanceConfigPage<html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">?B8<878@0 287C0;878@0=5B> =0 C48> :;8?25B5 8 "@0:>25B5 :0B> 87?>;720</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 3D <0H8=0B0 =0 20H0B0 3@0D8G=0 :0@B0.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 7028A8<>AB >B 20H0B0 3@0D8G=0 :0@B0 8 4@0925@, B>20 </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><>65 GC2AB28B5;=> 40 CA:>@8 287C0;=8B5 >?5@0F88!</p></body></html>8

Accelerates the painting of AudioClips and Tracks by using

the 3D engine of your graphics card.

Depending on your graphics card and driver support, this

can speed up painting considerably!

PerformanceConfigPage<html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">>;:> ?JB8 2 A5:C=40 @0D8G=8B5</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">15:B8 A5 >?@5A=O20B ?> 2@5<5 =0 >?5@0F8O :0B> ?@5<5AB20=5 =0</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">C4> ;8?, 8;8 ?@><O=0 =0 #A8;20=5.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">!B>9=>AB0 ?> ?>4@0718@0=5 >B 35 5 ?5@D5:B5= :><?@><8A </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><564C 3;04:0 :0@B8=0 8 <0;:> =0B>20@20=5 =0 ?@>F5A>@0.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A5 ?0:, 0:> 8A:0B5 ?>-1J@7> >?@5A=O20=5,</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">70409B5 ?>-28A>:0 AB>9=>AB, => 8<09B5 2@54284, G5</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">B>20 I5 >B=5<5 4>?J;=8B5;=> ?@>F5A>@=> 2@5<5!</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">:> ?@5<5AB20=5B> =0 C48> ;8? 2A5 >I5 B>20@8 <=>3> ?@>F5A>@0,</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">18 B@O120;> 40 =0<0;8B5 B078 AB>9=>AB.</p></body></html> ~

The number of times per second at which the Graphical

Items are repainted during a jog action, like moving an

AudioClip, or changing the Gain.

The default frames per second of 35 is a perfect compromise

between smooth painting, and low cpu usage.

However, if you find the painting to be not smooth enough,

change this value to a higher one, but keep in mind that it

will consume considerably more cpu!

If for example moving an AudioClip still takes to much cpu,

you should consider to lower this value.

PerformanceConfigPage&CD5@ =0 C48> $09;Audio file bufferingPerformanceConfigPage@><O=0B0 =0 @07<5@0 =0 1CD5@0 I5 8<5 5D5:B A;54 A;5420I>B> 70@5640=5 =0 ?@>5:B.QChanging the buffer size only will take into effect after (re)loading a project.PerformanceConfigPage $>@<0FormPerformanceConfigPage:?@5A=O20=5 ?@8 >?@0F88 (fps)Jog repaint speed (fps)PerformanceConfigPage 8AC20=5PaintingPerformanceConfigPage4 CD5@ 70 G5B5=5 (A5:C=48)Read buffer size (seconds)PerformanceConfigPage@7?>;7209 %0@4C5@=> >?B8<878@0=5Use hardware accelerationPerformanceConfigPage 8:>=0 8=D>@<0F8O info iconPerformanceConfigPage,>AB028 AJI> 8 4>102:0Add Plugin tooPluginSelectorDialog B<5=8CancelPluginSelectorDialogE>4/7E>4In/OutPluginSelectorDialogOKPluginSelectorDialog<0 =0 >102:0 Plugin NamePluginSelectorDialog 71>@ =0 >102:8Plugin SelectorPluginSelectorDialog"8?TypePluginSelectorDialog2<J:20 D09; %1 >B %2: %p%Importing file %1 of %2: %p%ProgressToolBar"5=B0 70 ?@>3@5A0Progress ToolbarProgressToolBarF5 <>65 40 A5 AJ74045 48@5:B>@8O %1Cannot create dir %1Project5 <>65 40 A5 ?8H5 2 @>5:B=8O D09; A =0AB@>9:8($09; %1, @8G8=0: %2)HCouldn't open Project properties file for writing! (File %1. Reason: %2)Project0!J74045= 5 =>2 @>5:B %1Created new Project %1Project0A5G5=> 5 :;8?8@0=5 (B2J@45 28A>:> =82>) 2 5:A?>@B8@0=>B> 0C48>!(%1))Detected clipping in exported audio! (%1)Project|:A?>@B8@0=5B> 25G5 B5G5, =5 <>65B5 40 3> AB0@B8@0B5 420 ?JB8!2Export already in progress, cannot start it twice!Project&@>5:B %1 5 70@545=Project %1 loadedProject(@>5:B %1 5 70?075=.Project %1 saved Project~@>5:B %1: 5 <>65 40 A5 >B2>@8 project.tpf D09;! (@8G8=0: %2)6Project %1: Cannot open project.tpf file! (Reason: %2)Project@>5:B %1: 5 <>65 40 A5 8=B5@?@5B8@0 project.tpf D09;! (@8G8=0: %2):Project %1: Failed to parse project.tpf file! (Reason: %2)Project5@A8OB0 =0 @>5:B=8O D09; =5 AJ2?040, =5 <>65 40 A5 70@548 ?@>5:B0!5:B=0B0 48@5:B>@8O %1 =5 AJI5AB2C20, A;CG09=> 40 AB5 O ?@58<5=C20;8? 0: =5 28 5 A@0<! B<5=5B5 B>20 8 ?>A;5 A5 2J@=5B5 ?0: 40 ?@58<5=C20B5 @>5:B0...Project directory %1 no longer exists, did you rename it? Shame on you! Please undo that, and come back later to rename your Project...Project<5B> =0 ?@>5:B0 5 ?@><5=5=>, @>5:B0 B@O120 40 A5 ?@570@548 70 ?@028;=0 @01>B0MProject title changed, Project will to be reloaded to ensure proper operationProjectt@>5:B A 8<5 '%1' 25G5 AJI5AB2C20, =5 5 704045=> =>2> 8<5!?Project with title '%1' allready exists, not setting new title!Project @5<0E=8 ;>B %1Remove Sheet %1Project;>B %1 4>1025=Sheet %1 addedProject0;>B '%1' =5 AJI5AB2C20!Sheet '%1' doesn't exist!Project(Traverso: =D>@<0F8OTraverso - InformationProject5 <>65 40 A5 AJ74045 48@5:B>@8O 70 5:A?>@B! >;O ?@>25@5B5 ?>72>;5=8OB0 70 B078 48@5:B>@8O: %1RUnable to create export directory! Please check permissions for this directory: %1ProjectA5 >I5 70?8A20B5. >;O A?@5B5 70?8A0, 70 40 <>65B5 40 87;575B5 >B ?@>3@0<0B0!WYou're still recording, please stop recording first to be able to exit the application!ProjectH87G8A;5= D0:B>@ 70 =>@<0;878@0=5: %1calculated norm factor: %1Project@"@O120 0 A5 :>=25@B8@0B %1 D09;0Need to convert %1 filesProjectConverter<>=25@B8@0=5B> 702J@H8 CA?5H=>Conversion finished succesfullyProjectConverter>=25@B8@0=5B> 5 A?@O=> >B ?>B@518B5;O, <>65B5 40 ?@>4J;68B5 40 87?>;720B5 ?@>5:B0 AJA Traverso <= 0.41.0, 8;8 40 3> >B>2@8B5 >B=>2> A B078 25@A8O =0 Traverso 8 40 AB0@B8@0B5 :>=25@B8@0=5B> >B=>2>Conversion stopped on user request, you can continue to use this Project with Traverso <= 0.41.0, or reopen it with this version of Traverso and start the conversion againProjectConverterN>=25@B8@0 project.tpf D09;.....>B>2>!&Converting project.tpf file..... Done!ProjectConverter5 <>65 40 A5 ?8H5 2 @>5:B=8O D09; A =0AB@>9:8($09; %1, @8G8=0: %2)HCouldn't open Project properties file for writing! (File %1. Reason: %2)ProjectConverterLO<0 =0;8G=> >?8A0=85 70 :>=25@B8@0=5!$No conversion description available!ProjectConverter*@>5:B %1 :>=25@B8@0=Project %1 convertedProjectConverter@>5:B %1: 5 <>65 40 A5 8=B5@?@5B8@0 project.tpf D09;! (@8G8=0: %2):Project %1: Failed to parse project.tpf file! (Reason: %2)ProjectConverter@>5:B5= D09; AJA 25@A8O %1 =5 <>65 40 A5 :>=25@B8@0, A0<> D09;>25 A 25@A8O 2 <>30B!PProject file with version %1 cannot be converted, only files with version 2 can!ProjectConverterd0?8A20 :>=25@B8@0=8O project.tpf D09;.....>B>2>!+Saving converted project.tpf file.... Done!ProjectConverterZ0?>G20 :>=25@B8@0=5 >B 25@A8O 2 :J< 25@A8O 37Starting to convert Project from version 2 to version 3ProjectConverter0B2>@8CloseProjectConverterDialog4=D>@<0F8O 70 :>=25@B8@0=5Conversion informationProjectConverterDialog00?@54J: =0 :>=25@B8@0=5Conversion progressProjectConverterDialog0@548 @>5:B Load ProjectProjectConverterDialog.>=25@B8@0=5 =0 @>5:B8Project ConverterProjectConverterDialogB@>5:B XXX (=O<0 =C640 >B ?@52>4)#Project XXX (no translation needed)ProjectConverterDialog(0?>G=8 :>=25@B8@0=5Start conversionProjectConverterDialog"!?@8 :>=25@B8@0=5Stop conversionProjectConverterDialog--ProjectInfoWidget 8B>25BitdepthProjectInfoWidget @>5:BProjectProjectInfoWidgetH@8A?>A>1;5=8 70 @>5:B=0 =D>@<0F8OProject Information WidgetProjectInfoWidget'5AB>B0RateProjectInfoWidget 5A=8SongsProjectInfoWidgetF5 <>65 40 A5 AJ74045 48@5:B>@8O %1Cannot create dir %1ProjectManagerZ715@5B5 48@5:B>@8O 70 AJE@0=O20=5 =0 @>5:B0,Choose a directory to store your Projects inProjectManagerh5 <>65 40 A5 ?@58<5=C20 @>5:B=0B0 48@5:B>@8O =0 %1(Could not rename Project directory to %1ProjectManagerd!J74045=0 5 =>20 @>5:B=0 48@5:B>@8O 70 20A BC::%1/Created new Project directory for you here: %1 ProjectManagerX@>5:B ?> ?>4@0718@0=5, AJ74045= >B Traverso#Default Project created by TraversoProjectManagervA:0B5 ;8 40 70?078B5 @>5:B0 ?@548 87;870=5 >B ?@>3@0<0B0?/Do you want to save the Project before quiting?ProjectManagertO<0 @>5:B 70 70?0720=5, >B2>@5B5 8;8 AJ7409B5 =>2 ?J@2>!3No Project to save, open or create a Project first!ProjectManager5 5 871@0=0 48@5:B>@8O, 70 40 >?8B0B5 >B=>2>, >B2>@5B5 480;>30 "B2>@8 @>5:B" 8 :;8:=5B5 "715@8 @>5:B=0 8@5:B>@8O"oNo directory was selected, to retry open the 'Open Project Dialog' and click 'Select Project Directory' button ProjectManager>;O, ?@>25@5B5 ?>72>;5=8OB0 70 B078 48@5:B>@8O 8;8 8715@5B5 =>20: %1FPlease check permission for this directory or choose another one: %1ProjectManagerf>;O, ?@>25@5B5 ?>72>;5=8OB0 70 B078 48@5:B>@8O: %1.Please check permission for this directory: %1ProjectManager4@>5:B %1 25G5 AJI5AB2C20!Project %1 already exists!ProjectManager@>5:B %1 25G5 =5 <>65 40 1J45 =0<5@5=! 7B@820;8 ;8 AB5 8;8 ?@58<5=C20;8 @>5:B=0B0 48@5:B>@8O?WProject %1 no longer could be found! (Did you remove or rename the Project directory ?)ProjectManager 575@2=> :>?85 =0 ?@>5:B5= D09; %1 =5 <>65 40 A5 >B2>@8 70 G5B5=5! (@8G8=0: %2)TProjectfile backup: The project file %1 could not be opened for reading (Reason: %2)ProjectManager0?078 @>5:B Save ProjectProjectManagerZ85 =5 <>65B5 40 70?8A20B5 2 B078 48@5:B>@8O!(This directory is not writable by you! ProjectManager2Traverso - @54C?@5645=85Traverso - WarningProjectManagerX5 <>65 40 A5 AJ74045 48@5:B>@8O 70 @>5:B0!%Unable to create Project directory! ProjectManagerF5 <6>5 40 A5 AJ74045 =>2 @>5:B %1Unable to create new Project %1ProjectManager<5 <>65 40 A5 70@548 @>5:B %1Unable to load Project %1ProjectManagerV7?>;720 =0AB>OI0B0 @>5:B=0 48@5:B>@8O: %1%Using existing Project directory: %1 ProjectManager&<html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">0?@028 >B=>2> ?>A;54=0B0 ?@><O=0</p></body></html>

Redo last change

ProjectManagerDialog<html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">B<5=8 ?>A;54=0B0 ?@><O=0</p></body></html>

Undo last change

ProjectManagerDialog$Adult ContemporaryAdult ContemporaryProjectManagerDialog Alternative RockAlternative RockProjectManagerDialog@0=6L>@ArrangerProjectManagerDialogCD B5:ACD TextProjectManagerDialogChildrens ChildrensProjectManagerDialogClassical ClassicalProjectManagerDialog,Contemporary ChristianContemporary ChristianProjectManagerDialogN5 <>65 40 A5 >B2>@8 D09; %1 70 ?8A0=5!"Couldn't open file %1 for writing!ProjectManagerDialogCountryCountryProjectManagerDialog!J7409 =>2 ;>BCreate new SheetProjectManagerDialog DanceDanceProjectManagerDialog 7B@89DeleteProjectManagerDialog?8A0=85 DescriptionProjectManagerDialog 80;>3DialogProjectManagerDialog8A: ID:Disc ID:ProjectManagerDialogEasy ListeningEasy ListeningProjectManagerDialog=65=5@EngineerProjectManagerDialog*?8H5B5 8<5 =0 (01;>=Enter Template nameProjectManagerDialog EroticEroticProjectManagerDialog:A?>@B8@0=5ExportProjectManagerDialogFolkFolkProjectManagerDialog 0=@:Genre:ProjectManagerDialog GospelGospelProjectManagerDialogHip HopHip HopProjectManagerDialog=D>@<0F8>==> InformationalProjectManagerDialogJazzJazzProjectManagerDialog LatinLatinProjectManagerDialogJ;68=0LengthProjectManagerDialog!J>1I5=85MessageProjectManagerDialogMusicalMusicalProjectManagerDialogNew AgeNew AgeProjectManagerDialog>2 ;>B New SheetProjectManagerDialog<5 5 704045=> 8<5 =0 =>2 ;>B!No new Sheet name was supplied!ProjectManagerDialog OperaOperaProjectManagerDialogOperetteOperetteProjectManagerDialog7?J;=8B5; PerformerProjectManagerDialogPop Music Pop MusicProjectManagerDialog @>5:BProjectProjectManagerDialogv@>5:B A 8<5 '%1' 25G5 AJI5AB2C20, <>;O 8715@5B5 4@C3> 8<5!IProject with title '%1' allready exists, please supply a different title!ProjectManagerDialogRapRapProjectManagerDialog ReggaeReggaeProjectManagerDialog@58<5=C209RenameProjectManagerDialog Rhythm and BluesRhythm and BluesProjectManagerDialogRock Music Rock MusicProjectManagerDialog0?078 (01;>= Save TemplateProjectManagerDialog:0?075= 5 @>5:B5= (01;>=: %1Saved Project Template: %1ProjectManagerDialog71@0= ;>BSelected SheetProjectManagerDialog<5 =0 ;>B Sheet NameProjectManagerDialog;>B(>25)Sheet(s)ProjectManagerDialog;>B>25SheetsProjectManagerDialog 2B>@ =0 ?5A5=B0 SongwriterProjectManagerDialogSound Effects Sound EffectsProjectManagerDialogSpoken Word Spoken WordProjectManagerDialog (01;>=TemplateProjectManagerDialogv(01;>= A 8<5 %1 25G5 AJH5AB2C20! A:0B5 ;8 40 3> 70<5=8B5?CTemplate with name %1 already exists! Do you want to overwrite it?ProjectManagerDialog<5TitleProjectManagerDialog"@0:>25TracksProjectManagerDialog(Traverso: =D>@<0F8OTraverso - InformationProjectManagerDialogUPS EAN:UPC EAN:ProjectManagerDialogH5 <>65 40 A5 AJ74045 48@5:B>@8O %1!Unable to create directory %1!ProjectManagerDialog545D8=8@0=> UndefinedProjectManagerDialog587?>;720=>UnusedProjectManagerDialogWorld Music World MusicProjectManagerDialog2J7AB0=>28B5:ABredotextProjectManagerDialog>B<5=8B5:ABundotextProjectManagerDialog$0B0;=0 3@5H:0.A fatal error occurred.QObject.@528H020=5 =0 2@5<5B>.A timeout occurred.QObject8@5H:0< ?@8 G5B5=5 >B D09;0.-An error occurred when reading from the file.QObject8@5H:0 ?@8 ?8A0=5 2J2 D09;0.+An error occurred when writing to the file.QObject(5>?@545;5=0 3@5H:0.An unspecified error occurred.QObjectC48>;8? AudioClipQObject @820CurveQObject">G:0 =0 @820 CurveNodeQObject0@820 #A8;20=5/0B8E20=5 FadeCurveQObject <0@:5@MarkerQObject05 A0 :>AB0B8@0=8 3@5H:8No error occurredQObject 5AC@A=0 3@5H:0 Resourc errorQObject;>BSheetQObject$$09;0 5 =54ABJ?5=.The file could not be accessed.QObject6$09;0 =5 <>65 40 A5 :>?8@0.The file could not be copied.QObject6$09;0 =5 <6>5 40 A5 >B2>@8.The file could not be opened.QObject<$09;0 =5 <>65 40 A5 ?@5<0E=5.The file could not be removed.QObject>$09;0 =5 <>65 40 A5 ?@58<5=C20.The file could not be renamed.QObject:$09;0 =5 <>65 40 A5 >@07<5@8.The file could not be resized.QObject0?5@0F8OB0 15 ?@5:@0B5=0The operation was aborted.QObjectT>78F8OB0 2J2 D09;0 =5 <>65 40 A5 ?@><5=8..The position in the file could not be changed.QObject@5<520 ;8=8OTimeLineQObject"@0:TrackQObject"5?>7=0B0 3@5H:0. Unknown errorQObjectA<html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"><span style=" font-size:18pt; font-weight:600;">Traverso:  =0G0;>B></span></p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">>30B> 70?8A20B5 8;8 2<J:20B5 0C48> 2 Traverso, A5 ?>:0720 C48>;8? 2 548= >B E>@87>=B0;=8B5 "@0:>25 2 =0AB>OI8O ;>B. 85 <>65B5 40 @540:B8@0B5 <=>3> 0A?5:B8 =0 B578 ;8?>25 :0B> ?>AB028B5 :C@A>@0 =0 <8H:0B0 2J@E8 ;8?0 8 =0B8A=5B5 8;8 704J@68B5 >?@545;5=8 :;028H8 =0 20H0B0 :;0280BC@0 8;8 <8H:0. >65B5 AJI> 40 ?@><5=OB5 =0AB@>9:8B5 =0 "@0:0, =0 ;>B0 :0B> FO;>, 8 =0 >AB0=0;8B5 >15:B8 =0 ;>B0.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">0 40 2848B5 A?8AJ: A :><0=48B5, :>8B> A0 =0;8G=8 70 >?@545;5= >15:B =0 ;>B0, ?@5<5AB5B5 <8H:0B0 2J@EC B>78 >15:B, 8 :;8:=5B5 A 5A5= 1CB>= (8;8 =0B8A=5B5 Q). ;028H=8B5 :><18=0F88 70 2AO:0 :><0=40 A0 87?8A0=8 2 <5=NB>. !8AB5<0B0 70 >1>7=0G020=5 5 :0:B> A;5420.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; K &gt; </span>>7=0G020 =0B8A:0=5 8 ?CA:0=5 =0 :;028H0 . (0B> :;8:20=5.)</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"><span style=" font-weight:600;">&lt;&lt; K &gt;&gt;</span> >7=0G020 =0B8A:0=5 8 ?CA:0=5 =0 :;028H0  1J@7> 4240 ?JB8. (0B> 42>9=> :;8:20=5.)</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ K ]</span> >7=0G020 2;0G5B5 A <8H:0B0, 4>:0B> 704J@60B5 :;028H0 K.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; KL &gt; </span> >7=0G020 =0B8A=5B5 K 8 L 54=>2@5<5==>.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ KL ] </span>>7=0G020 2;0G5B5 A <8H:0B0, 4>:0B> 704J@60B5 :;028H8B5 K 8 L 54=>2@5<5==>.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">B> =O:>8 >A=>2=8 :><0=48:</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; SPACE &gt;</span> 5 !28@8/!?@8.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; SHIFT &gt;</span> =03;0AO :C@A>@0 70 @>A28@20=5. !8=OB0 25@B8:0;=0 ;8=8O >B :>OB> 70?>G202 ?@>A28@20=5B>.)</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; W &gt;</span> =03;0AO  01>B=8O :C@A>@. ('5@25=0B0 25@B8:0;=0 ;8=8O.)</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; V &gt; </span> ?@8428620 C@A>@0 70 ?@>A28@20=5 >1@0B=> :J<  01>B=8O :C@A>@.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ D ] </span> <5AB8 >15:B8 (C48> ;8?>25, ">G:8 =0 @820B0, 8 4@.)</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ Z ]</span> C25;8G020 8 =0<0;O.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ TAB ]</span> ?@52J@B0 @07=>?>A>G=> (AJI> 8725AB=> 8 :0B> @568< !>20;:0) </p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> =O:>8 :><0=48 70 C48> ;8?:</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ E ] </span> ?@5<5AB20 ;528O 8;8 45A=8O :@09 =0 :;8?0.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ F ]</span> =03;0AO 4J;68=0B0 =0 70B8E20=5B>/CA8;20=5B> 2 :@0O/=0G0;>B> =0 :;8?0.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ G ] </span>=03;0AO A8;0B0 =0 :;8?0 @01>B8 AJI> 8 70 "@0:, ;>B)</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; X &gt;</span> @0745;O :;8?0 2 ?>78F8OB0 =0 :C@A>@0.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">0 ?>25G5 8=D>@<0F8O, :;8:209B5 A 45A5= 1CB>= =0 2A8G:>, 8;8 A5 :>=AC;B8@09B5 A  J:>2>4AB2> =0 >B5@18B5;O.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p></body></html>

Traverso: Getting Started

When you record or import an audio file into Traverso, it shows up as an Audio Clip in one of the horizontal Tracks in the current Sheet. You can edit many aspects of these Clips by placing the mouse pointer over a Clip and pressing or holding different keys on your keyboard and mouse. You can also change settings of a Track, the Sheet as a whole, and other objects in the Sheet.

To see a list of what commands are available for any given object in the Sheet, move the mouse over that object, and Right-Click (or press Q). The keyboard shortcuts for each command are shown in the menu. The notation used is shown below.

< K > means press and release the K key. (Like a click.)

<< K >> means press the K key two times fast. (Like a double click.)

[ K ] means drag the mouse while holding down the K key.

< KL > means press the K and L keys at the same time.

[ KL ] means drag the mouse while holding down the K and L keys at the same time.

Here are some basic commands:

< SPACE > is Play/Stop.

< SHIFT > sets the Playhead. (Blue vertical line where playing starts.)

< W > sets the Work Cursor. (Red vertical line.)

< V > moves the Playhead back to the Work Cursor.

[ D ] move objects around (Audio Clip, Curve Nodes, etc)

[ Z ] zooms in and out.

[ TAB ] scroll omnidirectional (aka Shuttle)

And some Audio Clip Commands:

[ E ] drags a Clip's left or right edge.

[ F ] adjusts the length of a Clip's Fade In / Fade Out.

[ G ] addust the Gain of a clip (also works on Tracks, Sheet)

< X > splits the Clip at the cursor's position.

For more information, right-click on everything, or check out the Traverso manual.

QuickStartDialog(Traverso:  =0G0;>B>Traverso: Getting StartedQuickStartDialog25 <6>5 40 A5 >B2>@8 D09;Could not open file ReadSource*$09;0 8<0 =C;0 :0=0;0File has zero channels ReadSource*520;845= 1@>9 :0=0;8Invalid channel count ReadSource.No ReadSource error setNo ReadSource error set ReadSource "8H8=0Silence ReadSource&$09;0 =5 AJI5AB2C20The file does not exist! ReadSource|<html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">WAV</span> :$>@<0B 157 :><?@5A8@0=5. 7?>;720 ?>25G5 <OAB> >B :>?@5A8@0=8B5 D>@<0B8, => =5 B>20@8 ?@>F5A>@0.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">3@0=8G5=8O : ~ 1.7 G0A0 70?8A=> 2@5<5 @ Stereo - 44.1 KHz</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">WavPack</span> : $>@<B0 A :><?@5A8O, 4> 2 ?JB8 ?>-<0;J: 2 A@02=5=85 A WAV, 157 703C10 =0 :0G5AB2>. 7?>;720 GC2AB28B5;=> ?>25G5 ?@>F5A>@=> 2@5<5 >B WAV, => A <>45@=8B5 (A;54 2005 3>48=0) ?@>F5A>@8 B>20 =5 18 B@O120;> 40 5 ?@>1;5<.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">7?>;720=5B> =0 B>78 D>@<0B B>20@8 <=>3> ?>-<0;:> B2J@48O 48A:, C25;8G020 682>B0 <C, 8 =0<00;O20 @8A:>25B5 >B ?@5B>20@20=5.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">3@0=8G5=8O : ~ 5 G0A0 70?8A=> 2@5<5 @ Stereo - 44.1 KHz</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">WAV64</span> : WAV D>@<0B A 64 bit E54J@, ?>44@J6:0B0 >B 4@C38 ?@>3@0<8 2 <><5=B0 5 >3@0=8G5=0.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">3@0=8G5=8O : O<0, E8;O48 G0A>25 70?8A=> 2@5<5, 0:> 48A:0 <>65 40 38 ?>5<5.</p></body></html> k

WAV : A format without compression. Uses more hard disk space then compressed encoding formats, but needs very little cpu.

Limits : ~ 1.7 hours of recording time @ Stereo - 44.1 KHz

WavPack : A format with compression, up to 2 times smaller compared to WAV, and no quality loss. Uses significantly more cpu then WAV, but with modern (year 2005 and above) cpu's this shouldn't be a problem.

Using this format stresses the hard disk much less, increasing hard disk live, and less chance of saturating the hard disk bandwidth.

Limits : ~ 5 hours recording time @ Stereo - 44.1 KHz

WAV64 : WAV format with 64 bit header, support by other programs is currently limited.

Limits : None, thousands of hours of recording time, supposed that your hard disk can hold it.

RecordingConfigPage <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">"078 >?F8O =0<0;O20 @07<5@0 =0 =O:>8 D09;>25 A ?;020I0 70?5B0O 4> 10% G@57 5;8<8=8@0=5 =0 >?@545;5=0 8=D>@<0F8O :>OB> =0 ?@0:B8:0 =O<0 >B=>H5=85 :J< :0G5AB2>B> =0 72C:0.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">0:0@ G5 B5E=8G5A:8 B>20 25G5 87;870 >B @0<:8B5 =0 :><?@5A8OB0 157 703C10, >AB020B 2A8G:8 ?@548<AB20 =0 ?;020I0B0 70?5B0O, (&gt;600 dB 48=0<8:0, 157 :;8?8@0=5 , 25 18B>20 @57>;NF8O). </p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">">20 AJI> >:0720 2;8O=85 =0 3>;O<0B0 :><?@5A8O A F5;8 G8A;0, :0B> >3@0=8G020 @57>;NF8OB0 4> 24 18B0.</p></body></html>B

This option reduces the storage of some floating-point data files by up to about 10% by eliminating some information that has virtually no effect on the audio data.

While this does technically make the compression lossy, it retains all the advantages of floating point data (>600 dB of dynamic range, no clipping, and 25 bits of resolution).

This also affects large integer compression by limiting the resolution to 24 bits.

RecordingConfigPage09-4>1@>BestRecordingConfigPage"8? >?@5A8OCompression typeRecordingConfigPagel!B>9=>AB ?> ?>4@0718@0=5 =0 :0G5AB2>B> =0 @5A5<?;8@0=5Default export resample qualityRecordingConfigPageJ 07@5H8 @5A5<?;8@0=5B> 2 @50;=> 2@5<5,Enable on the fly resampling (Playback only)RecordingConfigPage$$>@<0B =0 >48@0=5Encoding formatRecordingConfigPage J@7>FastRecordingConfigPage $>@<0FormRecordingConfigPage 8A>:>HighRecordingConfigPage !@54=>MediumRecordingConfigPageP0G5AB2> =0 @5A5<;8@0=5B> 2 @50;=> 2@5<5On the fly resample qualityRecordingConfigPage0?8A20=5 RecordingRecordingConfigPage 5A5<?;8@0=5 ResamplingRecordingConfigPageL@>?CA=8 WVX 70 4>?J;=8B5;=0 :><?@5A8O.Skip WVX for extra compression (semi-lossless)RecordingConfigPage"WavPack =0AB@>9:8WavPack optionsRecordingConfigPage ResourcesManager: >;CG5=0 5 70O2:0 70 ?@5<0E20=5 =0 C48> 7B>G=8: %1 => B>9 2A5 >I5 A5 87?>;720 >B %2 C48> ;8?0!!  ! ?@5<0E20!wResourcesManager: Received request to remove Audio Source %1but it is still in use by %2 AudioClips!!. NOT removing it!ResourcesManagerResourcesManager:: 5 <>65 40 A5 8=8F80;878@0 @5AC@A %1 (?@8G8=0: %2)CResourcesManager:: Failed to initialize ReadSource %1 (Reason: %2)ResourcesManager@09EndResourcesWidget$09;>25FilesResourcesWidget $>@<0FormResourcesWidgetJ;68=0LengthResourcesWidget<5NameResourcesWidget7B>G=8F8SourcesResourcesWidget 0G0;>StartResourcesWidget--RestoreProjectBackupDialog*0AB>OI8 40B0 8 2@5<5Current date and time:RestoreProjectBackupDialog0B0DateRestoreProjectBackupDialog.>A;54=> @575@2=> :>?85 Last backup:RestoreProjectBackupDialog6JAB0=>28 >B @575@2=> :>?85Restore from backup RestoreProjectBackupDialog`0409 40B0 70 2J7AB0=>2O20=5 =0 @575@2=>B> :>?85,Set the date to restore the selected backup.RestoreProjectBackupDialog @5<5TimeRestoreProjectBackupDialog 73;54 AppearanceSettingsDialogC48> 0AB@>9:8 Audio OptionsSettingsDialog>2545=85BehaviorSettingsDialog;0280BC@0KeyboardSettingsDialog @>872>48B5;=>AB PerformanceSettingsDialog,@5D5@5=F88 - TraversoPreferences - TraversoSettingsDialog2C:>20 !8AB5<0 Sound SystemSettingsDialog>1028 "@0: Add TrackSheetp0G0;=>B> 2@5<5 70 5:A?>@B 5 A;54 =53>2B> :@09=> 2@5<5!!3Export start frame starts beyond export end frame!!SheetZ:A?>@B8@0=5B> I5 4>2545 4> D09; A 0 :0=0;0??/Export tries to render to 0 channels wav file??SheetNCD5@ 70 8A0=5 =5 A5 87?@07=8 =02@5<5!#Failed to empty WriteBuffer in timeSheetNCD5@0 70 '5B5=5 =5 A5 70?J;=8 =02@5<5!!Failed to fill ReadBuffer in timeSheet:@5B>20@20=5 =0 B2J@48O 48A:!Hard Disk overload detected!Sheet>O<0 70@545=8 70 70?8A B@0:>25!No Tracks armed for recording!Sheet65 5 704045=> 8<5 =0 0@B8ABNo artists name setSheetfO<0 0C4> 70 5:A?>@B! (>65 18 2A8G:> 5 703;CH5=>?)*No audio to export! (Is everything muted?)Sheet(0?8A20 2 %n ;8?(0)Recording to %n Clip(s)Sheet@5<0E=8 "@0: Remove TrackSheet57 8<5UntitledSheet--SongInfoWidget#A8;20=5GainSongInfoWidget SMPTESMPTESongInfoWidget@8;5?20=5SnapSongInfoWidget 5A5=SongSongInfoWidgetF=AB@C<5=B 70 8=D>@<0F8O 70 ?5A5=B0SongInfoWidgetSongInfoWidgetC?0ZoomSongInfoWidgetHz HzSpectralMeterConfigWidget&0B2>@8&CloseSpectralMeterConfigWidget10241024SpectralMeterConfigWidget10482048SpectralMeterConfigWidget256256SpectralMeterConfigWidget40964096SpectralMeterConfigWidget512512SpectralMeterConfigWidget81928192SpectralMeterConfigWidget>?J;=8B5;=8AdvancedSpectralMeterConfigWidget4>?J;=8B5;=8 FFT 0AB@>9:8Advanced FFT OptionsSpectralMeterConfigWidget@8;>68ApplySpectralMeterConfigWidget;O:<0=BlackmanSpectralMeterConfigWidgetFFT @07<5@ FFT Size:SpectralMeterConfigWidget6>=D83C@0F8O =0 FFT-!?5:BJ@FFT-Spectrum ConfigurationSpectralMeterConfigWidget'5AB>B5= >1E20BFrequency RangeSpectralMeterConfigWidget %0<8=3HammingSpectralMeterConfigWidget %0=8=3HanningSpectralMeterConfigWidget>;5= 8<8B: Lower Limit:SpectralMeterConfigWidget$>;=0 db A@>9=>AB:Lower dB value:SpectralMeterConfigWidget"><5@ =0 10=4>25:Number of bands:SpectralMeterConfigWidget@02>J3J;=8: RectangleSpectralMeterConfigWidget,>:068 A@54=8O A?5:BJ@Show average spectrumSpectralMeterConfigWidget>@5= 8<8B: Upper Limit:SpectralMeterConfigWidget$>@=0 db AB>9=>AB:Upper dB value:SpectralMeterConfigWidget&@>7>@5G=0 DC=:F8O:Windowing function:SpectralMeterConfigWidget@:A?>@B8@09 :@820B0 70 A@54=8 dbExport average dB curveSpectralMeterViewFFT:  07@5H5B5 :@820B0 70 A@54=0 A>B9=>AB AJA < M > 70 40 A5 35=5@8@0 8=D>@<0F8O5FFT: Enable avarage curve with < M > to generate dataSpectralMeterViewFFT: 5 A5 87?>;720 :@820 70 A@54=0B0 AB>9=>AB, =O<0 8=D>@<0F8O 70 5:A?>@B8@0=5/FFT: No avarage curve used, not data to export!SpectralMeterViewrFFT: O<0 8D=>@<0F8O 70 A@54=0B0 AB>9=>AB 70 5:A?>@B8@0=5FFT: No avarage data to export!SpectralMeterView|FFT: 5 <>65 40 70 A5 70?8H5 ?>;CG5=0B0 A=8<:0 =0 B2J@48O 48A:0FFT: Unable to write captured image to hard diskSpectralMeterView7E>45= D>@<0B:Output format:SpectralMeterView*<5 =0 :@0==0 !=8<:0Screen Capture file nameSpectralMeterView.715@5B5 87E>45= D>@<0BSelect output formatSpectralMeterView 0745;8 ;8? Split Clip SplitClip.=D>@<0F8O 70 !8AB5<0B0System InformationSysInfoToolBar - % - %SystemInfoWidget- GB- GBSystemInfoWidgetCard Name (na)Card Name (na)SystemInfoWidget SystemInfoWidgetSystemInfoWidgetSystemInfoWidgetbitdepthbitdepthSystemInfoWidget buffer size (na)buffer size (na)SystemInfoWidgetdrivertype (na)drivertype (na)SystemInfoWidget imageimageSystemInfoWidgetlatency (na) latency (na)SystemInfoWidgetraterateSystemInfoWidgetxruns (na) xruns (na)SystemInfoWidget8!JAB>O=85 =0 CD5@ 70 '5B5=5Read Buffer StatusSystemResources8!JAB>O=85 =0 CD5@ 70 8A0=5Write Buffer StatusSystemResources>1028 0@:5@ Add MarkerTimeLine@5<0E=8 0@:5@ Remove MarkerTimeLine@81208 0@:5@ Add Marker TimeLineView7G8AB8 0@:5@8 Clear Markers TimeLineView;0G8 0@:5@ Drag Marker TimeLineView@09End TimeLineViewR"@O120 ?J@2> 40 ?@5<0E=5B5 2A8G:8 <0@:5@8+You have to remove all other markers first. TimeLineView>1028 ;8?Add ClipTrack@5<0E=8 ;8? Remove ClipTrack$03;CH8 >AB0=0;8B5Silence OthersTrackp"@0:: C48>;8?0 =5 <>65 40 1J45 =0<5@5= 2 1070B0 40==8!BTrack: AudioClip with id %1 not found in Resources database!Track 0=>@0<0 =0 "@0; Track PanTrackPan(0=>@0<0 =0 "@0:: %1 Track Pan: %1TrackPan,?8H8 =>2> 8<5 =0 "@0:Enter new Track name TrackView"0409 8<5 =0 "@0:Set Track name TrackView"@0: %1:%2 Track %1: %2 TrackView8!;5420I0 B>G:0 =0 ?@8;5?20=5Next Snap PositionTransportConsoleWidget!28@8/!?@8 Play / StopTransportConsoleWidget4@54=0 ">G:0 =0 @8;5?20=5Previous Snap PositionTransportConsoleWidget 0?8ARecordTransportConsoleWidgetR0?8A20 2 %1 "@0:0, D>@<0B =0 :>48@0=5:%2+Recording to %1 Tracks, encoding format: %2TransportConsoleWidget!:>G8 2 @0O Skip to EndTransportConsoleWidget !:>G8 2 0G0;>B> Skip to StartTransportConsoleWidget*(5)!5;5:B8@09 A8G:>(De)Select AllTraversoCommands0@548 "@0:>25 Arm TracksTraversoCommands>?8@09 ;8? Copy ClipTraversoCommands>;CDownTraversoCommands;0G8 @0O Drag EdgeTraversoCommands J=H=0 1@01>B:0External ProcessingTraversoCommands!3J=8 0@:5@8 Fold MarkersTraversoCommands Fold SheetTraversoCommands!3J=8 "@0: Fold TrackTraversoCommands#A8;20=5GainTraversoCommands(#A8;20=5: J7AB0=>28 Gain: ResetTraversoCommands%>@87>=B0;=> HorizontalTraversoCommands0%>@87>=B0;=> #25;8G020=5 Horizontal InTraversoCommands*%>@87>=B0;=> 0<0;O=5Horizontal OutTraversoCommands<J:=8 C48> Import AudioTraversoCommands<J:=8 "8H8=0Insert SilenceTraversoCommandsO2>LeftTraversoCommands@5<5AB8 ;8? Move ClipTraversoCommands0@5<5AB8 8 >@07<5@8 ;8?Move Or Resize ClipTraversoCommands>2 "@0: New TrackTraversoCommands 07=>?>A>G=>OmnidirectionalTraversoCommands0=>@0<0PanoramaTraversoCommands(0=>@0<0: J7AB0=>28Panorama: ResetTraversoCommands@5<0E=8 ;8? Remove ClipTraversoCommands@5<0E=8 "@0: Remove TrackTraversoCommands OA=>RightTraversoCommands 0745;8SplitTraversoCommands>@5UpTraversoCommands5@B8:0;=>VerticalTraversoCommands,5@B8:0;=> #25;8G020=5 Vertical InTraversoCommands&5@B8:0;=> 0<0;O=5 Vertical OutTraversoCommandstraverso-0.49.4/resources/translations/traverso_pt.ts000644 001750 001750 00000667333 11430303017 023444 0ustar00remonremon000000 000000 AddRemoveClip Remove Clip Remove Selected Clips AlsaDevicesPage Form ALSA Device <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Device:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The real or virtual ALSA device to be used.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A real device is the audiocard installed in your system.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A virtual device is one created in the .asoundrc file, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">often located in your home folder.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If unsure, use either the default device, this will use the audiodevice </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">configured by your distribution, or the device that names your audio card.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">In the latter case, please make sure no application uses the audiocard, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">else the driver won't be able to initialize!</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">For more info see chapter 3.1: "The Driver Backend" of the User Manual</p></body></html> Device <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Number of Periods:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Audio is managed in small chunks called periods. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This value determines how many of these chunks are </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">to be used by the driver of the audiocard.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The default should work just fine, and gives optimal latency behavior.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">However, some (buggy) alsa drivers don't work correctly </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">with the default of 2, if you experience very choppy audio, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">please try to use 3 periods.</p></body></html> Nr. of periods 2 3 <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Dither is used to make the audio cleaner. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The best way to describe it is to imagine a painting with many dots. If you view it up close you can see each dot and the image is not very clear. If you view it from far away the image becomes clearer because your eyes/brain dither the dots to smooth out the image. It is a murky subject and obviously a very personal choice as to what dither is the best. For most people it is just plain magic. Anyone running at 16bit who cares about quality or has CPU cycles to spare should run with dither. Triangular is probably the best compromise of quality vs cpu cost (its very fast), but shaped is the best</p></body></html> Dither None Shaped Rectangular Triangular AlsaDriver ALSA Driver: The playback device %1 is already in use. Please stop the application using it and run Traverso again ALSA Driver: You do not have permission to open the audio device %1 for playback snd_pcm_open(playback_handle, ..) failed with unknown error type ALSA Driver: The capture device %1 is already in use. Please stop the application using it and run Traverso again ALSA Driver: You do not have permission to open the audio device %1 for capture ALSA Driver: snd_pcm_open(capture_handle, ...) failed with unknown error type ALSA Driver: Cannot open PCM device %1 for playback. Falling back to capture-only mode ALSA: Cannot open PCM device %1 for capture. Falling back to playback-only mode ALSA Driver: Unable to configure hardware, is it in use by another application? AppearenceConfigPage Icons only Text only Text beside Icons Text below Icons Default Language Select default project dir Form Theme Theme selector Path to theme files Available themes Adjust theme color Theme Options Paint audio rectified <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Painting the waveform with an outline is more detailed, but requires more cpu.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If you experience slowness when painting many clips, or during animated scroll, unselect this option!</p></body></html> Paint audio with outline Paint stereo audio as mono audio Draw lines at 0 and -6 dB Style Options Select style Use selected style's palette Toolbars Icon size Button style Transport Console size Language Interface Language Changing the language of the Interface will take effect after restarting Traverso! ArmTracks Arm Tracks AudioClip Unable to Record to Track AudioDevice doesn't have this Capture Bus: %1 (Track %2) Toggle Mute Toggle Lock Remove Fades Normalization Set Normalization level: AudioClip: Normalize AudioClipEditDialog Dialog Clip Parameters External Processing hh:mm:ss.sss TextLabel End Length Track start Gain Name Fades Fade In Mode Bending Strength &Linear &Default Fade Out Source AudioClipExternalProcessing Clip: External Processing AudioClipManager Selection: Add Clip Selection: Remove Clip Selection: Invert AudioClipView Click to reset AudioFile ! Reset Audio File for Clip: %1 All files (*);;Audio files (*.wav *.flac) No file selected! Succesfully set AudioClip file to %1 AudioDevice No Driver Loaded Audiodevice: Failed to create the Jack Driver Audiodevice: Failed to create the ALSA Driver Audiodevice: Failed to create the PortAudio Driver No Device Configured The Jack server has been shutdown! AudioDevice:: Buffer underrun 'Storm' detected, switching to Null Driver AudioDevice:: For trouble shooting this problem, please see Chapter 11 from the user manual! Audiodevice: Failed to create the PulseAudio Driver Audiodevice: Failed to create the CoreAudio Driver AudioDeviceThread Unable to set Audiodevice Thread to realtime priority!!!This most likely results in unreliable playback/capture and lots of buffer underruns (== sound drops).In the worst case the program can even malfunction!Please make sure you run this program with realtime privileges!!! AudioDriverConfigPage System default Form Driver Selection Driver: Configure driver <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Duplex mode:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Defines if both the Playback and Capture buses </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">of your soundcard are to be used, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">or only the Playback or Capture bus(es).</p></body></html> Duplex mode Full Playback Capture <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Sample rate:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The sample rate used by the audio card.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">New projects will use this samplerate as </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">the project's sample rate on creation.</p></body></html> Sample rate 22050 32000 44100 48000 88200 96000 <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Buffer latency:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The latency introduced by the size of the audio buffers.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Some people need low latencies, if you don't need it, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">or don't know what it means, please leave the default setting!</p></body></html> Buffer latency (ms) Restart Driver Jack Enable Jack transport control AudioSourcesManagerWidget Form Remove sources Remove source Remove all sources Remove unused sources AudioSources BehaviorConfigPage Form Project Settings On close: Save Ask Don't save Load last used project at startup New Sheet Settings Audio Clip Settings Lock Audio Clips by default Playback Settings <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Keep the play cursor in view while playing or recording.</p></body></html> Scroll playback Jump Stay Centered Animated Continuously adjust audio while dragging Number of tracks BusSelectorDialog Bus Selector Track Capture Buses Channels Both Left Right Playback Buses CDWritingDialog CD Writing General Options Write current Sheet Write all Sheets Calculate and apply normalization Export wav and toc files only (don't write CD) Burning Device Number of copies Simulate Speed auto 1x 2x 4x 8x 12x 16x 20x 24x 28x 32x 36x 40x 44x 48x Status Information Start Writing Abort Close ClipSelection Selection: Remove Clip Selection: Add Clip Select Clip ClipsViewPort Import %n audiofile(s) Crop AudioClip: Magnetic Cut Curve There is allready a node at this exact position, not adding a new node Add CurveNode Remove CurveNode CurveView Drag Node Clear Nodes Dialog Dialog OK Cancel DigitalClock Digital Clock DriverInfo Change Audio Device settings ExportDialog Export General Options Export current Sheet Export all Sheets Export directory Export status - Abort Export Start Export Close ExportFormatOptionsWidget Best High Medium Fast Bitrate Average Bitrate Maximum Bitrate Export Format Options Format Options Encoding File Type Channels Normalize Audio Bitdepth WavPack options (lossless compression) Compression type <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This option reduces the storage of some floating-point data files by up to about 10% by eliminating some information that has virtually no effect on the audio data. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">While this does technically make the compression lossy, it retains all the advantages of floating point data (&gt;600 dB of dynamic range, no clipping, and 25 bits of resolution). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This also affects large integer compression by limiting the resolution to 24 bits.</p></body></html> Skip WVX for extra compression (semi-lossless) Ogg Options Quality (Smallest <-> Best) Encoding Method MP3 Options Minimum Bitrate Quality (Fastest <-> Best) Sample Rate Conversion quality ExternalProcessingDialog You have to supply an argument before starting the external process! Program <b>%1</b> crashed! Available arguments for the sox program Program <b>%1</b> not installed, or insufficient permissions to run! FadeBend Fade In: bend Fade Out: bend FadeCurve Fade Preset FadeMode Fade In: shape Fade Out: shape FadeRange Fade In: length Fade Out: length Fade In: remove Fade Out: remove FadeStrength Fade In: strength Fade Out: strength FileWidget My Computer My Documents Parent Directory Refresh File View Import Import Audio File Insert Silence Silence All files (*) Audio files (*.wav *.flac *.ogg *.mp3 *.wv *.w64) Import audio source ImportClipsDialog Import Audio Clips Import to Track: Add Markers InputEngine Modifier key actions are not supported from Context Menu Hold actions are not supported from Context Menu Command Plugin %1 not found! Plugin %1 doesn't implement Command %2 InsertSilenceDialog Insert Silence Insert Silence (seconds): Interface History Resources Bin Correlation Meter FFT Spectrum Traverso %1 (built with Qt %2) A multitrack audio recording and editing program. Look in the Help menu for more info. Traverso is brought to you by R. Sijrier and others, including all the people from the Free Software world who contributed the important technologies on which Traverso is based (Gcc, Qt, Xorg, Linux, and so on) About Traverso &Project &New... &Open... &Save &Manage Project... &Export... &CD Writing... &Restore Backup... &Quit &Sheet New &Track(s)... New &Sheet(s)... Marker Editor... Import &Audio... Insert Si&lence... &View System Information Se&ttings &Recording File Format &Resample Quality &Preferences... &Getting Started &User Manual &About Traverso <b>Description</b> <b>Key Sequence</b> Opening User Manual in external browser! Traverso - Important A Project directory changed outside of Traverso. This is NOT supported! Please undo this change now! If you want to rename a Project, use the Project Manager instead! Traverso - Project load failed The requested Project `%1` could not be loaded for the following reason: '%2' You will now be given a list of available backups (if any) to restore the Project from. Changed encoding for recording to %1 Changed resample quality to: %1 &Edit Undo Redo &Snap Snap items to edges of other items while dragging. S&croll Playback Keep play cursor in view while playing or recording. &Show Effects Show effect plugins and automation curves on tracks Transport Console Project Edit Best High Medium Fast &Help Open Audio Files Audio files (*.wav *.flac *.ogg *.mp3 *.wv *.w64) %1: %2 JackDriver Jack Driver: Couldn't connect to the jack server, is jack running? Jack Driver: Connected successfully to the jack server! KeyboardConfigPage No description set for this keymap KeyMap Export The exported keymap can be found here: %1 Form Configure Keyboard <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Double fact timeout:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The maximum time in miliseconds between 2 key presses </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">to determine if the 2 key presses are a double fact ( &lt;&lt; K &gt;&gt; or &lt;&lt; KK &gt;&gt;)</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> or 2 individual key presses ( a &lt; K &gt; and &lt; K &gt; action, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">or &lt; KK &gt; and &lt; KK &gt; action for example).</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Experienced users can set this value as low as 150 ms, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">if you don't have much experience yet, please leave the default of 180 ms.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">For more information, see chapter 7: Key Actions. of the User Manual</p></body></html> <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Bitstream Vera Sans; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Double fact timeout (ms)</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Hold timeout:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The maximum time to consider a pressed key a hold key fact, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">like [ K ] or [ KK ].</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The shorter this time, the sooner a pressed key will be </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">detected as a hold action. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Experienced users can set this value as low as 110 ms, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">if you don't have much experience yet, please leave the default of 150 ms.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">For more information, see chapter 7: "Key Actions" of the User Manual.</p></body></html> <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Bitstream Vera Sans; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Hold timeout (ms)</p></body></html> Keymap Select keymap Export Keymap Print Keymap LanguageName English The name of this Language, e.g. German would be Deutch Portuguese MarkerDialog Markers Position Title Options ISRC: Apply to all ... Pre-Emphasis Copy protection Position: (MM:SS:75ths) CD-Text Title: Performer: Composer: CD-Text optional Arranger: Message: &Remove &Export Songwriter &Ok &Cancel MoveClip Copy Clip Move Clip Move Clip To Start Move Clip To End Fold Sheet Fold Track Fold Markers MoveEdge Move Clip Edge NewProjectDialog You must supply a name for the project! Traverso - Question The Project "%1" already exists, do you want to remove it and replace it with a new one ? Yes No Couldn't create project (%1) New Project Name Description Engineer Tracks per Sheet Use Template Open Audio Files Audio files (*.wav *.flac *.ogg *.mp3 *.wv *.w64) Import Audio Files Empty Project ... Track Name File Copy files to project directory Number of Sheets NewSheetDialog I can't create a new Sheet if there is no Project loaded!! Added %n Sheet(s) New Sheet(s) New Sheet name Sheet count Track count Use Template NewTrackDialog I can't create a new Track if there is no Project loaded!! Added %n Track(s) New Track(s) Track name Track count OpenProjectDialog <p>Project directory name <b>%1</b> is different from the Project title <b>%2</b>!</p><p>Did you rename the Project directory ? </p><p>Please rename the directory back to the Project title <b>%1</b>, and change the Project title with the Project Manager Dialog!</p> Description: Created on: No Project selected! Select a project and click the 'Load' button again Project %1 does not exist, did you rename or remove the directory what that name ? You must supply a name for the project! Project does not exist! (%1) Traverso - Question Are you sure that you want to remove the project %1 ? It's not possible to undo it ! Choose an existing or create a new Project Directory Traverso - Warning This directory is not writable by you! Please check permission for this directory or choose another one: %1 Unable to create Project directory! Please check permission for this directory: %1 Traverso - Information Created new Project directory for you here: %1 Open Project Selected Project Load Delete Select Project Dir PADriver PADriver:: PortAudio error: %1 PADriver:: hostapi %1 was not found by Portaudio! PaDriverPage Form Portaudio drivers <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">PortAudio Driver:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The driver which should drive the PortAudio backend</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">PortAudio supports many driver backends, some of which Traverso has native support for too. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It is recommended to use Traverso's native drivers instead of using PortAudio's, however, if the native drivers give problems, you might try the ones supplied by PortAudio instead!</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">PortAudio provides transparent driver support for multiple platforms, including Windows (see the wmme, direct x and asio options), and Mac OS X (see the CoreAudio and jack options)</p></body></html> Driver PerformanceConfigPage Form Audio file buffering <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Read buffer size:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The amount of audio data that can be stored in the </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">read buffers in seconds.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The default value of 1 second should do just fine.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">However, if you're tight on memory, you can make this value lower.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If you experience buffer underruns when the hard disk bandwidth is </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(almost) saturated, or when buffer underruns happen regularly due </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">the hard disk can't keep up for some reason, you can try a larger </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">value, like 1.5 or 2.0 seconds.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Keep in mind that when using a larger buffer, </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">it will take considerably more time to move (i.e. seeking) </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">the playhead to another positions, since all the buffers </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(one for each audioclip * channel count) need to be refilled!</p></body></html> Read buffer size (seconds) info icon Changing the buffer size only will take into effect after (re)loading a project. Painting <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The number of times per second at which the Graphical</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Items are repainted during a jog action, like moving an</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">AudioClip, or changing the Gain.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The default frames per second of 35 is a perfect compromise </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">between smooth painting, and low cpu usage.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">However, if you find the painting to be not smooth enough,</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">change this value to a higher one, but keep in mind that it</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">will consume considerably more cpu!</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If for example moving an AudioClip still takes to much cpu,</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">you should consider to lower this value.</p></body></html> Jog repaint speed (fps) <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Accelerates the painting of AudioClips and Tracks by using</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">the 3D engine of your graphics card.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Depending on your graphics card and driver support, this </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">can speed up painting considerably!</p></body></html> Use hardware acceleration PluginSelectorDialog Plugin Selector Add Plugin too Plugin Name Type In/Out OK Cancel ProgressToolBar Importing file %1 of %2: %p% Progress Toolbar Project Cannot create dir %1 Created new Project %1 Project %1: Cannot open project.tpf file! (Reason: %2) Project %1: Failed to parse project.tpf file! (Reason: %2) Project File Version does not match, unable to load Project! Project %1 loaded Couldn't open Project properties file for writing! (File %1. Reason: %2) Project %1 saved Project with title '%1' allready exists, not setting new title! Project directory %1 no longer exists, did you rename it? Shame on you! Please undo that, and come back later to rename your Project... Traverso - Information Project title changed, Project will to be reloaded to ensure proper operation Sheet %1 added Sheet '%1' doesn't exist! Remove Sheet %1 Export already in progress, cannot start it twice! Detected clipping in exported audio! (%1) calculated norm factor: %1 You're still recording, please stop recording first to be able to exit the application! Unable to create export directory! Please check permissions for this directory: %1 ProjectConverter Project file with version %1 cannot be converted, only files with version 2 can! Project %1: Failed to parse project.tpf file! (Reason: %2) Starting to convert Project from version 2 to version 3 Converting project.tpf file..... Done! <b>Need to convert %1 files</b> Couldn't open Project properties file for writing! (File %1. Reason: %2) Project %1 converted Saving converted project.tpf file.... Done! Conversion finished succesfully No conversion description available! Conversion stopped on user request, you can continue to use this Project with Traverso <= 0.41.0, or reopen it with this version of Traverso and start the conversion again ProjectConverterDialog Project Converter Project XXX (no translation needed) Conversion information Conversion progress Start conversion Stop conversion Load Project Close ProjectInfoWidget Project Information Widget Bitdepth - Rate Songs Project ProjectManager Save Project Do you want to save the Project before quiting? Project %1 already exists! Unable to create new Project %1 Unable to load Project %1 No Project to save, open or create a Project first! Choose a directory to store your Projects in Traverso - Warning No directory was selected, to retry open the 'Open Project Dialog' and click 'Select Project Directory' button This directory is not writable by you! Please check permission for this directory or choose another one: %1 Using existing Project directory: %1 Unable to create Project directory! Please check permission for this directory: %1 Created new Project directory for you here: %1 Project %1 no longer could be found! (Did you remove or rename the Project directory ?) Default Project created by Traverso Could not rename Project directory to %1 Projectfile backup: The project file %1 could not be opened for reading (Reason: %2) Cannot create dir %1 ProjectManagerDialog No new Sheet name was supplied! Save Template Enter Template name Unable to create directory %1! Traverso - Information Template with name %1 already exists! Do you want to overwrite it? Saved Project Template: %1 Couldn't open file %1 for writing! Project with title '%1' allready exists, please supply a different title! Dialog Project Informational Title Description Engineer Export Sheet(s) Template Sheets Sheet Name Tracks Length Selected Sheet Delete Rename New Sheet Create new Sheet CD Text Performer Disc ID: UPC EAN: Genre: Unused Undefined Adult Contemporary Alternative Rock Childrens Classical Contemporary Christian Country Dance Easy Listening Erotic Folk Gospel Hip Hop Jazz Latin Musical New Age Opera Operette Pop Music Rap Reggae Rock Music Rhythm and Blues Sound Effects Spoken Word World Music Arranger Message <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Undo last change</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Redo last change</p></body></html> undotext redotext Songwriter QObject No error occurred An error occurred when reading from the file. An error occurred when writing to the file. A fatal error occurred. The file could not be opened. Resourc error The operation was aborted. A timeout occurred. An unspecified error occurred. The file could not be removed. The file could not be renamed. The position in the file could not be changed. The file could not be resized. The file could not be accessed. The file could not be copied. Unknown error AudioClip Curve CurveNode FadeCurve Marker Sheet TimeLine Track QuickStartDialog Traverso: Getting Started <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"><span style=" font-size:18pt; font-weight:600;">Traverso: Getting Started</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">When you record or import an audio file into Traverso, it shows up as an Audio Clip in one of the horizontal Tracks in the current Sheet. You can edit many aspects of these Clips by placing the mouse pointer over a Clip and pressing or holding different keys on your keyboard and mouse. You can also change settings of a Track, the Sheet as a whole, and other objects in the Sheet.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">To see a list of what commands are available for any given object in the Sheet, move the mouse over that object, and Right-Click (or press Q). The keyboard shortcuts for each command are shown in the menu. The notation used is shown below.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; K &gt; </span> means press and release the K key. (Like a click.)</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"><span style=" font-weight:600;">&lt;&lt; K &gt;&gt;</span> means press the K key two times fast. (Like a double click.)</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ K ]</span> means drag the mouse while holding down the K key.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; KL &gt; </span> means press the K and L keys at the same time.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ KL ] </span> means drag the mouse while holding down the K and L keys at the same time.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">Here are some basic commands:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; SPACE &gt;</span> is Play/Stop.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; SHIFT &gt;</span> sets the Playhead. (Blue vertical line where playing starts.)</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; W &gt;</span> sets the Work Cursor. (Red vertical line.)</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; V &gt; </span> moves the Playhead back to the Work Cursor.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ D ] </span> move objects around (Audio Clip, Curve Nodes, etc)</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ Z ]</span> zooms in and out.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ TAB ]</span> scroll omnidirectional (aka Shuttle) </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">And some Audio Clip Commands:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ E ] </span> drags a Clip's left or right edge.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ F ]</span> adjusts the length of a Clip's Fade In / Fade Out.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ G ] </span>addust the Gain of a clip (also works on Tracks, Sheet)</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; X &gt;</span> splits the Clip at the cursor's position.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">For more information, right-click on everything, or check out the Traverso manual.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p></body></html> ReadSource Silence Could not open file Invalid channel count File has zero channels The file does not exist! No ReadSource error set RecordingConfigPage Form Recording <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">WAV</span> : A format without compression. Uses more hard disk space then compressed encoding formats, but needs very little cpu.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Limits : ~ 1.7 hours of recording time @ Stereo - 44.1 KHz</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">WavPack</span> : A format with compression, up to 2 times smaller compared to WAV, and no quality loss. Uses significantly more cpu then WAV, but with modern (year 2005 and above) cpu's this shouldn't be a problem.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Using this format stresses the hard disk much less, increasing hard disk live, and less chance of saturating the hard disk bandwidth.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Limits : ~ 5 hours recording time @ Stereo - 44.1 KHz</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">WAV64</span> : WAV format with 64 bit header, support by other programs is currently limited.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Limits : None, thousands of hours of recording time, supposed that your hard disk can hold it.</p></body></html> Encoding format WavPack options Compression type <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This option reduces the storage of some floating-point data files by up to about 10% by eliminating some information that has virtually no effect on the audio data. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">While this does technically make the compression lossy, it retains all the advantages of floating point data (&gt;600 dB of dynamic range, no clipping, and 25 bits of resolution). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This also affects large integer compression by limiting the resolution to 24 bits.</p></body></html> Skip WVX for extra compression (semi-lossless) Resampling Enable on the fly resampling (Playback only) On the fly resample quality Default export resample quality Best High Medium Fast ResourcesManager ResourcesManager:: Failed to initialize ReadSource %1 (Reason: %2) ResourcesManager: Received request to remove Audio Source %1but it is still in use by %2 AudioClips!!. NOT removing it! ResourcesWidget Form Sources Files Name Length Start End RestoreProjectBackupDialog Restore from backup Set the date to restore the selected backup. Current date and time: Last backup: - Date Time SettingsDialog Behavior Appearance Audio Options Keyboard Performance Sound System Preferences - Traverso Sheet Untitled No artists name set Add Track Remove Track No audio to export! (Is everything muted?) Export start frame starts beyond export end frame!! Export tries to render to 0 channels wav file?? Hard Disk overload detected! Failed to fill ReadBuffer in time Failed to empty WriteBuffer in time No Tracks armed for recording! Recording to %n Clip(s) SongInfoWidget SongInfoWidget Song - Snap Gain SMPTE Zoom SpectralMeterConfigWidget FFT-Spectrum Configuration Frequency Range Show average spectrum Number of bands: Lower dB value: Upper dB value: Hz Lower Limit: Upper Limit: Advanced FFT Options FFT Size: 256 512 1024 2048 4096 8192 Rectangle Hanning Hamming Blackman Windowing function: Advanced Apply &Close SpectralMeterView Screen Capture file name FFT: Unable to write captured image to hard disk FFT: No avarage curve used, not data to export! FFT: Enable avarage curve with < M > to generate data FFT: No avarage data to export! Select output format Output format: Export average dB curve SplitClip Split Clip SysInfoToolBar System Information SystemInfoWidget SystemInfoWidget Card Name (na) image buffer size (na) rate - GB drivertype (na) xruns (na) latency (na) - % bitdepth SystemResources Read Buffer Status Write Buffer Status TimeLine Add Marker Remove Marker TimeLineView End Add Marker You have to remove all other markers first. Drag Marker Clear Markers Track Track: AudioClip with id %1 not found in Resources database! Remove Clip Add Clip Silence Others TrackPan Track Pan: %1 Track Pan TrackView Set Track name Enter new Track name Track %1: %2 TransportConsoleWidget Skip to Start Previous Snap Position Record Play / Stop Next Snap Position Skip to End Recording to %1 Tracks, encoding format: %2 TraversoCommands Gain Gain: Reset Panorama Panorama: Reset Import Audio Insert Silence Copy Clip New Track Remove Clip Remove Track External Processing Move Clip Drag Edge Move Or Resize Clip Split Arm Tracks Fold Sheet Fold Track Vertical In Horizontal Out Horizontal In Vertical Out Omnidirectional Horizontal Vertical Right Left Up Down (De)Select All Fold Markers (De)Select Magnetic Cut traverso-0.49.4/resources/translations/traverso_fr.qm000644 001750 001750 00000472035 11430303020 023402 0ustar00remonremon000000 000000 445x$5>5Q5~667x/7\78B?HzLDPvLD3LDPX_2/%K'KVCT>2Sx>ls>?N0Ѫ-5X&LȤȤӼȤ0^%. +֍8֍Fx֍}v֍֍y֍ ֍^C֍l֍0֍3QaF0JaDnp7MkI8H8LO8r8YUyt\ŨtɬB$Fڛy\Y"q;4oqT4F>A>/D~$$.Y86 (#Q'1Y/aY5_bXe.j…wDN֓JF p!W0__ПzI0rC7N.WƤ-~jõ6B|:B}, . ~.0EN[ _CAf"DqWv ez'@yzNP‚ǼN/eG`~$=Rx6=qh{<M}*NȺ[@V.P.XU[;[\l:Dj|t??t>*#I1 .C+!6%)9OymSBU1JoGLoY{MCHVgmT{}dS^|'):cϥϥ. ʗ]U˿Tϸ9"кb故I4>ͻqCb ,*(5D8:G8I8IJI(^kTvv:&Oxnx[1rDE?sp8=IIIo*]y1W"^8t,>,nϕ8tWP8W5W^? ^T\(Gj,vvր>!rX:O-OEE榼wzإ8#EFogn 4AU1H u!T$)B'~A*Y,,NR,N_,N498;;=;1 = O5= O=EFCR*SYG U-NiDk2ZsRPsUu%H5%KL ݛ.gq+Ў)ft;Tz#LiWɴN'֪!"EV#F ; P^ e S~b^+BPe2pm5?(*K3*/=/A15eDAZZ:@[;9\uBaMb#KjGl sp{'%N&6adJEJW.( ?ݐ%MGgno*E8?ZE9RK,o>O =p ~ 'JJNSh\Aua~vkmCnPQr%lC<43EFZa% ʏ _  p Snd :RQYs+l`)`WŒ!;Ġ!ԍAխ.'m 9/7 ldVde"~d"9r#O9ϕGC2CGD2Kr9KC?sP2PFOQ-CVQ[mCqsN<%v\5[[}Ay3WSo;P !3 1+Hb bԟ 0[ D.6 Mg-S Mg YX [[[ ]Ws g h> {X IBk .X ! 1N\ P xu 3h E1b E8) R 몠 3 \@5 \ 2 % B 2- 9. !(F 'n *L =at A#- Cb{ LZ~ dpQ h? h? h1 lP= l[ l4 rDZ I$' C OT L ʿG v$_ OzO فb F ! % >n l J  #(I %$9 0KO 7ס GI.~ L. Q6^y ] h).# zV YPT YP4 F$ 7 |Y i< M? ɂeA Ӱ- 0> | ;p ܄~ ޤ 8X 5 dO K ?  IX D ( * >cF ,Jd* ,g` ,g`Q ,g`\K 1 " 25%x 3af 6kJ ;!D > G- N0# Q3' SA ^ _; b b bڅ iuPs t`) t`ZN ztQ ~7 ~7 ~7Y k s)  sJ ] Ãd x'_ [T0 L )3R ) sIc ڞE ڞ{y ڞ ػ1B | ]8 y G7 1\ ^& nj F3B !/S 3Gyq0 3Gy 35 37 5J7 7vz= 7vz 8Fq =OM Q\c RZ5 _/l ` eV<% jnx nP' ql| . Up XyM E  T/ тL ͤz O~ u.!_ScsoTpY6\K()/M=zGCLU[fc.$g&s p%p<?pq/y}3y%t1zP{|lAK|l@APB:PtPGg>GjrRtC8uڱćmĄsn9(!9]O   %*"I(}3-J.RGx"KUbfggJy1|>y*Pni]2f]6"|R.I7U:SK#Sai]&Supprimer la rgion Remove Clip AddRemoveClip@Supprimer la rgion slectionneRemove Selected Clips AddRemoveClip22AlsaDevicesPage33AlsaDevicesPage<html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Priphrique :</span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Le priphrique ALSA matriel ou virtuel tre utilis.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Le priphrique matriel est la carte son installe sur votre ordinateur.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Un priphrique virtuel est celui cr dans le fichier .asoundrc, </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Souvent situ dans votre dossier personnel.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Si vous n'tes pas sr, utilisez soit le priphrique par dfaut, qui va utiliser le priphrique son </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">configur par votre distribution, ou le priphrique portant le nom de votre carte son.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Dans le dernier cas, vrifiez qu'aucun programme n'utilise votre carte son, </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">sinon le pilote ne pourra pas s'initialiser!</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Pour plus d'informations, consultez le chapitre 3.1: "The Driver Backend" du manuel d'utilisateur</p></body></html> [

Device:

The real or virtual ALSA device to be used.

A real device is the audiocard installed in your system.

A virtual device is one created in the .asoundrc file,

often located in your home folder.

If unsure, use either the default device, this will use the audiodevice

configured by your distribution, or the device that names your audio card.

In the latter case, please make sure no application uses the audiocard,

else the driver won't be able to initialize!

For more info see chapter 3.1: "The Driver Backend" of the User Manual

AlsaDevicesPage,<html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Nombre de Priodes :</span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Audio is managed in small chunks called periods. </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This value determines how many of these chunks are </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">to be used by the driver of the audiocard.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The default should work just fine, and gives optimal latency behavior.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">However, some (buggy) alsa drivers don't work correctly </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">with the default of 2, if you experience very choppy audio, </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">please try to use 3 periods.</p></body></html>

Number of Periods:

Audio is managed in small chunks called periods.

This value determines how many of these chunks are

to be used by the driver of the audiocard.

The default should work just fine, and gives optimal latency behavior.

However, some (buggy) alsa drivers don't work correctly

with the default of 2, if you experience very choppy audio,

please try to use 3 periods.

AlsaDevicesPage"Priphrique ALSA ALSA DeviceAlsaDevicesPagePriphriqueDeviceAlsaDevicesPageFormulaireFormAlsaDevicesPageSansNoneAlsaDevicesPageNb. de priodesNr. of periodsAlsaDevicesPageRectangulaire RectangularAlsaDevicesPageTriangulaire TriangularAlsaDevicesPagePilote ALSA : impossible d'ouvrir le priphrique PCM de lecture %1. Retour au mode enregistrement uniquementVALSA Driver: Cannot open PCM device %1 for playback. Falling back to capture-only mode AlsaDriverPilote ALSA : Le priphrique d'enregistrement %1 est dj utilis. Artez le programme l'utilisant et redmarrez TraversoqALSA Driver: The capture device %1 is already in use. Please stop the application using it and run Traverso again AlsaDriverPilote ALSA : le priphrique de lecture %1 est dj utilis. Arrtez le programme l'utilisant et redmarrez TraversorALSA Driver: The playback device %1 is already in use. Please stop the application using it and run Traverso again AlsaDriverPilote ALSA : Impossible de configurer le matriel, est-il utilis par un autre programme ?OALSA Driver: Unable to configure hardware, is it in use by another application? AlsaDriverPilote ALSA : Vous n'avez pas les droits pour ouvrir le priphrique d'enregistrement %1OALSA Driver: You do not have permission to open the audio device %1 for capture AlsaDriverPilote ALSA : Vous n'avez pas les droits d'ouvrir le priphrique audio %1 en lecturePALSA Driver: You do not have permission to open the audio device %1 for playback AlsaDriverPilote ALSA : chec de snd_pcm_open(playback_handle, ..) d une erreur inconnueMALSA Driver: snd_pcm_open(capture_handle, ...) failed with unknown error type AlsaDriverALSA : impossible d'ouvrir le priphrique PCM d'enregistrement %1. Retour au mode lecture uniquementOALSA: Cannot open PCM device %1 for capture. Falling back to playback-only mode AlsaDriverEchec de snd_pcm_open(playback_handle, ..) d une erreur inconnue@snd_pcm_open(playback_handle, ..) failed with unknown error type AlsaDriver6Dfinir la couleur du thmeAdjust theme colorAppearenceConfigPage$Thmes disponiblesAvailable themesAppearenceConfigPage"Style des boutons Button styleAppearenceConfigPage<Tracer des lignes 0 et -6 dBDraw lines at 0 and -6 dBAppearenceConfigPageFormulaireFormAppearenceConfigPage"Taille des icones Icon sizeAppearenceConfigPage Icones seulement Icons onlyAppearenceConfigPage@Afficher l'audio avec un contourPaint audio with outlineAppearenceConfigPageZAfficher l'audio stro comme de l'audio mono Paint stereo audio as mono audioAppearenceConfigPageDChemin jusqu'aux fichiers de thmePath to theme filesAppearenceConfigPage*Slectionner un style Select styleAppearenceConfigPage Options de style Style OptionsAppearenceConfigPage*Texte sous les iconesText below IconsAppearenceConfigPage0Texte c^ot des iconesText beside IconsAppearenceConfigPageTexte seulement Text onlyAppearenceConfigPage Options du thme Theme OptionsAppearenceConfigPage$Slecteur de thmeTheme selectorAppearenceConfigPageBarres d'outilsToolbarsAppearenceConfigPageNUtilise la palette du style slectionnUse selected style's paletteAppearenceConfigPage Armer les pistes Arm Tracks ArmTracksLe priphrique audio n'a pas ce bus d'enregistrement : %1 (Piste %2)8AudioDevice doesn't have this Capture Bus: %1 (Track %2) AudioClipNormalisation Normalization AudioClip&Supprime les fondus Remove Fades AudioClipFRgler le niveau de normalisation :Set Normalization level: AudioClipMuet Toggle Mute AudioClipJImpossible d'enregistrer sur la pisteUnable to Record to Track AudioClip&Par &dfaut&DefaultAudioClipEditDialog&Linaire&LinearAudioClipEditDialog$Paramtres du clipClip ParametersAudioClipEditDialogDialogueDialogAudioClipEditDialogFinEndAudioClipEditDialog$Traitement externeExternal ProcessingAudioClipEditDialog$Fondu en ouvertureFade InAudioClipEditDialog$Fondu en fermetureFade OutAudioClipEditDialog FondusFadesAudioClipEditDialogGainGainAudioClipEditDialogLongueurLengthAudioClipEditDialogModeModeAudioClipEditDialogNomNameAudioClipEditDialog$Etiquette de texte TextLabelAudioClipEditDialog"Dbut de la piste Track startAudioClipEditDialoghh:mm:ss:sss hh:mm:ss.sssAudioClipEditDialog2Clip : traitement externeClip: External ProcessingAudioClipExternalProcessing6Slection : ajouter un clipSelection: Add ClipAudioClipManager(Slection : inverserSelection: InvertAudioClipManager:Slection : supprimer un clipSelection: Remove ClipAudioClipManagerhTous les fichiers (*);;Fichiers audio (*.wav *.flac))All files (*);;Audio files (*.wav *.flac) AudioClipViewZCliquez pour rinitialiser le fichier audio !Click to reset AudioFile ! AudioClipView6Aucun fichier slectionn !No file selected! AudioClipView`Rinitialiser le fichier audio pour le clip : %1Reset Audio File for Clip: %1 AudioClipViewPriphrique audio : pour rsoude ce problme, lisez le chaptre 11 du manuel d'utilisateur !\AudioDevice:: For trouble shooting this problem, please see Chapter 11 from the user manual! AudioDevicezPriphrique audio : chec lors de la cration du pilote ALSA-Audiodevice: Failed to create the ALSA Driver AudioDevicezPriphrique audio : chec lors de la cration du pilote Jack-Audiodevice: Failed to create the Jack Driver AudioDevicePriphrique audio : chec lors de la cration du pilote PortAudio2Audiodevice: Failed to create the PortAudio Driver AudioDevicezPriphrique audio : impossible de crer le pilote PulseAudio3Audiodevice: Failed to create the PulseAudio Driver AudioDevice8Aucun priphrique configurNo Device Configured AudioDevice&Aucun pilote chargNo Driver Loaded AudioDevice:Le serveur Jack a t ferm !"The Jack server has been shutdown! AudioDevice 2205022050AudioDriverConfigPage 3200032000AudioDriverConfigPage 4410044100AudioDriverConfigPage 4800048000AudioDriverConfigPage 8820088200AudioDriverConfigPage 9600096000AudioDriverConfigPage`

Buffer latency:

The latency introduced by the size of the audio buffers.

Some people need low latencies, if you don't need it,

or don't know what it means, please leave the default setting!

AudioDriverConfigPaged<html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Mode duplex:</span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Defini si les bus de lecture et d'enregistrement </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">de votre carte son doivent tre utiliss en mme temps, </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ou seulement le bus de lecture ou d'enregistrement.</p></body></html>

Duplex mode:

Defines if both the Playback and Capture buses

of your soundcard are to be used,

or only the Playback or Capture bus(es).

AudioDriverConfigPage<html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Sample rate:</span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">La frquence d'chantillonage utilise par votre carte son.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Les nouveaux projets utiliseront celle-ci </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">en temps que frquence d'chantillonage du projet la cration.</p></body></html>'

Sample rate:

The sample rate used by the audio card.

New projects will use this samplerate as

the project's sample rate on creation.

AudioDriverConfigPageCaptureCaptureAudioDriverConfigPage(Configurer le piloteConfigure driverAudioDriverConfigPage&Slection du piloteDriver SelectionAudioDriverConfigPagePilote :Driver:AudioDriverConfigPageMode duplex Duplex modeAudioDriverConfigPageJActiver le contrle du transport JackEnable Jack transport controlAudioDriverConfigPageFormulaireFormAudioDriverConfigPageFullFullAudioDriverConfigPageJackJackAudioDriverConfigPageLecturePlaybackAudioDriverConfigPage(Redmarrer le piloteRestart DriverAudioDriverConfigPage4Frquence d'chantillonage Sample rateAudioDriverConfigPage*Par dfaut du systmeSystem defaultAudioDriverConfigPageSources audio AudioSourcesAudioSourcesManagerWidgetFormulaireFormAudioSourcesManagerWidget8Supprimer toutes les sourcesRemove all sourcesAudioSourcesManagerWidget&Supprimer la source Remove sourceAudioSourcesManagerWidget*Supprimer les sourcesRemove sourcesAudioSourcesManagerWidgetBSupprimer les sources inutilisesRemove unused sourcesAudioSourcesManagerWidget<html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Garde le curseur de lecture en vue lors de la lecture ou de l'enregistrement .</p></body></html>

Keep the play cursor in view while playing or recording.

BehaviorConfigPage AnimAnimatedBehaviorConfigPageDemanderAskBehaviorConfigPage6Configuration du clip audioAudio Clip SettingsBehaviorConfigPage$Ne pas sauvegarder Don't saveBehaviorConfigPageFormulaireFormBehaviorConfigPage SauterJumpBehaviorConfigPageLCharger le dernier projet au lancement!Load last used project at startupBehaviorConfigPageJVrouiller les clips audio par dfautLock Audio Clips by defaultBehaviorConfigPageNPrfrences du nouvel espace de travailNew Sheet SettingsBehaviorConfigPage Nombre de pistesNumber of tracksBehaviorConfigPage A la fermeture : On close:BehaviorConfigPage0Configuration de lecturePlayback SettingsBehaviorConfigPage"Options du projetProject SettingsBehaviorConfigPageSauvegarderSaveBehaviorConfigPageRester centr Stay CenteredBehaviorConfigPageLes deuxBothBusSelectorDialog Slecteur de bus Bus SelectorBusSelectorDialog(Bus d'enregistrement Capture BusesBusSelectorDialog CanauxChannelsBusSelectorDialog GaucheLeftBusSelectorDialogBus de lecturePlayback BusesBusSelectorDialog DroiteRightBusSelectorDialog PisteTrackBusSelectorDialog12x12xCDWritingDialog16x16xCDWritingDialog1x1xCDWritingDialog20x20xCDWritingDialog24x24xCDWritingDialog28x28xCDWritingDialog2x2xCDWritingDialog32x32xCDWritingDialog36x36xCDWritingDialog40x40xCDWritingDialog44x44xCDWritingDialog48x48xCDWritingDialog4x4xCDWritingDialog8x8xCDWritingDialogAbandonnerAbortCDWritingDialog.Priphrique de gravureBurning DeviceCDWritingDialogGravure CD CD WritingCDWritingDialogLCalculer et appliquer la normalisation!Calculate and apply normalizationCDWritingDialog FermerCloseCDWritingDialogpExporte seulement les wav et la TOC (ne grave pas le CD).Export wav and toc files only (don't write CD)CDWritingDialog"Options gnralesGeneral OptionsCDWritingDialogInformation InformationCDWritingDialogNombe de copiesNumber of copiesCDWritingDialogSimulationSimulateCDWritingDialogVitesseSpeedCDWritingDialog&Dmarrer la gravure Start WritingCDWritingDialog StatutStatusCDWritingDialogDEcrire tous les espaces de travailWrite all SheetsCDWritingDialog4Ecrire l'espace de travailWrite current SheetCDWritingDialogautoautoCDWritingDialog(Slectionner un clip Select Clip ClipSelection6Slection : ajouter un clipSelection: Add Clip ClipSelection:Slection : supprimer le clipSelection: Remove Clip ClipSelectionImport %n audiofile(s) ClipsViewPort Ajouter un noeud Add CurveNodeCurve$Supprimer un noeudRemove CurveNodeCurveIl y a dj un noeud cet endroit exact. Pas de nouveau noeud ajoutFThere is allready a node at this exact position, not adding a new nodeCurve2Supprimer tous les noeuds Clear Nodes CurveView"Dplacer le noeud Drag Node CurveViewAnnulerCancelDialogDialogueDialogDialogOKOKDialog"Horloge numrique Digital Clock DigitalClock\Modifie la configuration du priphrique audioChange Audio Device settings DriverInfo-- ExportDialog*Annuler l'exportation Abort Export ExportDialog FermerClose ExportDialogExporterExport ExportDialog8Exporter toutes les feuillesExport all Sheets ExportDialog8Exporter l'espace de travailExport current Sheet ExportDialog&Exporter le dossierExport directory ExportDialog.Statut de l'exportation Export status ExportDialog"Options gnralesGeneral Options ExportDialog,Dmarrer l'exportation Start Export ExportDialog <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Cette option rduit la taille de certains fichiers de donnes virgule flottante jusqu' 10% en liminant certaines informations qui n'ont virtuellement aucun effet sur les donnes audio. </p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Bien que cela soit techniquement une compression avec perte, cela garde l'avantage des donnes virgule flottante (&gt;600 dB of dynamic range, no clipping, et une resolution de 25 bits). </p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This also affects large integer compression by limiting the resolution to 24 bits.</p></body></html>B

This option reduces the storage of some floating-point data files by up to about 10% by eliminating some information that has virtually no effect on the audio data.

While this does technically make the compression lossy, it retains all the advantages of floating point data (>600 dB of dynamic range, no clipping, and 25 bits of resolution).

This also affects large integer compression by limiting the resolution to 24 bits.

ExportFormatOptionsWidgetDFrquence d'chantillonage moyenneAverage BitrateExportFormatOptionsWidgetMeilleurBestExportFormatOptionsWidget6Profondeur d'chantillonageBitdepthExportFormatOptionsWidget4Frquence d'chantillonageBitrateExportFormatOptionsWidget CanauxChannelsExportFormatOptionsWidget&Type de compressionCompression typeExportFormatOptionsWidget0Qualit de la conversionConversion qualityExportFormatOptionsWidgetEncodageEncodingExportFormatOptionsWidget$Mthode d'encodageEncoding MethodExportFormatOptionsWidget>Options du format d'exportationExport Format OptionsExportFormatOptionsWidget RapideFastExportFormatOptionsWidgetType de fichier File TypeExportFormatOptionsWidget"Options du formatFormat OptionsExportFormatOptionsWidgetHautHighExportFormatOptionsWidgetOptions MP3 MP3 OptionsExportFormatOptionsWidgetDFrquence d'chantillonage maximumMaximum BitrateExportFormatOptionsWidget MoyenMediumExportFormatOptionsWidgetDFrquence d'chantillonage minimumMinimum BitrateExportFormatOptionsWidget$Normaliser l'audioNormalize AudioExportFormatOptionsWidgetOptions ogg Ogg OptionsExportFormatOptionsWidget<Qualit (rapide <-> meilleure)Quality (Fastest <-> Best)ExportFormatOptionsWidget<Qualit (faible <-> meilleure)Quality (Smallest <-> Best)ExportFormatOptionsWidget4Frquence d'chantillonage Sample RateExportFormatOptionsWidget|Sauter WVX pour une compression supplmentaire (semi-lossless).Skip WVX for extra compression (semi-lossless)ExportFormatOptionsWidgetPOptions WavPack (compression sans perte)&WavPack options (lossless compression)ExportFormatOptionsWidgetVArguments disponibles pour le programme sox'Available arguments for the sox programExternalProcessingDialogBLe programme <b>%1</b> a crash !Program %1 crashed!ExternalProcessingDialogLe programme <b>%1</b> n'est pas install, ou vous n'avez pas la permission!DProgram %1 not installed, or insufficient permissions to run!ExternalProcessingDialogVous devez fournir un argument avant de dmarrer un processus externe !DYou have to supply an argument before starting the external process!ExternalProcessingDialog(Fondu en ouverture : Fade In: bendFadeBend(Fondu en fermeture :Fade Out: bendFadeBend4Fondu en ouverture : formeFade In: shapeFadeMode4Fondu en fermeture : formeFade Out: shapeFadeMode:Fondu en ouverture : longueurFade In: length FadeRange<Fondu en ouverture : supprimerFade In: remove FadeRange:Fondu en fermeture : longueurFade Out: length FadeRange<Fondu en fermeture : supprimerFade Out: remove FadeRange4Fondu en ouverture : forceFade In: strength FadeStrength4Fondu en fermeture : forceFade Out: strength FadeStrengthMon ordinateur My Computer FileWidgetMes documents My Documents FileWidgetDossier parentParent Directory FileWidget,Rafraichir l'affichageRefresh File View FileWidget*Tous les fichiers (*) All files (*)ImporthFichiers audio (*.wav *.flac *.ogg *.mp3 *.wv *.w64)1Audio files (*.wav *.flac *.ogg *.mp3 *.wv *.w64)Import2Importer un fichier audioImport Audio FileImport2Importer une source audioImport audio sourceImport$Insrer un silenceInsert SilenceImportSilenceSilenceImport"Ajouter un repre Add MarkersImportClipsDialog4Importer des rgions audioImport Audio ClipsImportClipsDialog0Importer vers la piste :Import to Track:ImportClipsDialogHGreffon de commande %1 introuvable !Command Plugin %1 not found! InputEngineLes actions "maintenir" ne sont pas supportes depuis le menu contextuel0Hold actions are not supported from Context Menu InputEngine8Modifier key actions are not supported from Context Menu InputEngineZLe greffon %1 n'implmente pas la commande %2&Plugin %1 doesn't implement Command %2 InputEngine$Insrer un silenceInsert SilenceInsertSilenceDialog>Insrer un silence (secondes) :Insert Silence (seconds):InsertSilenceDialog%1 : %2%1: %2 Interface*&A propos de Traverso&About Traverso Interface &Graver un CD...&CD Writing... Interface&Edition&Edit Interface&Exporter... &Export... Interface&Premiers pas&Getting Started Interface &Aide&Help Interface&&Grer le projet...&Manage Project... Interface&Nouveau...&New... Interface&Ouvrir...&Open... Interface&Prfrences...&Preferences... Interface&Projet&Project Interface&Quitter&Quit Interface2&Format d'en&registrement&Recording File Format Interface:Qualit de &rchantillonnage&Resample Quality Interface8&Restaurer une sauvegarde...&Restore Backup... Interface&Enregistrer&Save Interface$&Espace de travail&Sheet Interface&&Montrer les effets &Show Effects Interface&Adhrer&Snap Interface&Manuel &Utilisateur &User Manual Interface&Affichage&View Interface$<b>Description</b>Description Interface&<b>Squence cl</b>Key Sequence InterfacerUn rpertoire de projet a chang hors de Traverso. Ceci n'est PAS support ! Annulez ce changement maintenant ! Si vous voulez renommer un projet, utilisez le gestionnaire de projet !A Project directory changed outside of Traverso. This is NOT supported! Please undo this change now! If you want to rename a Project, use the Project Manager instead! Interface(A propos de TraversoAbout Traverso InterfacehFichiers audio (*.wav *.flac *.ogg *.mp3 *.wv *.w64)1Audio files (*.wav *.flac *.ogg *.mp3 *.wv *.w64) InterfaceMeilleurBest InterfaceVEncodage pour l'enregistrement chang en %1$Changed encoding for recording to %1 InterfaceVQualit du rchantillonage change en : %1Changed resample quality to: %1 InterfacePhase-metreCorrelation Meter InterfaceEditionEdit InterfaceSpectre FFT FFT Spectrum Interface RapideFast InterfaceHautHigh InterfaceHistoriqueHistory Interface$Importer &Audio...Import &Audio... Interface,Insrer un si&lence...Insert Si&lence... InterfaceGarder la tte de lecture visible lors de la lecture ou de l'enregistrement.4Keep play cursor in view while playing or recording. Interface*Editeur de repres...Marker Editor... Interface MoyenMedium InterfaceJNouvel(eaux) &espace(s) de travail...New &Sheet(s)... Interface0Nouvelle(s) &piste(s)...New &Track(s)... Interface2Ouvrir des fichiers audioOpen Audio Files InterfacexOuverture du manuel utilisateur dans un navigateur externe !(Opening User Manual in external browser! Interface ProjetProject InterfaceRefaireRedo InterfaceRessources Resources Bin Interface&Options Se&ttings InterfacezMontrer les effets et les courbes d'automation sur les pistes3Show effect plugins and automation curves on tracks InterfaceFaire adhrer les bords des autres objets lors des dplacements.2Snap items to edges of other items while dragging. Interface(Informations SystmeSystem Information InterfaceTLe projet '%1' n'a pas pu tre charg pour la raison suivante : '%2' Une liste de sauvegardes pralables (s'il y en a) va vous tre donne afin de restaurer le projet.The requested Project `%1` could not be loaded for the following reason: '%2' You will now be given a list of available backups (if any) to restore the Project from. Interface(Console de transportTransport Console InterfaceTraverso %1 (fait avec Qt %2) Un programme d'enregistrement et d'dition audio multipiste. Utilisez le menu d'aide pour plus d'informations. Traverso est dvelopp pour vous par R. Sijrier et d'autres, notamment toutes les personnes du monde du logiciel libre qui ont contribu aux importantes technologies sur lesquelles Traverso est bas (Gcc, Qt, Xorg, Linux, etc...)KTraverso %1 (built with Qt %2) A multitrack audio recording and editing program. Look in the Help menu for more info. Traverso is brought to you by R. Sijrier and others, including all the people from the Free Software world who contributed the important technologies on which Traverso is based (Gcc, Qt, Xorg, Linux, and so on) Interface(Traverso - ImportantTraverso - Important InterfacePTraverso - Echec de chargement du projetTraverso - Project load failed InterfaceAnnulerUndo InterfacehPilote Jack : connect avec succs au serveur Jack !7Jack Driver: Connected successfully to the jack server! JackDriverPilote Jack : impossible de se connecter au serveur Jack, Jack est-il lanc ?BJack Driver: Couldn't connect to the jack server, is jack running? JackDriver<html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Bitstream Vera Sans; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Dlai de la double action (ms)</p></body></html>Z

Double fact timeout (ms)

KeyboardConfigPage<html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Bitstream Vera Sans; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Dlai pour l'action maintenir (ms)</p></body></html>S

Hold timeout (ms)

KeyboardConfigPage<html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Dlai d'action simultane :</span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Le temps maximum en millisecondes entre 2 actions au clavier. </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Pour dterminer si, lorsqu'on appui sur deux touches, il 'agit d'une action simultane ( &lt;&lt; K &gt;&gt; ou &lt;&lt; KK &gt;&gt;)</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> ou bien de deux actions diffrentes ( a &lt; K &gt; et &lt; K &gt; action, </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ou &lt; KK &gt; et &lt; KK &gt; action par exemple).</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Les utilisateurs expriments peuvent rgler cette valeur 150 ms, </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">si vous n'avez pas encore beaucoup d'exprience, laissez la valeur par dfaut de 180 ms.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Pour plus d'information, voir le chapitre 7 : Key Actions. du manuel d'utilisateur</p></body></html>

Double fact timeout:

The maximum time in miliseconds between 2 key presses

to determine if the 2 key presses are a double fact ( << K >> or << KK >>)

or 2 individual key presses ( a < K > and < K > action,

or < KK > and < KK > action for example).

Experienced users can set this value as low as 150 ms,

if you don't have much experience yet, please leave the default of 180 ms.

For more information, see chapter 7: Key Actions. of the User Manual

KeyboardConfigPage<html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Dlai pour l'action "maintenir":</span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Le dlai maximum pour qu'une touche appuye soit considre comme maintenue, </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">comme [ K ] ou [ KK ].</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Le plus court le dlai, le plus rapidement la touche appuye </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">sera dtecte comme une action "maintenir". </p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Les utilisateurs expriments peuvent rgler cette valeur 110 ms, </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">si vous n'avez pas encore beaucoup d'exprience, laissez la valeur par dfaut de 150 ms.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Pour plus d'information, voir le chapitre 7 : Key Actions. du manuel d'utilisateur.</p></body></html>7

Hold timeout:

The maximum time to consider a pressed key a hold key fact,

like [ K ] or [ KK ].

The shorter this time, the sooner a pressed key will be

detected as a hold action.

Experienced users can set this value as low as 110 ms,

if you don't have much experience yet, please leave the default of 150 ms.

For more information, see chapter 7: "Key Actions" of the User Manual.

KeyboardConfigPage0Configuration du clavierConfigure KeyboardKeyboardConfigPage:export des raccourcis clavier Export KeymapKeyboardConfigPageFormulaireFormKeyboardConfigPage@Exporter les raccourcis claviers KeyMap ExportKeyboardConfigPage"Raccourci clavierKeymapKeyboardConfigPageXPas de description pour ce raccourci clavier"No description set for this keymapKeyboardConfigPageBImpression des raccourcis clavier Print KeymapKeyboardConfigPage@Slection d'un raccourci clavier Select keymapKeyboardConfigPagetLes raccourcis claviers peuvent tre trouvs ici : (sp)%1+The exported keymap can be found here: %1KeyboardConfigPage FrenchEnglish LanguageName&Annuler&Cancel MarkerDialog&Exporter&Export MarkerDialog&Ok&Ok MarkerDialog&Supprimer&Remove MarkerDialog...... MarkerDialog Appliquer tous Apply to all MarkerDialogArrangeur : Arranger: MarkerDialogTexte du CDCD-Text MarkerDialog*Texte optionnel du CDCD-Text optional MarkerDialogCompositeur : Composer: MarkerDialog4Protection contre la copieCopy protection MarkerDialog ISRC :ISRC: MarkerDialogRepresMarkers MarkerDialogMessage :Message: MarkerDialogOptionsOptions MarkerDialogArtiste : Performer: MarkerDialogPositionPosition MarkerDialog0Position : (MM:SS:75ths)Position: (MM:SS:75ths) MarkerDialog Pr-accentuation Pre-Emphasis MarkerDialogParolier Songwriter MarkerDialog TitreTitle MarkerDialogTitre :Title: MarkerDialogCopier le clip Copy ClipMoveClip Dplacer le clip Move ClipMoveClip2Dplacer le clip la finMove Clip To EndMoveClip2Dplacer le clip au dbutMove Clip To StartMoveClip0Splacer le bord du clipMove Clip EdgeMoveEdge......NewProjectDialoghFichiers audio (*.wav *.flac *.ogg *.mp3 *.wv *.w64)1Audio files (*.wav *.flac *.ogg *.mp3 *.wv *.w64)NewProjectDialog`Copier les fichiers dans le rpertoire du projetCopy files to project directoryNewProjectDialogDImpossible de crer le projet (%1)Couldn't create project (%1)NewProjectDialogDescription DescriptionNewProjectDialogProjet vide Empty ProjectNewProjectDialogIngnieurEngineerNewProjectDialogFichierFileNewProjectDialog6Importer des fichiers audioImport Audio FilesNewProjectDialogNomNameNewProjectDialogNouveau projet New ProjectNewProjectDialogNonNoNewProjectDialog6Nombre d'espaces de travailNumber of SheetsNewProjectDialog2Ouvrir des fichiers audioOpen Audio FilesNewProjectDialogLe projet %1 existe dj. Voulez-vous le supprimer et le remplacer par un nouveau ?YThe Project "%1" already exists, do you want to remove it and replace it with a new one ?NewProjectDialogNom de la piste Track NameNewProjectDialog$Pistes par feuilleTracks per SheetNewProjectDialog&Traverso - QuestionTraverso - QuestionNewProjectDialog&Utiliser un gabarit Use TemplateNewProjectDialogOuiYesNewProjectDialogTVous devez choisir un nom pour le projet !'You must supply a name for the project!NewProjectDialogAdded %n Sheet(s)NewSheetDialogImpossible de crer une feuille s'il n'y a pas de projet charg !!:I can't create a new Sheet if there is no Project loaded!!NewSheetDialog4Nom de la nouvelle feuilleNew Sheet nameNewSheetDialog,Nouvelle(s) feuille(s) New Sheet(s)NewSheetDialog$Compte de feuilles Sheet countNewSheetDialog"Compte des pistes Track countNewSheetDialog&Utiliser un gabarit Use TemplateNewSheetDialogAdded %n Track(s)NewTrackDialogImpossible de crer une nouvelle piste s'il n'y a pas de projet charg !:I can't create a new Track if there is no Project loaded!!NewTrackDialog(Nouvelle(s) piste(s) New Track(s)NewTrackDialog"Compte des pistes Track countNewTrackDialogNom de la piste Track nameNewTrackDialog.<p>Le nom du rpertoire du projet <b>%1</b> est diffrent de celui du titre du projet <b>%2</b>!</p><p>Avez-vous renomm le rpertoire du projet ? </p><p>Renommez ce rpertoire comme le titre du projet <b>%1</b>, et changez le titre du projet dans le Gestionnaire de projet !</p>

Project directory name %1 is different from the Project title %2!

Did you rename the Project directory ?

Please rename the directory back to the Project title %1, and change the Project title with the Project Manager Dialog!

OpenProjectDialogEtes vous sr de vouloir supprimer le projet %1 ? Il sera impossible d'annuler !TAre you sure that you want to remove the project %1 ? It's not possible to undo it !OpenProjectDialogChoisir un projet existant ou crer un nouveau dossier de projet4Choose an existing or create a new Project DirectoryOpenProjectDialogTNouveau rpertoire de projet cr ici : %1/Created new Project directory for you here: %1 OpenProjectDialogCr le : Created on:OpenProjectDialogSupprimerDeleteOpenProjectDialogDescription : Description:OpenProjectDialogChargerLoadOpenProjectDialog6Pas de projet slectionn !No Project selected!OpenProjectDialog Ouvrir un projet Open ProjectOpenProjectDialogVrifiez que vous avez les droits ncessaires pour ce rpertoire ou changez-en : %1FPlease check permission for this directory or choose another one: %1OpenProjectDialogTVrifiez vos droits sur ce rpertoire : %1.Please check permission for this directory: %1OpenProjectDialogLe projet %1 n'existe pas. Avez-vous renomm ou supprim le dossier ?RProject %1 does not exist, did you rename or remove the directory what that name ?OpenProjectDialog:Le projet n'existe pas ! (%1)Project does not exist! (%1)OpenProjectDialogRSlectionner un rpertoire pour le projetSelect Project DirOpenProjectDialogrSlectionnez un projet et cliquez sur "charger" nouveau2Select a project and click the 'Load' button againOpenProjectDialog$Projet slectionnSelected ProjectOpenProjectDialogzVous n'avez pas les droits pour crire dans ce rpertoire ! (This directory is not writable by you! OpenProjectDialog,Traverso - InformationTraverso - InformationOpenProjectDialog&Traverso - QuestionTraverso - QuestionOpenProjectDialog(Traverso - AttentionTraverso - WarningOpenProjectDialog\Impossible de crer un rpertoire de projet ! %Unable to create Project directory! OpenProjectDialogTVous devez choisir un nom pour le projet !'You must supply a name for the project!OpenProjectDialog@Pilote PA:: erreur PortAudio: %1PADriver:: PortAudio error: %1PADriverrPilote PA:: hostapi %1 n'a pas t trouv par PortAudio !1PADriver:: hostapi %1 was not found by Portaudio!PADriver <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Pilote PortAudio :</span></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Le pilote qui utilise PortAudio</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">PortAudio supporte beaucoup de types de pilotes dont certains disposent aussi d'un support natif dans Traverso. </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Il est recommand d'utiliser les pilotes natifs de Traverso plutot que ceux de PortAudio, toutefois si les pilotes natifs posent problme, vous pouvez essayer la place ceux founis par PortAudio !</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">PortAudio offre un support de pilotes transparent pour de multiple plateformes, notamment Windows (voir les options wmme, direct x et asio), et Mac OS X (voir les options CoreAudio et jack)</p></body></html>

PortAudio Driver:

The driver which should drive the PortAudio backend

PortAudio supports many driver backends, some of which Traverso has native support for too.

It is recommended to use Traverso's native drivers instead of using PortAudio's, however, if the native drivers give problems, you might try the ones supplied by PortAudio instead!

PortAudio provides transparent driver support for multiple platforms, including Windows (see the wmme, direct x and asio options), and Mac OS X (see the CoreAudio and jack options)

 PaDriverPage PiloteDriver PaDriverPageFormulaireForm PaDriverPage"Pilotes PortAudioPortaudio drivers PaDriverPage<html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Acclre l'affichage des rgions et des pistes en utilisant</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">le moteur 3D de votre carte graphique.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">En fonction de votre carte graphique et de son pilote, cela </p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">peut considrablement acclrer l'affichage !</p></body></html>8

Accelerates the painting of AudioClips and Tracks by using

the 3D engine of your graphics card.

Depending on your graphics card and driver support, this

can speed up painting considerably!

PerformanceConfigPageChanger la taille du tampon ne prendra effet qu'aprs avoir (re)charg un projet.QChanging the buffer size only will take into effect after (re)loading a project.PerformanceConfigPageFormulaireFormPerformanceConfigPagePeindrePaintingPerformanceConfigPageLTaille du tampon de lecture (secondes)Read buffer size (seconds)PerformanceConfigPageDUtiliser l'acclration matrielleUse hardware accelerationPerformanceConfigPage&Icne d'information info iconPerformanceConfigPage0Ajouter aussi un greffonAdd Plugin tooPluginSelectorDialogAnnulerCancelPluginSelectorDialog In/OutIn/OutPluginSelectorDialogOKOKPluginSelectorDialogNom du greffon Plugin NamePluginSelectorDialog*Slecteur de greffonsPlugin SelectorPluginSelectorDialogTypeTypePluginSelectorDialogHImpossible de crer le rpertoire %1Cannot create dir %1ProjectImpossible d'ouvrir les proprits du projet pour l'criture ! (Fichier %1. Raison : %2)HCouldn't open Project properties file for writing! (File %1. Reason: %2)Project0Nouveau projet cr : %1Created new Project %1ProjectzExportation en cours, impossible d'en lancer deux la fois !2Export already in progress, cannot start it twice!Project Projet %1 chargProject %1 loadedProject*Projet %1 sauvegard Project %1 saved Project~Projet %1 : impossible d'ouvrir le fichier .tpf ! (Raison : %2)6Project %1: Cannot open project.tpf file! (Reason: %2)ProjectProjet %1 : Impossible de parser le fichier .tpf ! (Raison : %2):Project %1: Failed to parse project.tpf file! (Reason: %2)ProjectLa version de fichier du projet ne correspond pas, impossible de charger le projet !Il faut convertir %1 fichiers</b>Need to convert %1 filesProjectConverter>Conversion ralise avec succsConversion finished succesfullyProjectConverterzConversion arrte par l'utilisateur. Vous pouvez continuer de travailler sur ce projet avec une version de Traverso <= 0.41.0 ou le rouvrir avec cette version et recommencer la conversionConversion stopped on user request, you can continue to use this Project with Traverso <= 0.41.0, or reopen it with this version of Traverso and start the conversion againProjectConverterImpossible d'ouvrir les proprits du projet pour l'criture ! (Fichier %1. Raison : %2)HCouldn't open Project properties file for writing! (File %1. Reason: %2)ProjectConverterZPas de description de conversion disponible !$No conversion description available!ProjectConverter$Projet %1 convertiProject %1 convertedProjectConverterProjet %1 : Impossible de parser le fichier .tpf ! (Raison : %2):Project %1: Failed to parse project.tpf file! (Reason: %2)ProjectConverterfConversion du projet de la version 2 la version 37Starting to convert Project from version 2 to version 3ProjectConverter FermerCloseProjectConverterDialog:Information sur la conversionConversion informationProjectConverterDialog8Progression de la conversionConversion progressProjectConverterDialog"Charger un projet Load ProjectProjectConverterDialog.Convertisseur de projetProject ConverterProjectConverterDialog#Project XXX (no translation needed)ProjectConverterDialog,Dmarrer la conversionStart conversionProjectConverterDialog*Arrter la conversionStop conversionProjectConverterDialog--ProjectInfoWidget6Profondeur d'chantillonageBitdepthProjectInfoWidget ProjetProjectProjectInfoWidget<Widget d'information du projetProject Information WidgetProjectInfoWidgetTauxRateProjectInfoWidgetChansonsSongsProjectInfoWidgetHImpossible de crer le rpertoire %1Cannot create dir %1ProjectManager\Choisissez un rpertoire o placer vos projets,Choose a directory to store your Projects inProjectManagerhImpossible de renommer le rpertoire du projet en %1(Could not rename Project directory to %1ProjectManagerTNouveau rpertoire de projet cr ici : %1/Created new Project directory for you here: %1 ProjectManagerHProjet par dfaut cr avec Traverso#Default Project created by TraversoProjectManagerhVoulez-vous enregistrer le projet avant de quitter ?/Do you want to save the Project before quiting?ProjectManagerPas de projet sauvegarder. Ouvrez ou crez un projet d'abord !3No Project to save, open or create a Project first!ProjectManagerZAucun rpertoire slectionn, pour ressayer oNo directory was selected, to retry open the 'Open Project Dialog' and click 'Select Project Directory' button ProjectManagerVrifiez vos permissions pour ce rpertoire ou changez-en : %1FPlease check permission for this directory or choose another one: %1ProjectManagerTVrifiez vos droits sur le rpertoire : %1.Please check permission for this directory: %1ProjectManager4Le projet %1 existe dj !Project %1 already exists!ProjectManagerLe projet %1 ne peut plus tre trouv ! (Avez-vous renomm ou dplac le rpertoire du projet ?)WProject %1 no longer could be found! (Did you remove or rename the Project directory ?)ProjectManager*Enregistrer le projet Save ProjectProjectManagerhIl vous est impossible d'crire dans ce rpertoire !(This directory is not writable by you! ProjectManager(Traverso - AttentionTraverso - WarningProjectManager\Impossible de crer un rpertoire de projet ! %Unable to create Project directory! ProjectManagerPImpossible de crer un nouveau projet %1Unable to create new Project %1ProjectManagerDImpossible de charger le projet %1Unable to load Project %1ProjectManager<html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Refaire le dernier changement</p></body></html>

Redo last change

ProjectManagerDialog<html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Annuler le dernier changement</p></body></html>

Undo last change

ProjectManagerDialog$Contemporain adultAdult ContemporaryProjectManagerDialogRock alternatifAlternative RockProjectManagerDialogArrangeurArrangerProjectManagerDialogTexte du CDCD TextProjectManagerDialogEnfants ChildrensProjectManagerDialogClassique ClassicalProjectManagerDialog*Contemporain chrtienContemporary ChristianProjectManagerDialog^Impossible d'ouvrir le fichier %1 en criture !"Couldn't open file %1 for writing!ProjectManagerDialogCountryCountryProjectManagerDialog4Crer une nouvelle feuilleCreate new SheetProjectManagerDialog DanceDanceProjectManagerDialogSupprimerDeleteProjectManagerDialogDescription DescriptionProjectManagerDialogDialogueDialogProjectManagerDialogID du disque :Disc ID:ProjectManagerDialogEasy ListeningEasy ListeningProjectManagerDialogIngnieurEngineerProjectManagerDialog0Entrer le nom du gabaritEnter Template nameProjectManagerDialogErotiqueEroticProjectManagerDialogExporterExportProjectManagerDialogFolkFolkProjectManagerDialogGenre :Genre:ProjectManagerDialog GospelGospelProjectManagerDialogHip HopHip HopProjectManagerDialogJazzJazzProjectManagerDialog LatinoLatinProjectManagerDialogLongueurLengthProjectManagerDialogMessageMessageProjectManagerDialogMusicalMusicalProjectManagerDialogNew AgeNew AgeProjectManagerDialog Nouvelle feuille New SheetProjectManagerDialogvAucun nom n'a t fourni pour le nouvel espace de travail !No new Sheet name was supplied!ProjectManagerDialog OperaOperaProjectManagerDialogOperetteOperetteProjectManagerDialogInterprte PerformerProjectManagerDialogMusique pop Pop MusicProjectManagerDialog ProjetProjectProjectManagerDialogLe projet avec le titre '%1' existe dj. Veuillez fournir un nouveau titre !IProject with title '%1' allready exists, please supply a different title!ProjectManagerDialogRapRapProjectManagerDialog ReggaeReggaeProjectManagerDialogRenommerRenameProjectManagerDialog Rhythm and BluesRhythm and BluesProjectManagerDialogRock Rock MusicProjectManagerDialog,Sauvegarder le gabarit Save TemplateProjectManagerDialog(Feuille slectionneSelected SheetProjectManagerDialog"Nom de la feuille Sheet NameProjectManagerDialog(Espace(s) de travailSheet(s)ProjectManagerDialogFeuillesSheetsProjectManagerDialogParolier SongwriterProjectManagerDialogEffets sonores Sound EffectsProjectManagerDialogTexte parl Spoken WordProjectManagerDialogGabaritTemplateProjectManagerDialoghLe gabarit %1 existe dj ! Voulez-vous l'craser ?CTemplate with name %1 already exists! Do you want to overwrite it?ProjectManagerDialog TitreTitleProjectManagerDialog PistesTracksProjectManagerDialog,Traverso - InformationTraverso - InformationProjectManagerDialogUPC EAN :UPC EAN:ProjectManagerDialogLImpossible de crer le rpertoire %1 !Unable to create directory %1!ProjectManagerDialogNon dfini UndefinedProjectManagerDialogInutilisUnusedProjectManagerDialogMusique world World MusicProjectManagerDialog:Une erreur grave est apparue.A fatal error occurred.QObjectjUne erreur est apparue lors de la lecture du fichier.-An error occurred when reading from the file.QObjectjUne erreur est apparue lors de l'criture du fichier.+An error occurred when writing to the file.QObject@Une erreur inconnue est apparue.An unspecified error occurred.QObjectRgion audio AudioClipQObject CourbeCurveQObject RepreMarkerQObject<Acune erreur ne s'est produiteNo error occurredQObject"Espace de travailSheetQObject@Impossible d'accder au fichier.The file could not be accessed.QObject@Impossible de copier le fichier.The file could not be copied.QObjectDLe fichier n'a pas pu tre ouvert.The file could not be opened.QObjectHLe fichier n'a pas pu tre supprim.The file could not be removed.QObjectFLe fichier n'a pas pu tre renomm.The file could not be renamed.QObjectPImpossible de redimensionner le fichier.The file could not be resized.QObject$Opration annule.The operation was aborted.QObjectdImpossible de changer la position dans le fichier..The position in the file could not be changed.QObject PisteTrackQObjectErreur inconnue Unknown errorQObject@B<html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"><span style=" font-size:18pt; font-weight:600;">Traverso : Premiers pas</span></p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">Lorsque vous enregistrez ou importez un fichier audio dans Traverso, il apparait en temps que rgion audio dans l'une des pistes horizontales de l'espace de travail actuel. Vous pouvez diter de nombreux paramtres de ces rgions en plaant le curseur de la souris sur la rgion et en appuyant ou en maintenant appuyes diffrentes touches de votre clavier ou de votre souris. You can also change settings of a Track, the Sheet as a whole, and other objects in the Sheet.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">To see a list of what commands are available for any given object in the Sheet, move the mouse over that object, and Right-Click (or press Q). The keyboard shortcuts for each command are shown in the menu. The notation used is shown below.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; K &gt; </span> means press and release the K key. (Like a click.)</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"><span style=" font-weight:600;">&lt;&lt; K &gt;&gt;</span> means press the K key two times fast. (Like a double click.)</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ K ]</span> means drag the mouse while holding down the K key.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; KL &gt; </span> means press the K and L keys at the same time.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ KL ] </span> means drag the mouse while holding down the K and L keys at the same time.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">Here are some basic commands:</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; SPACE &gt;</span> is Play/Stop.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; SHIFT &gt;</span> sets the Playhead. (Blue vertical line where playing starts.)</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; W &gt;</span> sets the Work Cursor. (Red vertical line.)</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; V &gt; </span> moves the Playhead back to the Work Cursor.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ D ] </span> move objects around (Audio Clip, Curve Nodes, etc)</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ Z ]</span> zooms in and out.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ TAB ]</span> scroll omnidirectional (aka Shuttle) </p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">And some Audio Clip Commands:</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ E ] </span> drags a Clip's left or right edge.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ F ]</span> adjusts the length of a Clip's Fade In / Fade Out.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">[ G ] </span>addust the Gain of a clip (also works on Tracks, Sheet)</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"> <span style=" font-weight:600;">&lt; X &gt;</span> splits the Clip at the cursor's position.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;">For more information, right-click on everything, or check out the Traverso manual.</p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p></body></html>

Traverso: Getting Started

When you record or import an audio file into Traverso, it shows up as an Audio Clip in one of the horizontal Tracks in the current Sheet. You can edit many aspects of these Clips by placing the mouse pointer over a Clip and pressing or holding different keys on your keyboard and mouse. You can also change settings of a Track, the Sheet as a whole, and other objects in the Sheet.

To see a list of what commands are available for any given object in the Sheet, move the mouse over that object, and Right-Click (or press Q). The keyboard shortcuts for each command are shown in the menu. The notation used is shown below.

< K > means press and release the K key. (Like a click.)

<< K >> means press the K key two times fast. (Like a double click.)

[ K ] means drag the mouse while holding down the K key.

< KL > means press the K and L keys at the same time.

[ KL ] means drag the mouse while holding down the K and L keys at the same time.

Here are some basic commands:

< SPACE > is Play/Stop.

< SHIFT > sets the Playhead. (Blue vertical line where playing starts.)

< W > sets the Work Cursor. (Red vertical line.)

< V > moves the Playhead back to the Work Cursor.

[ D ] move objects around (Audio Clip, Curve Nodes, etc)

[ Z ] zooms in and out.

[ TAB ] scroll omnidirectional (aka Shuttle)

And some Audio Clip Commands:

[ E ] drags a Clip's left or right edge.

[ F ] adjusts the length of a Clip's Fade In / Fade Out.

[ G ] addust the Gain of a clip (also works on Tracks, Sheet)

< X > splits the Clip at the cursor's position.

For more information, right-click on everything, or check out the Traverso manual.

QuickStartDialog.Traverso : premiers pasTraverso: Getting StartedQuickStartDialog<Impossible d'ouvrir le fichierCould not open file ReadSource8Le fichier n'a pas de canauxFile has zero channels ReadSource2Nombre de canaux invalideInvalid channel count ReadSourceSilenceSilence ReadSource2Le fichier n'existe pas !The file does not exist! ReadSource <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Cette option rduit la taille de certains fichiers de donnes virgule flottante jusqu' 10% en liminant certaines informations qui n'ont virtuellement aucun effet sur les donnes audio. </p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Bien que cela soit techniquement une compression avec perte, cela garde l'avantage des donnes virgule flottante (&gt;600 dB of dynamic range, no clipping, et une resolution de 25 bits). </p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This also affects large integer compression by limiting the resolution to 24 bits.</p></body></html>B

This option reduces the storage of some floating-point data files by up to about 10% by eliminating some information that has virtually no effect on the audio data.

While this does technically make the compression lossy, it retains all the advantages of floating point data (>600 dB of dynamic range, no clipping, and 25 bits of resolution).

This also affects large integer compression by limiting the resolution to 24 bits.

RecordingConfigPageMeilleurBestRecordingConfigPage&Type de compressionCompression typeRecordingConfigPagerQualit par dfaut du rchantillonage pour l'exportationDefault export resample qualityRecordingConfigPagezActivation du rchantillonage la vole (lecture seulement),Enable on the fly resampling (Playback only)RecordingConfigPage"Format d'encodageEncoding formatRecordingConfigPage RapideFastRecordingConfigPageFormulaireFormRecordingConfigPageHautHighRecordingConfigPage MoyenMediumRecordingConfigPageLQualit du rchantillonage la voleOn the fly resample qualityRecordingConfigPageEnregistrement RecordingRecordingConfigPage Rchantillonage ResamplingRecordingConfigPage|Sauter WVX pour une compression supplmentaire (semi-lossless).Skip WVX for extra compression (semi-lossless)RecordingConfigPageOptions WavPackWavPack optionsRecordingConfigPageFinEndResourcesWidgetFichiersFilesResourcesWidgetFormulaireFormResourcesWidgetLongueurLengthResourcesWidgetNomNameResourcesWidgetSourcesSourcesResourcesWidget DbutStartResourcesWidget--RestoreProjectBackupDialogDate et heure :Current date and time:RestoreProjectBackupDialogDateDateRestoreProjectBackupDialog*Dernire sauvegarde : Last backup:RestoreProjectBackupDialog@Restaurer d'aprs une sauvegardeRestore from backup RestoreProjectBackupDialogrRgler la date pour restaurer la sauvegarde slectionne.,Set the date to restore the selected backup.RestoreProjectBackupDialog HeureTimeRestoreProjectBackupDialogApparence AppearanceSettingsDialogOptions audio Audio OptionsSettingsDialogComportementBehaviorSettingsDialogClavierKeyboardSettingsDialogPerformance PerformanceSettingsDialog"Ajouter une piste Add TrackSheetDSurcharge du disque dur dtecte !Hard Disk overload detected!SheetTAucune piste arme pour l'enregistrement !No Tracks armed for recording!Sheet2Aucun nom d'artiste donnNo artists name setSheetjPas d'audio exporter ! (est ce que tout est muet ?)*No audio to export! (Is everything muted?)SheetRecording to %n Clip(s)Sheet$Supprimer la piste Remove TrackSheetSans nomUntitledSheet--SongInfoWidgetGainGainSongInfoWidget SMPTESMPTESongInfoWidgetAdhrerSnapSongInfoWidgetChansonSongSongInfoWidgetFWidget d'information sur le morceauSongInfoWidgetSongInfoWidgetZoomZoomSongInfoWidget Hz HzSpectralMeterConfigWidget&Fermer&CloseSpectralMeterConfigWidget10241024SpectralMeterConfigWidget20482048SpectralMeterConfigWidget256256SpectralMeterConfigWidget40964096SpectralMeterConfigWidget512512SpectralMeterConfigWidget81928192SpectralMeterConfigWidget AvancAdvancedSpectralMeterConfigWidget(Options avances FFTAdvanced FFT OptionsSpectralMeterConfigWidgetAppliquerApplySpectralMeterConfigWidgetBlackmanBlackmanSpectralMeterConfigWidgetTaille du FFT : FFT Size:SpectralMeterConfigWidget8Configuration du spectre FFTFFT-Spectrum ConfigurationSpectralMeterConfigWidget&Plage de frquencesFrequency RangeSpectralMeterConfigWidgetHammingHammingSpectralMeterConfigWidgetHanningHanningSpectralMeterConfigWidget&Limite infrieure : Lower Limit:SpectralMeterConfigWidget2Valeur infrieure en dB :Lower dB value:SpectralMeterConfigWidget$Nombre de bandes :Number of bands:SpectralMeterConfigWidgetRectangle RectangleSpectralMeterConfigWidget0Montrer le spectre moyenShow average spectrumSpectralMeterConfigWidget&Limite suprieure : Upper Limit:SpectralMeterConfigWidget2Valeur suprieure en dB :Upper dB value:SpectralMeterConfigWidget.Fonction de fentrage :Windowing function:SpectralMeterConfigWidget:Exporter la courbe moyenne dBExport average dB curveSpectralMeterViewFFT : activez la courbe moyenne avec < M > pour gnrer des donnes5FFT: Enable avarage curve with < M > to generate dataSpectralMeterViewxFFT : courbe moyenne non-active, pas de donne exporter !/FFT: No avarage curve used, not data to export!SpectralMeterViewPFFT : pas de donne moyenne exporter !FFT: No avarage data to export!SpectralMeterViewxFFT : Impossible d'crire l'image capture sur le disque dur0FFT: Unable to write captured image to hard diskSpectralMeterView$Format de sortie :Output format:SpectralMeterViewBNom du fichier de capture d'cranScreen Capture file nameSpectralMeterView@Slectionner le format de sortieSelect output formatSpectralMeterView"Scinder la rgion Split Clip SplitClip&Information systmeSystem InformationSysInfoToolBar- % - %SystemInfoWidget- GB- GBSystemInfoWidget(Nom de la carte (na)Card Name (na)SystemInfoWidget8Widget d'information systmeSystemInfoWidgetSystemInfoWidget6Profondeur d'chantillonagebitdepthSystemInfoWidget*Taille du tampon (na)buffer size (na)SystemInfoWidget&Type de pilote (na)drivertype (na)SystemInfoWidget imageimageSystemInfoWidgetlatence (na) latency (na)SystemInfoWidgettauxrateSystemInfoWidgetxruns (na) xruns (na)SystemInfoWidget6Statut du tampon de lectureRead Buffer StatusSystemResources6Statut du tampon d'critureWrite Buffer StatusSystemResources"Ajouter un repre Add MarkerTimeLine&Supprimer le repre Remove MarkerTimeLine"Ajouter un repre Add Marker TimeLineView*Supprimer les repres Clear Markers TimeLineView$Dplacer le repre Drag Marker TimeLineViewFinEnd TimeLineViewjVous devez d'abord supprimer tous les autres repres.+You have to remove all other markers first. TimeLineViewAjouter un clipAdd ClipTrack"Supprimer le clip Remove ClipTrack.Rendre les autres muetsSilence OthersTrackPiste : Le clip audio avec l'id %1 n'est pas trouv dans la base de donnes des ressources !BTrack: AudioClip with id %1 not found in Resources database!TrackPanoramique Track PanTrackPan Panoramique : %1 Track Pan: %1TrackPan<Entrer un nouveau nom de pisteEnter new Track name TrackView4Dfinir le nom de la pisteSet Track name TrackViewPiste %1 : %2 Track %1: %2 TrackViewLecture/arrt Play / StopTransportConsoleWidgetEnregistrerRecordTransportConsoleWidgetlEnregistrement vers %1 pistes ; format d'encodage : %2+Recording to %1 Tracks, encoding format: %2TransportConsoleWidgetAller la fin Skip to EndTransportConsoleWidgetAller au dbut Skip to StartTransportConsoleWidget*(De)slectionner tout(De)Select AllTraversoCommands Armer les pistes Arm TracksTraversoCommandsCopier le clip Copy ClipTraversoCommandsBasDownTraversoCommands"Processus externeExternal ProcessingTraversoCommandsGainGainTraversoCommands(Gain : rinitialiser Gain: ResetTraversoCommandsHorizontal HorizontalTraversoCommandsImporter audio Import AudioTraversoCommandsInsrer silenceInsert SilenceTraversoCommands GaucheLeftTraversoCommands Dplacer le clip Move ClipTraversoCommandsHDplacer ou redimensionner la rgionMove Or Resize ClipTraversoCommandsNouvelle piste New TrackTraversoCommands OmnidirectionnelOmnidirectionalTraversoCommandsPanoramaPanoramaTraversoCommands Panorama : resetPanorama: ResetTraversoCommands"Supprimer le clip Remove ClipTraversoCommands$Supprimer la piste Remove TrackTraversoCommands DroiteRightTraversoCommandsScinderSplitTraversoCommandsHautUpTraversoCommandsVerticalVerticalTraversoCommandstraverso-0.49.4/resources/fadeshapes.xml000644 001750 001750 00000001240 11163362147 020617 0ustar00remonremon000000 000000 traverso-0.49.4/CMakeLists.txt.user000664 001750 001750 00000036442 12417542544 017517 0ustar00remonremon000000 000000 ProjectExplorer.Project.ActiveTarget 0 ProjectExplorer.Project.EditorSettings true false true Cpp CppGlobal QmlJS QmlJSGlobal 2 UTF-8 false 4 false true 1 true 0 true 0 8 true 1 true true true false ProjectExplorer.Project.PluginSettings ProjectExplorer.Project.Target.0 Desktop Desktop {25a31d36-7ffa-4216-9733-9720e17f905e} 0 0 1 false /home/remon/Traverso/stable/build-traverso false false true Make CMakeProjectManager.MakeStep 1 Build ProjectExplorer.BuildSteps.Build clean true false true Make CMakeProjectManager.MakeStep 1 Clean ProjectExplorer.BuildSteps.Clean 2 false Default Default CMakeProjectManager.CMakeBuildConfiguration 1 0 Deploy ProjectExplorer.BuildSteps.Deploy 1 Deploy locally ProjectExplorer.DefaultDeployConfiguration 1 false false false false true 0.01 10 true 1 25 1 true false true valgrind 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 traverso true 2 traverso CMakeProjectManager.CMakeRunConfiguration.traverso 3768 true false false false true false false false false true 0.01 10 true 1 25 1 true false true valgrind 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 2 /home/remon/Traverso/stable/build-traverso-0.49.2-Desktop-Default/bin/traverso false %{buildDir} Run /home/remon/Traverso/stable/build-traverso-0.49.2-Desktop-Default/bin/traverso ProjectExplorer.CustomExecutableRunConfiguration 3768 true false false false true 2 ProjectExplorer.Project.TargetCount 1 ProjectExplorer.Project.Updater.EnvironmentId {ff9e36ac-2332-4344-9e6c-e1550ccb461f} ProjectExplorer.Project.Updater.FileVersion 15 traverso-0.49.4/ChangeLog000755 001750 001750 00000034331 12360572520 015542 0ustar00remonremon000000 000000 14-07-2014 Remon Sijrier * released Traverso 0.49.3 * Removed dependency to slv2, redland, raptor libraries * Added dependency to lilv which replaced slv2 (when building with LV2 support) * Debian patched merged: * 01-gcc44_ftbfs, 02-binutils_gold, 05-gcc47-ftbfs * These Debian patches can be dropped: * 03-find_slv2, 04-find_raptor2 10-08-2010 Remon Sijrier * released Traverso 0.49.2 * Cherry picked fixes from git: * Make Traverso work with Qt version >= 4.6.2 * Correctly apply Fade In and Out curves. * compatibility with cmake 2.6.4 * Spanish translation added, thanks to JC! 28-03-2009 Remon Sijrier * Released Traverso 0.49.1 * Changed ALSA device from "hw:0" to "default" (so the system configured one will be used!) * Move Magnetic Cut to [ R ] instead of [ XC ], fix integer overflow as well * Compile fixes when using system installed SLV2 lib * Various small fixes. 13-03-2009 Remon Sijrier * Released Traverso 0.49.0 ** Dependency changes: * Removed dependency and compile time option of QtOpenGL (libqt4-opengl-*) * Depends on Qt >= 4.3.1, slv2 >= 0.6.1 (unless the internal library is used) ** New Features: Nicola: * Added Tranport Console, Toolbars for commonly used tools. * New Project Dialog improved, option to create an Empty project, or import a number of audiofiles in the to be created project. * Import Audio improved, multiple audio files can be imported at once. * Added option to paint 0 and -6dB lines on AudioClips * auto-numbering of markers. Closes bug #19734 * Fixes for bug: #21952, #22302, #19734 * Updated the User Manual Remon: * AudioClip Selection - Add/remove clips to the selection. The Selection currently supports the following options: Move, Remove, Copy. * Add the 'default' alsa device to choose from in the Driver Preferences Page * Changed build system to cmake only * Zooming with [Z] only zooms horizontally now, use [Z] + mouse scroll wheel to also scroll vertically, or change zoom direction with [Z] + < V > * Use proper encoding for special chars like ë. Closes bug #25358 * Shuttle moved back to original key. [Tab] * Implemented bug/wish: #19825 * Implemented [DV] to move an AudioClip only vertically * Add language selection to the preferences dialog * bulgarian translation: 100% done, thanks a lot to Svetlin Staikov! * added czech translation, many thanks to Pavel Fric * French translation, thanks to Samuel Aubert * Debian Bugs: the following bugs are fixed: #505390, #480272, #495980 merged all debian patches for 0.42.0-3 Ben: * Added Fold Sheet/Track feature All: * Fixes and improvements all over the place, as well as new and shiny bugs added :) 10-12-2007 Remon Sijrier * Released Traverso 0.42.0 03-12-2007 Remon Sijrier * Reworked core and GUI code to work with Universal Sample Rate (TimeRef struct) instead of the samplerate dependend nframes_t This allows Traverso to mix files of different samplerate freely, making the samplerate of the audio as independend as the bitdepth of the audio. * Merged MonoReader and ReadSource into ReadSource * Audio data is store interleaved on hard disk now, in an attempt to improve hard disk bandwidth, and cpu usage, specially for compressed audio files. * Compile Traverso with large file support. * Calculate Peak data in a samplerate independend way (using 44.1 KHz as reference) * Added a "Restore Backup" solution, which stores the latest 1000 saves. Restoring a backup from the "Restore from Backup" dialog is very easy and fail save. * Auto save after a recording finished, since this this is likely a very important point in time to create a backup file * Added project converter to convert projects from Traverso < 0.42.0 to Traverso 0.42.0 * Splitted Export/Burn to CD dialog into 2: Export Dialog and Write CD dialog * mmap peak data by using Qt 4.4 new mmap function, or if not compiled with Qt 4.4 use our own code (which equals that of Qt 4.4) * More accurate Peak data calculation, improved and faster Waveform drawing. * Sync sse code to Ardour2's one, added Veclib optimizations (apple ppc only) check if processor has denormal as zero capabilities and use it if it's there. * Added support to compile Traverso with cmake. qmake still works, but the intention is to move to using cmake exclusively * Updated slv2 code to 0.3.0 (svn (7-11-2007)), added option to compile against system installed slv2 * Adding and removing of audio processing objects is faster and even more Real Time save now. * Curve processing (e.g. Gain curve) is much faster now * Shuttle tuning. * Fixed bug in CD TOC export, sometimes resulting in no audio exported! * Added WAV64 as recording format. * Added 2 submenus to the Settings Menu: - Select recording encoding format, after selection the new recording will be recorded with the selected encoding - Select the resample quality, the new quality will be used directly. When changing the quality during playback or recording, a short sillence will occur vs no recording during a small amount of time (the time it takes to seek to the current + 'one buffer time' location) * Default to use 3 periods and a period size of 512 frames when using the ALSA driver. * Tons of bug fixes, old ones, new ones and various improvements all over the place. 03-12-2007 Nicola Doebelin * Created 3 new Themes * Updated the User Manual to 0.42.0 and translated to German * Updated German translation of the GUI * Some small improvements on the CD Burning Dialog and Marker Editor 03-12-2007 Ben Levitt * Created Abstraction for reading writing audio files Added support for native reading/writing to: - FLAC - Ogg Vorbis - WavPack - MP3 * Created an Resampled Audio reader which is a wrapper for the available reader classes, and applies sample rate conversion on the read data. * Created GUI elements to select type and parameters of encoder in the Export Dialog. * Improvements and bugs fixes. 05-07-2007 Remon Sijrier * Released 0.41.0 * Merged patch from Fernando Lopez (iirc) to make jack > 0.105 work * Jack transport control added * AudioClip Edit dialog, with improvements from Nicola * Reworked external processing dialog, with focus on sox support * Slightly more contrast in the default theme. * Fixed audible glitch when playing over spitpoint * usual amount of bug fixes * support for project renaming, detection if project dirs are renamed outside of traverso improved detection if projects dirs are renamed, with tooltip help in open project dialog to be able to restore the project dir name, so the project can be loaded. 09-06-2007 Remon Sijrier * Released 0.40.0 * Various improvements on the Input Engine Added mouse events support Cancel hold commands feature added Generally improved user experience Modifier keys, like in old fashioned 'shortcut' keys Modifer keys to be used _during_ a hold action, a list of options can be viewed _during_ the hold action, using either < Q > or right mouse button. * Command Plugin framework added, which can be used to extend Traverso's functionality, without having access to the core code! * Updated resourcesmanager, added Resources Bin view, with integrated File Viewer, which both support Drag and Drop to the Sheet * Template export for both Sheets and Project as a whole, create new Sheets or Projects from a template... * Driver support for PortAudio was added * New commands (like [ X ] for 'animated' split), and improvements on existing commmands * autoscroll 'move' actions when near the edge of the view. * Reduced memory footprint * AudioClips reflect gain curves. * Port to Microsoft Windows. * Many options added, which can be changed in an easy to use Settings Dialog * CD burning added, using cdrdao to burn the exported Project * Many usability improvements * Ported the SongView and related classes to QGraphicsView (Majore change!) * Major GUI refresh! * Traverso is fully themeable now. * Added HistoryView Widget, depends on QUndo framework * Created Plugin 'framework'. * LV2 plugin support has been added, using the Plugin 'framework' * Created AddRemove Command. This command wil be used by ALL "Audio Processing Objects". The objects are added/removed directly if the associated Song isn't running, else it's using Tsar's thread save add/remove functionality. The command (of course) also provides un/redo support! * Added a MenuBar to please non-guru users ;-) * Peak class 'rewrite' (again). Now peaks for all zoom levels are stored on hard disk, and ONLY loaded when needed, no pre-buffering anymore (which save a HUGE amount of runtime memory). Peak files have a header with version information, and seek offsets to quickly seek to the correct zoomlevel. Normalization levels are stored in the peak file, as to quickly calculate the normalization factor for a certain range (results in instantanious normalization calculation !) * (Re)Added visual cursor feedback on Hold Actions. * Many more things I can't remember..... 09-06-2007 Ben Levitt * Countless usability enhancements * Countless fixes and improvements all over the place * CD burning support for Windows added * 'Cancel' support added to many Commands * New 'Import Silence' added * Improved snapping * TimeLine View shows time in logical steps now * Improvements on centering and following the playhead/work cursor. 09-06-2007 Nicola Doebelin * Correlation and Spectrum Meter added * TOC export for cd burning * (CD) Markers added * User Manual * CD Marker Dialog to edit Marker data * Port to Mac OS X * Fade's are a Curve class now, with a strength and bend value to calculate the shape * VUMeter 'rewrite', conform the IEC 268-18:1995 standard * More things I can't remember..... 19-08-2006 Remon Sijrier * Released 0.30.1 * Fixed 2 possible crash bugs. * Added "merged waveform drawing for stereo tracks" * Snapping improved considerably! * Traverso builds on Mac OS X now! * Fix clip normalization, scans only the Clips source range * Move the AudioClip during move visually again to the targetTrack! * Solo/Mute improvements * Sync audioclip readsource buffers to first point of use in case the sync position of a seek isn't in the range of the audioclip! Fixes bug #16919 05-07-2006 Remon Sijrier * Released 0.30.0 * Added a "select project dir" in Project manager view. * Correctly set AudioClip track start/end frame at startup. * Fixed project render progress indication for long Songs (> 16 minutes) * Don't load/set a newly created Project, so the SongView of the current loaded project will still be accessible! * Fixed issues with solo-stereo AudioClips in one Track. * Make pan work for solo AudioClips as well. * Made fadeout adjustment follow the mouse which is more natural. * Added "Draw Rectified Wave" radiobutton in Settings View. * A number of crashing fixes. * Some more (important) stuff I don't remember ;-) 16-06-2006 Remon Sijrier * Released 0.30.0-rc1 * Fixed a memory corruption bug which caused the computer to halt when the Jack driver was running on Project export. * Fixed bug where audioclip edges were set at the wrong position on AudioClip split. * Fixed AudioClip drag, sometimes the AudioClip got duplicated in one of the Tracks. * Fixed solo-mute bug, sometimes the AudioClip got silenced after Track solo-mute state change, where it should not. * Correctly calculate the Song render start and end frame. * Added (de)normalization for AudioClips 23-05-2006 Remon Sijrier * Released 0.29.0 All changes below are from the fork until the release of 0.29.0 * Fully seperated the GUI from the core code. Core code is a library, named libtraversocore * Ported to Qt4, no Qt3 Support is needed. * The application links statically to libtraversocore, and has all resource files compiled in, so no install is needed (makes testing builds much more comfortable) * Reimplemented the audio rendering, and driver backends. This means: - Support for Jack, and much better support for ALSA. - Normalized bitdepth (32 bit float), making bitdepth transparent throughout the application. - Using libsndfile for audio reading/writing, resulting in much more stable audio file read/writes and more audio formats are supported transparently, including FLAC - Audio file read/writes are decoupled from the audio thread with lockless ringbuffers greatly improving (soft) realtime behaviour. * Fade In/Out improved. Fade's are Curves now, with a number of presets. * Removed hard coded "Keyboard Shortcuts" code, replaced with scripting functionallity provided by Qt. Key shortcuts are stored in an xml file now, and can be reloaded at runtime! * Project rendering improved due use of libsndfile. Export to a number of audio formats, including samplerate conversion is possible. * Runtime switching to Jack/ALSA/Null driver supported, including setting a new samplerate and/or latency. It's inavitable that changing the driver or driver parameters will cause a short sound drop in case the application is playing/recording. * History implemented (a.k.a. Un/Redo). * Contextual Menu's. * Drag and Drop Audiofiles into any Track, or manually Import audiofiles. * Audio Waveform drawing improved, 2 modes are possible, "Classic View" and "Rectified View". * Improved "Help" Dialog, with a short introduction on how to use the application. * Indication of total CPU _time_ spend in both the audio thread and hard disk I/O thread. * Massive code cleaning, and adoption of one coding style. * Better Object Oriented Design, better information encapsulation using Qt signal/slot feature. * More "minor" things I don't remember ;-) 2005-09-13 Remon Sijrier The author of the Protux/libmustux project decided to cancel my participation in the mustux project. I decided to fork the project, any help is of course welcome :-) traverso-0.49.4/cmake/000755 001750 001750 00000000000 11163362200 015031 5ustar00remonremon000000 000000 traverso-0.49.4/cmake/modules/000755 001750 001750 00000000000 11163362200 016501 5ustar00remonremon000000 000000 traverso-0.49.4/cmake/modules/FindPkgConfig.cmake000644 001750 001750 00000037471 11163362147 022201 0ustar00remonremon000000 000000 # - a pkg-config module for CMake # # Usage: # pkg_check_modules( [REQUIRED] []*) # checks for all the given modules # # pkg_search_module( [REQUIRED] []*) # checks for given modules and uses the first working one # # When the 'REQUIRED' argument was set, macros will fail with an error # when module(s) could not be found # # It sets the following variables: # PKG_CONFIG_FOUND ... true iff pkg-config works on the system # PKG_CONFIG_EXECUTABLE ... pathname of the pkg-config program # _FOUND ... set to 1 iff module(s) exist # # For the following variables two sets of values exist; first one is the # common one and has the given PREFIX. The second set contains flags # which are given out when pkgconfig was called with the '--static' # option. # _LIBRARIES ... only the libraries (w/o the '-l') # _LIBRARY_DIRS ... the paths of the libraries (w/o the '-L') # _LDFLAGS ... all required linker flags # _LDFLAGS_OTHERS ... all other linker flags # _INCLUDE_DIRS ... the '-I' preprocessor flags (w/o the '-I') # _CFLAGS ... all required cflags # _CFLAGS_OTHERS ... the other compiler flags # # = for common case # = _STATIC for static linking # # There are some special variables whose prefix depends on the count # of given modules. When there is only one module, stays # unchanged. When there are multiple modules, the prefix will be # changed to _: # _VERSION ... version of the module # _PREFIX ... prefix-directory of the module # _INCLUDEDIR ... include-dir of the module # _LIBDIR ... lib-dir of the module # # = when |MODULES| == 1, else # = _ # # A parameter can have the following formats: # {MODNAME} ... matches any version # {MODNAME}>={VERSION} ... at least version is required # {MODNAME}={VERSION} ... exactly version is required # {MODNAME}<={VERSION} ... modules must not be newer than # # Examples # pkg_check_modules (GLIB2 glib-2.0) # # pkg_check_modules (GLIB2 glib-2.0>=2.10) # requires at least version 2.10 of glib2 and defines e.g. # GLIB2_VERSION=2.10.3 # # pkg_check_modules (FOO glib-2.0>=2.10 gtk+-2.0) # requires both glib2 and gtk2, and defines e.g. # FOO_glib-2.0_VERSION=2.10.3 # FOO_gtk+-2.0_VERSION=2.8.20 # # pkg_check_modules (XRENDER REQUIRED xrender) # defines e.g.: # XRENDER_LIBRARIES=Xrender;X11 # XRENDER_STATIC_LIBRARIES=Xrender;X11;pthread;Xau;Xdmcp # # pkg_search_module (BAR libxml-2.0 libxml2 libxml>=2) # Copyright (C) 2006 Enrico Scholz # # Redistribution and use, with or without modification, are permitted # provided that the following conditions are met: # # 1. Redistributions must retain the above copyright notice, this # list of conditions and the following disclaimer. # 2. The name of the author may not be used to endorse or promote # products derived from this software without specific prior # written permission. # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ### Common stuff #### set(PKG_CONFIG_VERSION 1) set(PKG_CONFIG_FOUND 0) find_program(PKG_CONFIG_EXECUTABLE NAMES pkg-config DOC "pkg-config executable") mark_as_advanced(PKG_CONFIG_EXECUTABLE) if(PKG_CONFIG_EXECUTABLE) set(PKG_CONFIG_FOUND 1) endif(PKG_CONFIG_EXECUTABLE) # Unsets the given variables macro(_pkgconfig_unset var) set(${var} "" CACHE INTERNAL "") endmacro(_pkgconfig_unset) macro(_pkgconfig_set var value) set(${var} ${value} CACHE INTERNAL "") endmacro(_pkgconfig_set) # Invokes pkgconfig, cleans up the result and sets variables macro(_pkgconfig_invoke _pkglist _prefix _varname _regexp) set(_pkgconfig_invoke_result) execute_process( COMMAND ${PKG_CONFIG_EXECUTABLE} ${ARGN} ${_pkglist} OUTPUT_VARIABLE _pkgconfig_invoke_result RESULT_VARIABLE _pkgconfig_failed) if (_pkgconfig_failed) set(_pkgconfig_${_varname} "") _pkgconfig_unset(${_prefix}_${_varname}) else(_pkgconfig_failed) string(REGEX REPLACE "[\r\n]" " " _pkgconfig_invoke_result "${_pkgconfig_invoke_result}") string(REGEX REPLACE " +$" "" _pkgconfig_invoke_result "${_pkgconfig_invoke_result}") if (NOT ${_regexp} STREQUAL "") string(REGEX REPLACE "${_regexp}" " " _pkgconfig_invoke_result "${_pkgconfig_invoke_result}") endif(NOT ${_regexp} STREQUAL "") separate_arguments(_pkgconfig_invoke_result) #message(STATUS " ${_varname} ... ${_pkgconfig_invoke_result}") set(_pkgconfig_${_varname} ${_pkgconfig_invoke_result}) _pkgconfig_set(${_prefix}_${_varname} "${_pkgconfig_invoke_result}") endif(_pkgconfig_failed) endmacro(_pkgconfig_invoke) # Invokes pkgconfig two times; once without '--static' and once with # '--static' macro(_pkgconfig_invoke_dyn _pkglist _prefix _varname cleanup_regexp) _pkgconfig_invoke("${_pkglist}" ${_prefix} ${_varname} "${cleanup_regexp}" ${ARGN}) _pkgconfig_invoke("${_pkglist}" ${_prefix} STATIC_${_varname} "${cleanup_regexp}" --static ${ARGN}) endmacro(_pkgconfig_invoke_dyn) # Splits given arguments into options and a package list macro(_pkgconfig_parse_options _result _is_req) set(${_is_req} 0) foreach(_pkg ${ARGN}) if (_pkg STREQUAL "REQUIRED") set(${_is_req} 1) endif (_pkg STREQUAL "REQUIRED") endforeach(_pkg ${ARGN}) set(${_result} ${ARGN}) list(REMOVE_ITEM ${_result} "REQUIRED") endmacro(_pkgconfig_parse_options) ### macro(_pkg_check_modules_internal _is_required _is_silent _prefix) _pkgconfig_unset(${_prefix}_FOUND) _pkgconfig_unset(${_prefix}_VERSION) _pkgconfig_unset(${_prefix}_PREFIX) _pkgconfig_unset(${_prefix}_INCLUDEDIR) _pkgconfig_unset(${_prefix}_LIBDIR) _pkgconfig_unset(${_prefix}_LIBS) _pkgconfig_unset(${_prefix}_LIBS_L) _pkgconfig_unset(${_prefix}_LIBS_PATHS) _pkgconfig_unset(${_prefix}_LIBS_OTHER) _pkgconfig_unset(${_prefix}_CFLAGS) _pkgconfig_unset(${_prefix}_CFLAGS_I) _pkgconfig_unset(${_prefix}_CFLAGS_OTHER) _pkgconfig_unset(${_prefix}_STATIC_LIBDIR) _pkgconfig_unset(${_prefix}_STATIC_LIBS) _pkgconfig_unset(${_prefix}_STATIC_LIBS_L) _pkgconfig_unset(${_prefix}_STATIC_LIBS_PATHS) _pkgconfig_unset(${_prefix}_STATIC_LIBS_OTHER) _pkgconfig_unset(${_prefix}_STATIC_CFLAGS) _pkgconfig_unset(${_prefix}_STATIC_CFLAGS_I) _pkgconfig_unset(${_prefix}_STATIC_CFLAGS_OTHER) # create a better addressable variable of the modules and calculate its size set(_pkg_check_modules_list ${ARGN}) list(LENGTH _pkg_check_modules_list _pkg_check_modules_cnt) if(PKG_CONFIG_EXECUTABLE) # give out status message telling checked module if (NOT ${_is_silent}) if (_pkg_check_modules_cnt EQUAL 1) message(STATUS "checking for module '${_pkg_check_modules_list}'") else(_pkg_check_modules_cnt EQUAL 1) message(STATUS "checking for modules '${_pkg_check_modules_list}'") endif(_pkg_check_modules_cnt EQUAL 1) endif(NOT ${_is_silent}) set(_pkg_check_modules_packages) set(_pkg_check_modules_failed) # iterate through module list and check whether they exist and match the required version foreach (_pkg_check_modules_pkg ${_pkg_check_modules_list}) set(_pkg_check_modules_exist_query) # check whether version is given if (_pkg_check_modules_pkg MATCHES ".*(>=|=|<=).*") string(REGEX REPLACE "(.*[^><])(>=|=|<=)(.*)" "\\1" _pkg_check_modules_pkg_name "${_pkg_check_modules_pkg}") string(REGEX REPLACE "(.*[^><])(>=|=|<=)(.*)" "\\2" _pkg_check_modules_pkg_op "${_pkg_check_modules_pkg}") string(REGEX REPLACE "(.*[^><])(>=|=|<=)(.*)" "\\3" _pkg_check_modules_pkg_ver "${_pkg_check_modules_pkg}") else(_pkg_check_modules_pkg MATCHES ".*(>=|=|<=).*") set(_pkg_check_modules_pkg_name "${_pkg_check_modules_pkg}") set(_pkg_check_modules_pkg_op) set(_pkg_check_modules_pkg_ver) endif(_pkg_check_modules_pkg MATCHES ".*(>=|=|<=).*") # handle the operands if (_pkg_check_modules_pkg_op STREQUAL ">=") list(APPEND _pkg_check_modules_exist_query --atleast-version) endif(_pkg_check_modules_pkg_op STREQUAL ">=") if (_pkg_check_modules_pkg_op STREQUAL "=") list(APPEND _pkg_check_modules_exist_query --exact-version) endif(_pkg_check_modules_pkg_op STREQUAL "=") if (_pkg_check_modules_pkg_op STREQUAL "<=") list(APPEND _pkg_check_modules_exist_query --max-version) endif(_pkg_check_modules_pkg_op STREQUAL "<=") # create the final query which is of the format: # * --atleast-version # * --exact-version # * --max-version # * --exists if (_pkg_check_modules_pkg_op) list(APPEND _pkg_check_modules_exist_query "${_pkg_check_modules_pkg_ver}") else(_pkg_check_modules_pkg_op) list(APPEND _pkg_check_modules_exist_query --exists) endif(_pkg_check_modules_pkg_op) _pkgconfig_unset(${_prefix}_${_pkg_check_modules_pkg_name}_VERSION) _pkgconfig_unset(${_prefix}_${_pkg_check_modules_pkg_name}_PREFIX) _pkgconfig_unset(${_prefix}_${_pkg_check_modules_pkg_name}_INCLUDEDIR) _pkgconfig_unset(${_prefix}_${_pkg_check_modules_pkg_name}_LIBDIR) list(APPEND _pkg_check_modules_exist_query "${_pkg_check_modules_pkg_name}") list(APPEND _pkg_check_modules_packages "${_pkg_check_modules_pkg_name}") # execute the query execute_process( COMMAND ${PKG_CONFIG_EXECUTABLE} ${_pkg_check_modules_exist_query} RESULT_VARIABLE _pkgconfig_retval) # evaluate result and tell failures if (_pkgconfig_retval) if(NOT ${_is_silent}) message(STATUS " package '${_pkg_check_modules_pkg}' not found") endif(NOT ${_is_silent}) set(_pkg_check_modules_failed 1) endif(_pkgconfig_retval) endforeach(_pkg_check_modules_pkg) if(_pkg_check_modules_failed) # fail when requested if (${_is_required}) message(SEND_ERROR "A required package was not found") endif (${_is_required}) else(_pkg_check_modules_failed) # when we are here, we checked whether requested modules # exist. Now, go through them and set variables _pkgconfig_set(${_prefix}_FOUND 1) list(LENGTH _pkg_check_modules_packages pkg_count) # iterate through all modules again and set individual variables foreach (_pkg_check_modules_pkg ${_pkg_check_modules_packages}) # handle case when there is only one package required if (pkg_count EQUAL 1) set(_pkg_check_prefix "${_prefix}") else(pkg_count EQUAL 1) set(_pkg_check_prefix "${_prefix}_${_pkg_check_modules_pkg}") endif(pkg_count EQUAL 1) _pkgconfig_invoke(${_pkg_check_modules_pkg} "${_pkg_check_prefix}" VERSION "" --modversion ) _pkgconfig_invoke(${_pkg_check_modules_pkg} "${_pkg_check_prefix}" PREFIX "" --variable=prefix ) _pkgconfig_invoke(${_pkg_check_modules_pkg} "${_pkg_check_prefix}" INCLUDEDIR "" --variable=includedir ) _pkgconfig_invoke(${_pkg_check_modules_pkg} "${_pkg_check_prefix}" LIBDIR "" --variable=libdir ) message(STATUS " found ${_pkg_check_modules_pkg}, version ${_pkgconfig_VERSION}") endforeach(_pkg_check_modules_pkg) # set variables which are combined for multiple modules _pkgconfig_invoke_dyn("${_pkg_check_modules_packages}" "${_prefix}" LIBRARIES "(^| )-l" --libs-only-l ) _pkgconfig_invoke_dyn("${_pkg_check_modules_packages}" "${_prefix}" LIBRARY_DIRS "(^| )-L" --libs-only-L ) _pkgconfig_invoke_dyn("${_pkg_check_modules_packages}" "${_prefix}" LDFLAGS "" --libs ) _pkgconfig_invoke_dyn("${_pkg_check_modules_packages}" "${_prefix}" LDFLAGS_OTHER "" --libs-only-other ) _pkgconfig_invoke_dyn("${_pkg_check_modules_packages}" "${_prefix}" INCLUDE_DIRS "(^| )-I" --cflags-only-I ) _pkgconfig_invoke_dyn("${_pkg_check_modules_packages}" "${_prefix}" CFLAGS "" --cflags ) _pkgconfig_invoke_dyn("${_pkg_check_modules_packages}" "${_prefix}" CFLAGS_OTHER "" --cflags-only-other ) endif(_pkg_check_modules_failed) else(PKG_CONFIG_EXECUTABLE) if (${_is_required}) message(SEND_ERROR "pkg-config tool not found") endif (${_is_required}) endif(PKG_CONFIG_EXECUTABLE) endmacro(_pkg_check_modules_internal) ### ### User visible macros start here ### ### macro(pkg_check_modules _prefix _module0) # check cached value if (NOT DEFINED __pkg_config_checked_${_prefix} OR __pkg_config_checked_${_prefix} LESS ${PKG_CONFIG_VERSION}) _pkgconfig_parse_options (_pkg_modules _pkg_is_required "${_module0}" ${ARGN}) _pkg_check_modules_internal("${_pkg_is_required}" 0 "${_prefix}" ${_pkg_modules}) if(${_prefix}_FOUND) _pkgconfig_set(__pkg_config_checked_${_prefix} ${PKG_CONFIG_VERSION}) endif(${_prefix}_FOUND) endif(NOT DEFINED __pkg_config_checked_${_prefix} OR __pkg_config_checked_${_prefix} LESS ${PKG_CONFIG_VERSION}) endmacro(pkg_check_modules) ### macro(pkg_search_module _prefix _module0) # check cached value if (NOT DEFINED __pkg_config_checked_${_prefix} OR __pkg_config_checked_${_prefix} LESS ${PKG_CONFIG_VERSION}) set(_pkg_modules_found 0) _pkgconfig_parse_options(_pkg_modules_alt _pkg_is_required "${_module0}" ${ARGN}) message(STATUS "checking for one of the modules '${_pkg_modules_alt}'") # iterate through all modules and stop at the first working one. foreach(_pkg_alt ${_pkg_modules_alt}) if(NOT _pkg_modules_found) _pkg_check_modules_internal(0 1 "${_prefix}" "${_pkg_alt}") endif(NOT _pkg_modules_found) if (${_prefix}_FOUND) set(_pkg_modules_found 1) endif(${_prefix}_FOUND) endforeach(_pkg_alt) if (NOT ${_prefix}_FOUND) if(${_pkg_is_required}) message(SEND_ERROR "None of the required '${_pkg_modules_alt}' found") endif(${_pkg_is_required}) else (NOT ${_prefix}_FOUND) _pkgconfig_set(__pkg_config_checked_${_prefix} ${PKG_CONFIG_VERSION}) endif(NOT ${_prefix}_FOUND) endif(NOT DEFINED __pkg_config_checked_${_prefix} OR __pkg_config_checked_${_prefix} LESS ${PKG_CONFIG_VERSION}) endmacro(pkg_search_module) ### macro(PKGCONFIG _package _include_DIR _link_DIR _link_FLAGS _cflags) message(STATUS "WARNING: you are using the obsolete 'PKGCONFIG' macro") _pkg_check_modules_internal(0 0 _PKGCONFIG_TMP "${_package}") if (_PKGCONFIG_TMP_FOUND) set(${_include_DIR} ${_PKGCONFIG_TMP_INCLUDEDIR}) set(${_link_DIR} ${_PKGCONFIG_TMP_LIBDIR}) set(${_link_FLAGS} ${_PKGCONFIG_TMP_LDFLAGS}) set(${_cflags} ${_PKGCONFIG_TMP_CFLAGS}) set(_return_VALUE 0) else(_PKGCONFIG_TMP_FOUND) set(${_include_DIR}) set(${_link_DIR}) set(${_link_FLAGS}) set(${_cflags}) set(_return_VALUE 1) endif(_PKGCONFIG_TMP_FOUND) endmacro(PKGCONFIG) ### Local Variables: ### mode: cmake ### End: traverso-0.49.4/cmake/modules/FindPCHSupport.cmake000644 001750 001750 00000003731 11163362147 022331 0ustar00remonremon000000 000000 # - Try to find precompiled headers support for GCC 3.4 and 4.x # Once done this will define: # # Variable: # PCHSupport_FOUND # # Macro: # ADD_PRECOMPILED_HEADER IF(CMAKE_COMPILER_IS_GNUCXX) EXEC_PROGRAM(${CMAKE_CXX_COMPILER} ARGS -dumpversion OUTPUT_VARIABLE gcc_compiler_version) # STRING(REGEX REPLACE ".* ([0-9]\\.[0-9]\\.[0-9]) .*" "\\1" # gcc_compiler_version ${_compiler_output}) # MESSAGE("GCC Version: ${gcc_compiler_version}") IF(gcc_compiler_version MATCHES "4\\.[0-9]\\.[0-9]") SET(PCHSupport_FOUND TRUE) ELSE(gcc_compiler_version MATCHES "4\\.[0-9]\\.[0-9]") IF(gcc_compiler_version MATCHES "3\\.4\\.[0-9]") SET(PCHSupport_FOUND TRUE) ENDIF(gcc_compiler_version MATCHES "3\\.4\\.[0-9]") ENDIF(gcc_compiler_version MATCHES "4\\.[0-9]\\.[0-9]") ENDIF(CMAKE_COMPILER_IS_GNUCXX) MACRO(ADD_PRECOMPILED_HEADER _targetName _input) GET_FILENAME_COMPONENT(_name ${_input} NAME) SET(_source "${CMAKE_CURRENT_SOURCE_DIR}/${_input}") SET(_outdir "${CMAKE_CURRENT_BINARY_DIR}/${_name}.gch") MAKE_DIRECTORY(${_outdir}) SET(_output "${_outdir}/${CMAKE_BUILD_TYPE}.c++") STRING(TOUPPER "CMAKE_CXX_FLAGS_${CMAKE_BUILD_TYPE}" _flags_var_name) SET(_compiler_FLAGS ${${_flags_var_name}}) SEPARATE_ARGUMENTS(_compiler_FLAGS) #MESSAGE("_compiler_FLAGS: ${_compiler_FLAGS}") ADD_CUSTOM_COMMAND( OUTPUT ${_output} COMMAND ${CMAKE_CXX_COMPILER} ${_compiler_FLAGS} -I${QT_INCLUDE_DIR} -I${QT_QTCORE_INCLUDE_DIR} -I${QT_QTGUI_INCLUDE_DIR} -I${QT_QTXML_INCLUDE_DIR} -I${CMAKE_SOURCE_DIR}/src/core -I${CMAKE_SOURCE_DIR}/src/common -I${CMAKE_SOURCE_DIR}/src/sheetcanvas ${QT_DEFINITIONS} ${TRAVERSO_DEFINES} -x c++-header -o ${_output} ${_source} DEPENDS ${_source} ) ADD_CUSTOM_TARGET(${_targetName} DEPENDS ${_output}) ENDMACRO(ADD_PRECOMPILED_HEADER) traverso-0.49.4/cleancompile000755 001750 001750 00000000435 11163362147 016346 0ustar00remonremon000000 000000 #!/bin/bash # With no args, does a full recompile # With -m, just remove dirty bins, qmake, make if [ "$1" != "-m" ] ; then make clean fi rm -r lib/* traverso if [ "$1" != "-m" ] ; then find ./ -name Makefile -type f -print0 | xargs -0 /bin/rm -f fi qmake -nocache time make -j2 traverso-0.49.4/deploy-osx.sh000755 001750 001750 00000030630 11163362147 016427 0ustar00remonremon000000 000000 #! /bin/bash ### ### # This script is used to create a bundle for OS X # ### ### QT_PATH=/usr/local/Trolltech/Qt-4.3.1 mkdir -p traverso.app/Contents/MacOS/ mkdir -p traverso.app/Contents/Resources/ mkdir -p traverso.app/Contents/Frameworks/ mkdir -p traverso.app/Contents/Frameworks/QtXml.framework/Versions/4/ mkdir -p traverso.app/Contents/Frameworks/QtOpenGL.framework/Versions/4/ mkdir -p traverso.app/Contents/Frameworks/QtGui.framework/Versions/4/ mkdir -p traverso.app/Contents/Frameworks/QtCore.framework/Versions/4/ cp bin/traverso traverso.app/Contents/MacOS/ cp resources/images/traverso_mac.icns traverso.app/Contents/Resources/Traverso.icns cp resources/Info.plist traverso.app/Contents/ cp /opt/local/bin/cdrdao traverso.app/Contents/MacOS/ cp /usr/local/bin/sox traverso.app/Contents/MacOS/ cp /usr/local/lib/libsndfile.1.dylib traverso.app/Contents/Frameworks cp /usr/local/lib/libsamplerate.0.dylib traverso.app/Contents/Frameworks cp /usr/local/lib/libportaudio.2.dylib traverso.app/Contents/Frameworks cp /usr/local/lib/librdf.0.dylib traverso.app/Contents/Frameworks cp /usr/local/lib/librasqal.0.dylib traverso.app/Contents/Frameworks cp /usr/local/lib/libvorbisfile.3.dylib traverso.app/Contents/Frameworks cp /usr/local/lib/libvorbisenc.2.dylib traverso.app/Contents/Frameworks cp /usr/local/lib/libvorbis.0.dylib traverso.app/Contents/Frameworks cp /usr/local/lib/libogg.0.dylib traverso.app/Contents/Frameworks cp /usr/local/lib/libmad.0.dylib traverso.app/Contents/Frameworks cp /usr/local/lib/libFLAC++.6.dylib traverso.app/Contents/Frameworks cp /usr/local/lib/libFLAC.8.dylib traverso.app/Contents/Frameworks cp /usr/local/lib/libraptor.1.dylib traverso.app/Contents/Frameworks cp /usr/local/lib/libst.0.dylib traverso.app/Contents/Frameworks cp /usr/local/lib/libwavpack.1.dylib traverso.app/Contents/Frameworks cp /usr/local/lib/libmp3lame.0.dylib traverso.app/Contents/Frameworks #cp /usr/local/lib/liblo.0.dylib traverso.app/Contents/Frameworks cp $QT_PATH/lib/QtXml.framework/Versions/4/QtXml traverso.app/Contents/Frameworks/QtXml.framework/Versions/4/ cp $QT_PATH/lib/QtOpenGL.framework/Versions/4/QtOpenGL traverso.app/Contents/Frameworks/QtOpenGL.framework/Versions/4/ cp $QT_PATH/lib/QtGui.framework/Versions/4/QtGui traverso.app/Contents/Frameworks/QtGui.framework/Versions/4/ cp $QT_PATH/lib/QtCore.framework/Versions/4/QtCore traverso.app/Contents/Frameworks/QtCore.framework/Versions/4/ install_name_tool -id @executable_path/../Frameworks/libsndfile.1.dylib traverso.app/Contents/Frameworks/libsndfile.1.dylib install_name_tool -id @executable_path/../Frameworks/libsamplerate.0.dylib traverso.app/Contents/Frameworks/libsamplerate.0.dylib install_name_tool -id @executable_path/../Frameworks/libportaudio.2.dylib traverso.app/Contents/Frameworks/libportaudio.2.dylib install_name_tool -id @executable_path/../Frameworks/librdf.0.dylib traverso.app/Contents/Frameworks/librdf.0.dylib install_name_tool -id @executable_path/../Frameworks/librasqal.0.dylib traverso.app/Contents/Frameworks/librasqal.0.dylib install_name_tool -id @executable_path/../Frameworks/libvorbis.0.dylib traverso.app/Contents/Frameworks/libvorbis.0.dylib install_name_tool -id @executable_path/../Frameworks/libvorbisfile.3.dylib traverso.app/Contents/Frameworks/libvorbisfile.3.dylib install_name_tool -id @executable_path/../Frameworks/libvorbisenc.2.dylib traverso.app/Contents/Frameworks/libvorbisenc.2.dylib install_name_tool -id @executable_path/../Frameworks/libogg.0.dylib traverso.app/Contents/Frameworks/libogg.0.dylib install_name_tool -id @executable_path/../Frameworks/libmad.0.dylib traverso.app/Contents/Frameworks/libmad.0.dylib install_name_tool -id @executable_path/../Frameworks/libraptor.1.dylib traverso.app/Contents/Frameworks/libraptor.1.dylib install_name_tool -id @executable_path/../Frameworks/libst.0.dylib traverso.app/Contents/Frameworks/libst.0.dylib install_name_tool -id @executable_path/../Frameworks/libwavpack.1.dylib traverso.app/Contents/Frameworks/libwavpack.1.dylib install_name_tool -id @executable_path/../Frameworks/libFLAC++.6.dylib traverso.app/Contents/Frameworks/libFLAC++.6.dylib install_name_tool -id @executable_path/../Frameworks/libFLAC.8.dylib traverso.app/Contents/Frameworks/libFLAC.8.dylib install_name_tool -id @executable_path/../Frameworks/libmp3lame.0.dylib traverso.app/Contents/Frameworks/libmp3lame.0.dylib #install_name_tool -id @executable_path/../Frameworks/liblo.0.dylib traverso.app/Contents/Frameworks/liblo.0.dylib install_name_tool -id @executable_path/../Frameworks/QtXml.framework/Versions/4/QtXml traverso.app/Contents/Frameworks/QtXml.framework/Versions/4/QtXml install_name_tool -id @executable_path/../Frameworks/QtOpenGL.framework/Versions/4/QtOpenGL traverso.app/Contents/Frameworks/QtOpenGL.framework/Versions/4/QtOpenGL install_name_tool -id @executable_path/../Frameworks/QtGui.framework/Versions/4/QtGui traverso.app/Contents/Frameworks/QtGui.framework/Versions/4/QtGui install_name_tool -id @executable_path/../Frameworks/QtCore.framework/Versions/4/QtCore traverso.app/Contents/Frameworks/QtCore.framework/Versions/4/QtCore install_name_tool -change /usr/local/lib/libsndfile.1.dylib @executable_path/../Frameworks/libsndfile.1.dylib traverso.app/Contents/MacOS/traverso install_name_tool -change /usr/local/lib/libsamplerate.0.dylib @executable_path/../Frameworks/libsamplerate.0.dylib traverso.app/Contents/MacOS/traverso install_name_tool -change /usr/local/lib/libportaudio.2.dylib @executable_path/../Frameworks/libportaudio.2.dylib traverso.app/Contents/MacOS/traverso install_name_tool -change /usr/local/lib/librdf.0.dylib @executable_path/../Frameworks/librdf.0.dylib traverso.app/Contents/MacOS/traverso install_name_tool -change /usr/local/lib/librasqal.0.dylib @executable_path/../Frameworks/librasqal.0.dylib traverso.app/Contents/MacOS/traverso install_name_tool -change /usr/local/lib/libvorbis.0.dylib @executable_path/../Frameworks/libvorbis.0.dylib traverso.app/Contents/MacOS/traverso install_name_tool -change /usr/local/lib/libvorbisfile.3.dylib @executable_path/../Frameworks/libvorbisfile.3.dylib traverso.app/Contents/MacOS/traverso install_name_tool -change /usr/local/lib/libvorbisenc.2.dylib @executable_path/../Frameworks/libvorbisenc.2.dylib traverso.app/Contents/MacOS/traverso install_name_tool -change /usr/local/lib/libogg.0.dylib @executable_path/../Frameworks/libogg.0.dylib traverso.app/Contents/MacOS/traverso install_name_tool -change /usr/local/lib/libmad.0.dylib @executable_path/../Frameworks/libmad.0.dylib traverso.app/Contents/MacOS/traverso install_name_tool -change /usr/local/lib/libraptor.1.dylib @executable_path/../Frameworks/libraptor.1.dylib traverso.app/Contents/MacOS/traverso install_name_tool -change /usr/local/lib/libwavpack.1.dylib @executable_path/../Frameworks/libwavpack.1.dylib traverso.app/Contents/MacOS/traverso install_name_tool -change /usr/local/lib/libFLAC++.6.dylib @executable_path/../Frameworks/libFLAC++.6.dylib traverso.app/Contents/MacOS/traverso install_name_tool -change /usr/local/lib/libFLAC.8.dylib @executable_path/../Frameworks/libFLAC.8.dylib traverso.app/Contents/MacOS/traverso install_name_tool -change /usr/local/lib/libmp3lame.0.dylib @executable_path/../Frameworks/libmp3lame.0.dylib traverso.app/Contents/MacOS/traverso #install_name_tool -change /usr/local/lib/liblo.0.dylib @executable_path/../Frameworks/liblo.0.dylib traverso.app/Contents/MacOS/traverso install_name_tool -change /usr/local/lib/libst.0.dylib @executable_path/../Frameworks/libst.0.dylib traverso.app/Contents/MacOS/sox install_name_tool -change /usr/local/lib/libsndfile.1.dylib @executable_path/../Frameworks/libsndfile.1.dylib traverso.app/Contents/MacOS/sox install_name_tool -change /usr/local/lib/libsamplerate.0.dylib @executable_path/../Frameworks/libsamplerate.0.dylib traverso.app/Contents/MacOS/sox install_name_tool -change $QT_PATH/lib/QtXml.framework/Versions/4/QtXml @executable_path/../Frameworks/QtXml.framework/Versions/4/QtXml traverso.app/Contents/MacOS/traverso install_name_tool -change $QT_PATH/lib/QtOpenGL.framework/Versions/4/QtOpenGL @executable_path/../Frameworks/QtOpenGL.framework/Versions/4/QtOpenGL traverso.app/Contents/MacOS/traverso install_name_tool -change $QT_PATH/lib/QtGui.framework/Versions/4/QtGui @executable_path/../Frameworks/QtGui.framework/Versions/4/QtGui traverso.app/Contents/MacOS/traverso install_name_tool -change $QT_PATH/lib/QtCore.framework/Versions/4/QtCore @executable_path/../Frameworks/QtCore.framework/Versions/4/QtCore traverso.app/Contents/MacOS/traverso install_name_tool -change $QT_PATH/lib/QtCore.framework/Versions/4/QtCore @executable_path/../Frameworks/QtCore.framework/Versions/4/QtCore traverso.app/Contents/Frameworks/QtGui.framework/Versions/4/QtGui install_name_tool -change $QT_PATH/lib/QtCore.framework/Versions/4/QtCore @executable_path/../Frameworks/QtCore.framework/Versions/4/QtCore traverso.app/Contents/Frameworks/QtXml.framework/Versions/4/QtXml install_name_tool -change $QT_PATH/lib/QtCore.framework/Versions/4/QtCore @executable_path/../Frameworks/QtCore.framework/Versions/4/QtCore traverso.app/Contents/Frameworks/QtOpenGL.framework/Versions/4/QtOpenGL install_name_tool -change $QT_PATH/lib/QtGui.framework/Versions/4/QtGui @executable_path/../Frameworks/QtGui.framework/Versions/4/QtGui traverso.app/Contents/Frameworks/QtOpenGL.framework/Versions/4/QtOpenGL install_name_tool -change /usr/local/lib/librasqal.0.dylib @executable_path/../Frameworks/librasqal.0.dylib traverso.app/Contents/Frameworks/librdf.0.dylib install_name_tool -change /usr/local/lib/libraptor.1.dylib @executable_path/../Frameworks/libraptor.1.dylib traverso.app/Contents/Frameworks/librdf.0.dylib install_name_tool -change /usr/local/lib/libraptor.1.dylib @executable_path/../Frameworks/libraptor.1.dylib traverso.app/Contents/Frameworks/librasqal.0.dylib install_name_tool -change /usr/local/lib/libst.0.dylib @executable_path/../Frameworks/libst.0.dylib traverso.app/Contents/Frameworks/libst.0.dylib install_name_tool -change /usr/local/lib/libsndfile.1.dylib @executable_path/../Frameworks/libsndfile.1.dylib traverso.app/Contents/Frameworks/libst.0.dylib install_name_tool -change /usr/local/lib/libsamplerate.0.dylib @executable_path/../Frameworks/libsamplerate.0.dylib traverso.app/Contents/Frameworks/libst.0.dylib install_name_tool -change /usr/local/lib/libvorbisfile.3.dylib @executable_path/../Frameworks/libvorbisfile.3.dylib traverso.app/Contents/Frameworks/libvorbisfile.3.dylib install_name_tool -change /usr/local/lib/libvorbis.0.dylib @executable_path/../Frameworks/libvorbis.0.dylib traverso.app/Contents/Frameworks/libvorbisfile.3.dylib install_name_tool -change /usr/local/lib/libogg.0.dylib @executable_path/../Frameworks/libogg.0.dylib traverso.app/Contents/Frameworks/libvorbisfile.3.dylib install_name_tool -change /usr/local/lib/libvorbis.0.dylib @executable_path/../Frameworks/libvorbis.0.dylib traverso.app/Contents/Frameworks/libvorbis.0.dylib install_name_tool -change /usr/local/lib/libogg.0.dylib @executable_path/../Frameworks/libogg.0.dylib traverso.app/Contents/Frameworks/libvorbis.0.dylib install_name_tool -change /usr/local/lib/libvorbis.0.dylib @executable_path/../Frameworks/libvorbis.0.dylib traverso.app/Contents/Frameworks/libvorbisenc.2.dylib install_name_tool -change /usr/local/lib/libogg.0.dylib @executable_path/../Frameworks/libogg.0.dylib traverso.app/Contents/Frameworks/libvorbisenc.2.dylib install_name_tool -change /usr/local/lib/libogg.0.dylib @executable_path/../Frameworks/libogg.0.dylib traverso.app/Contents/Frameworks/libogg.0.dylib install_name_tool -change /usr/local/lib/libmad.0.dylib @executable_path/../Frameworks/libmad.0.dylib traverso.app/Contents/Frameworks/libmad.0.dylib install_name_tool -change /usr/local/lib/libFLAC++.6.dylib @executable_path/../Frameworks/libFLAC++.6.dylib traverso.app/Contents/Frameworks/libFLAC++.6.dylib install_name_tool -change /usr/local/lib/libFLAC.8.dylib @executable_path/../Frameworks/libFLAC.8.dylib traverso.app/Contents/Frameworks/libFLAC++.6.dylib install_name_tool -change /usr/local/lib/libogg.0.dylib @executable_path/../Frameworks/libogg.0.dylib traverso.app/Contents/Frameworks/libFLAC++.6.dylib install_name_tool -change /usr/local/lib/libFLAC.8.dylib @executable_path/../Frameworks/libFLAC.8.dylib traverso.app/Contents/Frameworks/libFLAC.8.dylib install_name_tool -change /usr/local/lib/libogg.0.dylib @executable_path/../Frameworks/libogg.0.dylib traverso.app/Contents/Frameworks/libFLAC.8.dylib mv traverso.app Traverso.app traverso-0.49.4/ConfigureChecks.cmake000644 001750 001750 00000000430 11163362147 020024 0ustar00remonremon000000 000000 #http://websvn.kde.org/trunk/KDE/kdeaddons/ConfigureChecks.cmake?rev=520160&view=log include(CheckIncludeFile) include(CheckIncludeFiles) #include(CheckSymbolExists) include(CheckFunctionExists) include(CheckLibraryExists) #include(CheckPrototypeExists) include(CheckTypeSize) traverso-0.49.4/traverso-9999.ebuild000644 001750 001750 00000003772 11163362147 017450 0ustar00remonremon000000 000000 # Copyright 1999-2007 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 # $Header: /sources/traverso/traverso/traverso-9999.ebuild,v 1.2 2007/06/03 23:15:52 ingmar Exp $ inherit eutils qt4 toolchain-funcs cvs DESCRIPTION="Professional Audio Tools for GNU/Linux" HOMEPAGE="http://traverso-daw.org/" SRC_URI="" IUSE="alsa jack lv2 sse" SLOT="0" LICENSE="GPL-2" KEYWORDS="~amd64 ~ppc ~x86" RDEPEND="$(qt4_min_version 4.2.3) alsa? ( media-libs/alsa-lib ) jack? ( media-sound/jack-audio-connection-kit ) >=media-libs/libsndfile-1.0.12 media-libs/libsamplerate >=sci-libs/fftw-3 lv2? ( dev-libs/rasqal dev-libs/redland )" DEPEND="${RDEPEND} sys-apps/sed" S="${WORKDIR}/${PN}" src_unpack() { ECVS_SERVER="cvs.savannah.nongnu.org:/sources/traverso" ECVS_USER="anonymous" ECVS_PASS="" ECVS_AUTH="pserver" ECVS_MODULE="traverso" cvs_src_unpack cd "${S}" sed -ie "s:^\(\#define\ RESOURCES_DIR\) \(.*\):\1 \"/usr/share/traverso\":" src/config.h sed -ie "s:^\(target.path\ =\) \(.*\):\1 /usr/bin:" src/traverso/traverso.pro sed -ie "s:^\(DESTDIR_TARGET\ =\) \(.*\):\1 /usr/bin:" src/traverso/traverso.pro # Removing forced cxxflags sed -ie "s:^\(.*QMAKE_CXXFLAGS_RELEASE.*\):#\1:" src/base.pri # adding our cxxflags sed -ie "s:^\(.*release\ {.*\):\1\n QMAKE_CXXFLAGS_RELEASE\ =\ ${CXXFLAGS}:" src/base.pri } src_compile() { use jack || echo "DEFINES -= JACK_SUPPORT" >> src/base.pri use alsa || echo "DEFINES -= ALSA_SUPPORT" >> src/base.pri use sse || echo "DEFINES -= SSE_OPTIMIZATIONS" >> src/base.pri use lv2 || echo "DEFINES -= LV2_SUPPORT" >> src/base.pri QMAKE="/usr/bin/qmake" $QMAKE traverso.pro -after "QMAKE_STRIP=\"/usr/bin/true\"" || die "qmake failed" emake CC=$(tc-getCC) CXX=$(tc-getCXX) LINK=$(tc-getCXX) || die "emake failed" } src_install() { emake INSTALL_ROOT="${D}" install || die "emake install failed" dodoc AUTHORS ChangeLog README doicon resources/images/traverso-logo.svg make_desktop_entry ${PN} Traverso /usr/share/pixmaps/traverso-logo.svg } traverso-0.49.4/traverso.iss000755 001750 001750 00000003341 11163362147 016354 0ustar00remonremon000000 000000 [Setup] AppName=Traverso AppVerName=Traverso 0.42.0-rc1 DefaultDirName={pf}\Traverso DefaultGroupName=Traverso PrivilegesRequired=none UninstallDisplayIcon={app}\traverso.exe [Files] Source: "traverso.exe"; DestDir: "{app}" Source: "3thparty\bin\cdrdao.exe"; DestDir: "{app}" Source: "3thparty\bin\wget.exe"; DestDir: "{tmp}" Source: "3thparty\lib\cygwin1.dll"; DestDir: "{app}" Source: "3thparty\lib\libfftw3-3.dll"; DestDir: "{app}" Source: "3thparty\lib\libsndfile-1.dll"; DestDir: "{app}" Source: "3thparty\lib\libFLAC.dll"; DestDir: "{app}" Source: "3thparty\lib\libMAD.dll"; DestDir: "{app}" Source: "3thparty\lib\ogg.dll"; DestDir: "{app}" Source: "3thparty\lib\vorbis.dll"; DestDir: "{app}" Source: "3thparty\lib\vorbisfile.dll"; DestDir: "{app}" Source: "3thparty\lib\vorbisenc.dll"; DestDir: "{app}" Source: "3thparty\lib\wavpackdll.dll"; DestDir: "{app}" Source: "3thparty\lib\libsamplerate.dll"; DestDir: "{app}" Source: "mingwm10.dll"; DestDir: "{app}" Source: "QtCore4.dll"; DestDir: "{app}" Source: "QtGui4.dll"; DestDir: "{app}" Source: "QtOpenGL4.dll"; DestDir: "{app}" Source: "QtXml4.dll"; DestDir: "{app}" [Tasks] Name: aspi; Description: "Download and Install ASPI drivers (needed for CD Burning)" [Icons] Name: "{group}\Traverso"; Filename: "{app}\traverso.exe" Name: "{group}\Uninstall Traverso"; Filename: "{uninstallexe}" [Run] Filename: "{tmp}\wget.exe"; Parameters: "-O {tmp}/aspi.exe http://download.adaptec.com/software_pc/aspi/aspi_471a2.exe"; StatusMsg: "Downloading ASPI Drivers..."; Tasks: aspi Filename: "{tmp}\aspi.exe"; StatusMsg: "Installing ASPI Driver Installer..."; Tasks: aspi Filename: "C:\adaptec\aspi\aspiinst.exe"; StatusMsg: "Installing ASPI Drivers..."; Tasks: aspi traverso-0.49.4/README000644 001750 001750 00000000303 11163362147 014637 0ustar00remonremon000000 000000 For installing Traverso, you should follow the explanation as given in the INSTALL file, or read the documentation which you can find on the website. Website address: http://traverso-daw.org/ traverso-0.49.4/createtranslation000755 001750 001750 00000002235 11427753307 017442 0ustar00remonremon000000 000000 lupdate -verbose -noobsolete \ src/traverso/*.cpp src/traverso/*.h \ src/sheetcanvas/*.cpp src/sheetcanvas/*.h \ src/sheetcanvas/dialogs/*.cpp src/sheetcanvas/dialogs/*.h \ src/sheetcanvas/ui/*.ui \ src/traverso/widgets/*.cpp src/traverso/dialogs/project/*.cpp \ src/traverso/dialogs/settings/*.cpp \ src/core/*.cpp src/core/*.h src/engine/*.cpp src/commands/*.cpp \ src/traverso/ui/*.ui src/commands/plugins/TraversoCommands/*.h \ src/commands/plugins/TraversoCommands/*.cpp \ src/common/Utils.cpp\ -ts \ resources/translations/traverso_nl.ts \ resources/translations/traverso_de.ts \ resources/translations/traverso_pt.ts \ resources/translations/traverso_fr.ts \ resources/translations/traverso_bg.ts \ resources/translations/traverso_cs.ts \ resources/translations/traverso_es.ts lrelease -verbose \ resources/translations/traverso_nl.ts \ resources/translations/traverso_de.ts \ resources/translations/traverso_pt.ts \ resources/translations/traverso_fr.ts \ resources/translations/traverso_bg.ts \ resources/translations/traverso_cs.ts \ resources/translations/traverso_es.ts traverso-0.49.4/cmake_uninstall.cmake000644 001750 001750 00000001544 11163362147 020142 0ustar00remonremon000000 000000 IF(NOT EXISTS "/home/remon/Traverso/cvs/checkout/traverso/install_manifest.txt") MESSAGE(FATAL_ERROR "Cannot find install manifest: \"/home/remon/Traverso/cvs/checkout/traverso/install_manifest.txt\"") ENDIF(NOT EXISTS "/home/remon/Traverso/cvs/checkout/traverso/install_manifest.txt") FILE(READ "/home/remon/Traverso/cvs/checkout/traverso/install_manifest.txt" files) STRING(REGEX REPLACE "\n" ";" files "${files}") FOREACH(file ${files}) MESSAGE(STATUS "Uninstalling \"${file}\"") IF(NOT EXISTS "${file}") MESSAGE(FATAL_ERROR "File \"${file}\" does not exists.") ENDIF(NOT EXISTS "${file}") EXEC_PROGRAM("/usr/bin/cmake" ARGS "-E remove \"${file}\"" OUTPUT_VARIABLE rm_out RETURN_VARIABLE rm_retval) IF("${rm_retval}" GREATER 0) MESSAGE(FATAL_ERROR "Problem when removing \"${file}\"") ENDIF("${rm_retval}" GREATER 0) ENDFOREACH(file) traverso-0.49.4/check-osx.sh000755 001750 001750 00000000244 11163362147 016206 0ustar00remonremon000000 000000 #! /bin/bash for file in Traverso.app/Contents/MacOS/*; do otool -L $file done for file in Traverso.app/Contents/Frameworks/*.dylib; do otool -L $file done traverso-0.49.4/cmake_uninstall.cmake.in000644 001750 001750 00000001444 11163362147 020546 0ustar00remonremon000000 000000 IF(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") MESSAGE(FATAL_ERROR "Cannot find install manifest: \"@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt\"") ENDIF(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") FILE(READ "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" files) STRING(REGEX REPLACE "\n" ";" files "${files}") FOREACH(file ${files}) MESSAGE(STATUS "Uninstalling \"${file}\"") IF(NOT EXISTS "${file}") MESSAGE(FATAL_ERROR "File \"${file}\" does not exists.") ENDIF(NOT EXISTS "${file}") EXEC_PROGRAM("@CMAKE_COMMAND@" ARGS "-E remove \"${file}\"" OUTPUT_VARIABLE rm_out RETURN_VARIABLE rm_retval) IF("${rm_retval}" GREATER 0) MESSAGE(FATAL_ERROR "Problem when removing \"${file}\"") ENDIF("${rm_retval}" GREATER 0) ENDFOREACH(file)traverso-0.49.4/COPYRIGHT000644 001750 001750 00000000300 11163362147 015247 0ustar00remonremon000000 000000 Traverso - Professional Audio Tool for GNU/Linux Authors : See AUTHORS file This software is distributed under the terms of the GNU General Public License as specified in the COPYING file. traverso-0.49.4/COPYING000644 001750 001750 00000127365 11163362147 015034 0ustar00remonremon000000 000000 Table of contents: 1. GNU GENERAL PUBLIC LICENSE 2. GNU LESSER GENERAL PUBLIC LICENSE ********************************************************* ********************************************************* 1. GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. ***************************************************************** ***************************************************************** 2. GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! traverso-0.49.4/config.h.cmake000644 001750 001750 00000000166 11163362147 016463 0ustar00remonremon000000 000000 #cmakedefine VERSION "${VERSION}" #cmakedefine TRAVERSO_DEFINES "${TRAVERSO_DEFINES}" #cmakedefine BUILD_MAC_BUNDLE traverso-0.49.4/PACKAGERS000644 001750 001750 00000003165 11163362147 015213 0ustar00remonremon000000 000000 The tarball as it is supplied should be suitable for creating a distribution package without major modification. Please contact the author for any questions, suggestions or fixes, so they can be merged upstream: remon at traverso-daw dot org Optimized builds: Traverso's build script by default detects the host cpu feature set, for optimal build settings. This can however make your build incompatible for certain cpu's. You can disable host cpu feature detection with: -DDETECT_HOST_CPU_FEATURES=OFF To enable runtime detected SSE support, add: -DCMAKE_CXX_FLAGS:STRING="-DSSE_OPTIMIZATIONS -DARCH_X86" To enable runtime detected cpu fpu denormals are zero support, add: -DCMAKE_CXX_FLAGS:STRING="-DUSE_XMMINTRIN -DARCH_X86" If your distribution has slv2 >= 0.6.1 you can compile with: -DUSE_SYSTEM_SLV2_LIBRARY=ON to let Traverso use the system installed one. E.g. compiling a package for an i686 compatible Linux system with runtime detected SSE support: cmake . -DDETECT_HOST_CPU_FEATURES=OFF -DWANT_JACK=ON -DWANT_ALSA=ON -DUSE_SYSTEM_SLV2_LIBRARY=OFF \ -DCMAKE_CXX_FLAGS:STRING="-march=i686 -DSSE_OPTIMIZATIONS -DUSE_XMMINTRIN -DARCH_X86" Compiling for a cpu architecture that doesn't support sse: cmake . -DDETECT_HOST_CPU_FEATURES=OFF -DWANT_JACK=ON -DWANT_ALSA=ON -DUSE_SYSTEM_SLV2_LIBRARY=OFF Adding additional compiler flags, like compiling with -msse -mfpmath=sse (in case the targetted host supports it): cmake . -DDETECT_HOST_CPU_FEATURES=OFF -DWANT_JACK=ON -DWANT_ALSA=ON -DUSE_SYSTEM_SLV2_LIBRARY=OFF \ -DCMAKE_CXX_FLAGS:STRING="-march=i686 -msse -mfpmath=sse -DSSE_OPTIMIZATIONS -DUSE_XMMINTRIN -DARCH_X86"