diff -Nru qmidiarp-0.4.2/aclocal.m4 qmidiarp-0.4.5/aclocal.m4
--- qmidiarp-0.4.2/aclocal.m4 2011-07-09 15:48:15.000000000 +0000
+++ qmidiarp-0.4.5/aclocal.m4 2012-01-21 17:28:54.000000000 +0000
@@ -1,7 +1,8 @@
-# generated automatically by aclocal 1.11.1 -*- Autoconf -*-
+# generated automatically by aclocal 1.11.2 -*- Autoconf -*-
# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-# 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
+# 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation,
+# Inc.
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
@@ -179,12 +180,15 @@
fi[]dnl
])# PKG_CHECK_MODULES
-# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008, 2011 Free Software
+# Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
+# serial 1
+
# AM_AUTOMAKE_VERSION(VERSION)
# ----------------------------
# Automake X.Y traces this macro to ensure aclocal.m4 has been
@@ -194,7 +198,7 @@
[am__api_version='1.11'
dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
dnl require some minimum version. Point them to the right macro.
-m4_if([$1], [1.11.1], [],
+m4_if([$1], [1.11.2], [],
[AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
])
@@ -210,19 +214,21 @@
# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
-[AM_AUTOMAKE_VERSION([1.11.1])dnl
+[AM_AUTOMAKE_VERSION([1.11.2])dnl
m4_ifndef([AC_AUTOCONF_VERSION],
[m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
# AM_AUX_DIR_EXPAND -*- Autoconf -*-
-# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc.
+# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
+# serial 1
+
# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to
# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
@@ -270,13 +276,13 @@
# AM_COND_IF -*- Autoconf -*-
-# Copyright (C) 2008 Free Software Foundation, Inc.
+# Copyright (C) 2008, 2010 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
-# serial 1
+# serial 3
# _AM_COND_IF
# _AM_COND_ELSE
@@ -290,15 +296,15 @@
# AM_COND_IF(COND, [IF-TRUE], [IF-FALSE])
# ---------------------------------------
-# If the shell condition matching COND is true, execute IF-TRUE,
-# otherwise execute IF-FALSE. Allow automake to learn about conditional
-# instantiating macros (the AC_CONFIG_FOOS).
+# If the shell condition COND is true, execute IF-TRUE, otherwise execute
+# IF-FALSE. Allow automake to learn about conditional instantiating macros
+# (the AC_CONFIG_FOOS).
AC_DEFUN([AM_COND_IF],
[m4_ifndef([_AM_COND_VALUE_$1],
[m4_fatal([$0: no such condition "$1"])])dnl
_AM_COND_IF([$1])dnl
-if _AM_COND_VALUE_$1; then
- m4_default([$2], [:])
+if test -z "$$1_TRUE"; then :
+ m4_n([$2])[]dnl
m4_ifval([$3],
[_AM_COND_ELSE([$1])dnl
else
@@ -344,14 +350,14 @@
Usually this means the macro was only invoked conditionally.]])
fi])])
-# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009
-# Free Software Foundation, Inc.
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009,
+# 2010, 2011 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
-# serial 10
+# serial 12
# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
# written in clear, in which case automake, when reading aclocal.m4,
@@ -391,6 +397,7 @@
# instance it was reported that on HP-UX the gcc test will end up
# making a dummy file named `D' -- because `-MD' means `put the output
# in D'.
+ rm -rf conftest.dir
mkdir conftest.dir
# Copy depcomp to subdir because otherwise we won't find it if we're
# using a relative directory.
@@ -455,7 +462,7 @@
break
fi
;;
- msvisualcpp | msvcmsys)
+ msvc7 | msvc7msys | msvisualcpp | msvcmsys)
# This compiler won't grok `-c -o', but also, the minuso test has
# not run yet. These depmodes are late enough in the game, and
# so weak that their functioning should not be impacted.
@@ -520,10 +527,13 @@
if test "x$enable_dependency_tracking" != xno; then
am_depcomp="$ac_aux_dir/depcomp"
AMDEPBACKSLASH='\'
+ am__nodep='_no'
fi
AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
AC_SUBST([AMDEPBACKSLASH])dnl
_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
+AC_SUBST([am__nodep])dnl
+_AM_SUBST_NOTMAKE([am__nodep])dnl
])
# Generate code to set up dependency tracking. -*- Autoconf -*-
@@ -745,12 +755,15 @@
done
echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
-# Copyright (C) 2001, 2003, 2005, 2008 Free Software Foundation, Inc.
+# Copyright (C) 2001, 2003, 2005, 2008, 2011 Free Software Foundation,
+# Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
+# serial 1
+
# AM_PROG_INSTALL_SH
# ------------------
# Define $install_sh.
@@ -882,12 +895,15 @@
fi
])
-# Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+# Copyright (C) 2003, 2004, 2005, 2006, 2011 Free Software Foundation,
+# Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
+# serial 1
+
# AM_PROG_MKDIR_P
# ---------------
# Check for `mkdir -p'.
@@ -910,13 +926,14 @@
# Helper functions for option handling. -*- Autoconf -*-
-# Copyright (C) 2001, 2002, 2003, 2005, 2008 Free Software Foundation, Inc.
+# Copyright (C) 2001, 2002, 2003, 2005, 2008, 2010 Free Software
+# Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
-# serial 4
+# serial 5
# _AM_MANGLE_OPTION(NAME)
# -----------------------
@@ -924,13 +941,13 @@
[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
# _AM_SET_OPTION(NAME)
-# ------------------------------
+# --------------------
# Set option NAME. Presently that only means defining a flag for this option.
AC_DEFUN([_AM_SET_OPTION],
[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
# _AM_SET_OPTIONS(OPTIONS)
-# ----------------------------------
+# ------------------------
# OPTIONS is a space-separated list of Automake options.
AC_DEFUN([_AM_SET_OPTIONS],
[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
@@ -1006,12 +1023,14 @@
fi
AC_MSG_RESULT(yes)])
-# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc.
+# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
+# serial 1
+
# AM_PROG_INSTALL_STRIP
# ---------------------
# One issue with vendor `install' (even GNU) is that you can't
@@ -1034,13 +1053,13 @@
INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
AC_SUBST([INSTALL_STRIP_PROGRAM])])
-# Copyright (C) 2006, 2008 Free Software Foundation, Inc.
+# Copyright (C) 2006, 2008, 2010 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
-# serial 2
+# serial 3
# _AM_SUBST_NOTMAKE(VARIABLE)
# ---------------------------
@@ -1049,7 +1068,7 @@
AC_DEFUN([_AM_SUBST_NOTMAKE])
# AM_SUBST_NOTMAKE(VARIABLE)
-# ---------------------------
+# --------------------------
# Public sister of _AM_SUBST_NOTMAKE.
AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
diff -Nru qmidiarp-0.4.2/AUTHORS qmidiarp-0.4.5/AUTHORS
--- qmidiarp-0.4.2/AUTHORS 2011-05-29 18:18:19.000000000 +0000
+++ qmidiarp-0.4.5/AUTHORS 2011-11-07 20:48:40.000000000 +0000
@@ -2,10 +2,10 @@
---------------------------------
Frank Kober
+Nedko Arnaudov
Guido Scholz
Matthias Nagorni
-
Translations
---------------------------------
Robert Dietrich - de
diff -Nru qmidiarp-0.4.2/configure qmidiarp-0.4.5/configure
--- qmidiarp-0.4.2/configure 2011-07-09 15:48:17.000000000 +0000
+++ qmidiarp-0.4.5/configure 2012-01-21 17:28:55.000000000 +0000
@@ -1,6 +1,6 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.68 for qmidiarp 0.4.2.
+# Generated by GNU Autoconf 2.68 for qmidiarp 0.4.5.
#
# Report bugs to .
#
@@ -560,8 +560,8 @@
# Identity of this package.
PACKAGE_NAME='qmidiarp'
PACKAGE_TARNAME='qmidiarp'
-PACKAGE_VERSION='0.4.2'
-PACKAGE_STRING='qmidiarp 0.4.2'
+PACKAGE_VERSION='0.4.5'
+PACKAGE_STRING='qmidiarp 0.4.5'
PACKAGE_BUGREPORT='qmidiarp-devel@lists.sourceforge.net'
PACKAGE_URL=''
@@ -631,6 +631,7 @@
am__fastdepCXX_FALSE
am__fastdepCXX_TRUE
CXXDEPMODE
+am__nodep
AMDEPBACKSLASH
AMDEP_FALSE
AMDEP_TRUE
@@ -766,6 +767,7 @@
enable_doxygen_ps
enable_doxygen_pdf
enable_dependency_tracking
+enable_translations
'
ac_precious_vars='build_alias
host_alias
@@ -1327,7 +1329,7 @@
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
-\`configure' configures qmidiarp 0.4.2 to adapt to many kinds of systems.
+\`configure' configures qmidiarp 0.4.5 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1393,7 +1395,7 @@
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of qmidiarp 0.4.2:";;
+ short | recursive ) echo "Configuration of qmidiarp 0.4.5:";;
esac
cat <<\_ACEOF
@@ -1414,6 +1416,7 @@
--enable-doxygen-pdf generate doxygen PDF documentation
--disable-dependency-tracking speeds up one-time build
--enable-dependency-tracking do not reject slow dependency extractors
+ --enable-translations enable translation file generation (default=yes)
Some influential environment variables:
DOXYGEN_PAPER_SIZE
@@ -1502,7 +1505,7 @@
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-qmidiarp configure 0.4.2
+qmidiarp configure 0.4.5
generated by GNU Autoconf 2.68
Copyright (C) 2010 Free Software Foundation, Inc.
@@ -1963,7 +1966,7 @@
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
-It was created by qmidiarp $as_me 0.4.2, which was
+It was created by qmidiarp $as_me 0.4.5, which was
generated by GNU Autoconf 2.68. Invocation command line was
$ $0 $@
@@ -2781,7 +2784,7 @@
# Define the identity of the package.
PACKAGE='qmidiarp'
- VERSION='0.4.2'
+ VERSION='0.4.5'
cat >>confdefs.h <<_ACEOF
@@ -5321,6 +5324,7 @@
if test "x$enable_dependency_tracking" != xno; then
am_depcomp="$ac_aux_dir/depcomp"
AMDEPBACKSLASH='\'
+ am__nodep='_no'
fi
if test "x$enable_dependency_tracking" != xno; then
AMDEP_TRUE=
@@ -5345,6 +5349,7 @@
# instance it was reported that on HP-UX the gcc test will end up
# making a dummy file named `D' -- because `-MD' means `put the output
# in D'.
+ rm -rf conftest.dir
mkdir conftest.dir
# Copy depcomp to subdir because otherwise we won't find it if we're
# using a relative directory.
@@ -5404,7 +5409,7 @@
break
fi
;;
- msvisualcpp | msvcmsys)
+ msvc7 | msvc7msys | msvisualcpp | msvcmsys)
# This compiler won't grok `-c -o', but also, the minuso test has
# not run yet. These depmodes are late enough in the game, and
# so weak that their functioning should not be impacted.
@@ -6012,6 +6017,7 @@
# instance it was reported that on HP-UX the gcc test will end up
# making a dummy file named `D' -- because `-MD' means `put the output
# in D'.
+ rm -rf conftest.dir
mkdir conftest.dir
# Copy depcomp to subdir because otherwise we won't find it if we're
# using a relative directory.
@@ -6071,7 +6077,7 @@
break
fi
;;
- msvisualcpp | msvcmsys)
+ msvc7 | msvc7msys | msvisualcpp | msvcmsys)
# This compiler won't grok `-c -o', but also, the minuso test has
# not run yet. These depmodes are late enough in the game, and
# so weak that their functioning should not be impacted.
@@ -6682,8 +6688,16 @@
as_fn_error $? "cannot find 'moc', please install the Qt4 development tools package." "$LINENO" 5
fi
-enable_translations=true
- if test x$enable_translations = xtrue; then
+# Enable translations.
+# Check whether --enable-translations was given.
+if test "${enable_translations+set}" = set; then :
+ enableval=$enable_translations; ac_translations="$enableval"
+else
+ ac_translations="yes"
+fi
+
+
+ if test "x$ac_translations" = "xyes"; then
ENABLE_TRANSLATIONS_TRUE=
ENABLE_TRANSLATIONS_FALSE='#'
else
@@ -6692,7 +6706,7 @@
fi
-if test x$enable_translations = xtrue; then
+if test -z "$ENABLE_TRANSLATIONS_TRUE"; then :
for ac_prog in lupdate-qt4 lupdate
do
@@ -6797,8 +6811,8 @@
fi
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: transaltions are disabled" >&5
-$as_echo "$as_me: transaltions are disabled" >&6;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: translations are disabled" >&5
+$as_echo "$as_me: translations are disabled" >&6;}
fi
# Checks for header files.
@@ -7654,6 +7668,21 @@
# Checks for header files.
+ac_fn_c_check_header_mongrel "$LINENO" "jack/session.h" "ac_cv_header_jack_session_h" "$ac_includes_default"
+if test "x$ac_cv_header_jack_session_h" = xyes; then :
+ jack_session_found="yes"
+else
+ jack_session_found="no"
+fi
+
+
+if test "$jack_session_found" = "yes"; then
+
+$as_echo "#define JACK_SESSION 1" >>confdefs.h
+
+fi
+
+
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
@@ -8305,7 +8334,7 @@
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
-This file was extended by qmidiarp $as_me 0.4.2, which was
+This file was extended by qmidiarp $as_me 0.4.5, which was
generated by GNU Autoconf 2.68. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@@ -8371,7 +8400,7 @@
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\
-qmidiarp config.status 0.4.2
+qmidiarp config.status 0.4.5
configured by $0, generated by GNU Autoconf 2.68,
with options \\"\$ac_cs_config\\"
@@ -9237,3 +9266,12 @@
$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
fi
+
+echo
+if test "x$ac_translations" = "xno" ; then
+echo "Translation file generation disabled."
+echo "Use ./configure --enable-translations=yes to enable."
+else
+echo "Translation file generation enabled."
+fi
+echo
diff -Nru qmidiarp-0.4.2/configure.ac qmidiarp-0.4.5/configure.ac
--- qmidiarp-0.4.2/configure.ac 2011-07-09 15:25:08.000000000 +0000
+++ qmidiarp-0.4.5/configure.ac 2012-01-21 17:28:24.000000000 +0000
@@ -2,7 +2,7 @@
# Process this file with autoconf to produce a configure script.
dnl AC_PREREQ([2.63])
-AC_INIT([qmidiarp], [0.4.2], [qmidiarp-devel@lists.sourceforge.net])
+AC_INIT([qmidiarp], [0.4.5], [qmidiarp-devel@lists.sourceforge.net])
AC_CONFIG_SRCDIR([src/main.cpp])
AC_CONFIG_HEADERS(src/config.h)
AM_INIT_AUTOMAKE([dist-bzip2])
@@ -65,8 +65,13 @@
[cannot find 'moc', please install the Qt4 development tools package.])
fi
-enable_translations=true
-AM_CONDITIONAL([ENABLE_TRANSLATIONS], [test x$enable_translations = xtrue])
+# Enable translations.
+AC_ARG_ENABLE(translations,
+ AC_HELP_STRING([--enable-translations], [enable translation file generation (default=yes)]),
+ [ac_translations="$enableval"],
+ [ac_translations="yes"])
+
+AM_CONDITIONAL([ENABLE_TRANSLATIONS], [test "x$ac_translations" = "xyes"])
AM_COND_IF([ENABLE_TRANSLATIONS],[
dnl check for lupdate
@@ -82,7 +87,7 @@
AC_MSG_ERROR(
[cannot find 'lrelease', please install the Qt4 development tools package.])
fi
-], [AC_MSG_NOTICE([transaltions are disabled])])
+], [AC_MSG_NOTICE([translations are disabled])])
# Checks for header files.
AC_HEADER_STDC
@@ -102,6 +107,12 @@
# Checks for header files.
+AC_CHECK_HEADER(jack/session.h, jack_session_found="yes", jack_session_found="no")
+if test "$jack_session_found" = "yes"; then
+ AC_DEFINE(JACK_SESSION, 1, [Define to enable jack session support])
+fi
+
+
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
@@ -111,3 +122,12 @@
AC_CONFIG_FILES([src/pixmaps/Makefile] [man/Makefile] [man/fr/Makefile])
AC_CONFIG_FILES([man/de/Makefile])
AC_OUTPUT
+
+echo
+if test "x$ac_translations" = "xno" ; then
+echo "Translation file generation disabled."
+echo "Use ./configure --enable-translations=yes to enable."
+else
+echo "Translation file generation enabled."
+fi
+echo
diff -Nru qmidiarp-0.4.2/debian/changelog qmidiarp-0.4.5/debian/changelog
--- qmidiarp-0.4.2/debian/changelog 2011-07-10 09:32:35.000000000 +0000
+++ qmidiarp-0.4.5/debian/changelog 2012-01-31 00:08:19.000000000 +0000
@@ -1,3 +1,44 @@
+qmidiarp (0.4.5-1) unstable; urgency=low
+
+ * New upstream release.
+ - Fixed Bugs
+ + JACK Transport start with ALSA backend was broken in 0.4.4
+ + Event forwarding port index was uninitialized in JACK MIDI backend
+
+ * Added patch fixing desktop file
+ * Added patch fixing few syntax and spelling errors in man pages
+
+ -- Jaromír Mikeš Mon, 30 Jan 2012 23:41:28 +0100
+
+qmidiarp (0.4.4-1) unstable; urgency=low
+
+ * New upstream release:
+ - New Features:
+ + JACK MIDI backend doesn't require Jack Transport anymore
+ - Improvements:
+ + Better usability of the sequencer loop marker
+ + Improved LFO offset slider behavior
+ + Quantization to the minimum stepwidth in Arp modules active when
+ changes in Arp patterns occur
+ - Fixed Bugs
+ + Crash on startup in JACK MIDI mode on certain systems
+ + When cloning modules, the current play direction wasn't copied
+ + Unmatched MIDI event forwarding didn't work with Arp modules
+ + Typo in english manpage
+
+ -- Alessio Treglia Tue, 27 Dec 2011 02:10:30 +0100
+
+qmidiarp (0.4.3-1) unstable; urgency=low
+
+ [ Jaromír Mikeš ]
+ * New upstream release.
+ * Add myself as uploader.
+
+ [ Alessio Treglia ]
+ * Set DM-Upload-Allowed: yes
+
+ -- Alessio Treglia Sat, 03 Dec 2011 17:56:44 +0100
+
qmidiarp (0.4.2-1) unstable; urgency=low
* New upstream release.
diff -Nru qmidiarp-0.4.2/debian/control qmidiarp-0.4.5/debian/control
--- qmidiarp-0.4.2/debian/control 2011-06-01 11:03:36.000000000 +0000
+++ qmidiarp-0.4.5/debian/control 2012-01-31 00:03:44.000000000 +0000
@@ -2,7 +2,8 @@
Section: sound
Priority: optional
Maintainer: Debian Multimedia Maintainers
-Uploaders: Alessio Treglia
+Uploaders: Alessio Treglia ,
+ Jaromír Mikeš
Build-Depends: debhelper (>= 7.0.50~),
dh-autoreconf,
libqt4-dev,
@@ -12,6 +13,7 @@
python-scour
Homepage: http://qmidiarp.sourceforge.net/
Standards-Version: 3.9.2
+DM-Upload-Allowed: yes
Vcs-Git: git://git.debian.org/pkg-multimedia/qmidiarp.git
Vcs-Browser: http://git.debian.org/?p=pkg-multimedia/qmidiarp.git
diff -Nru qmidiarp-0.4.2/debian/copyright qmidiarp-0.4.5/debian/copyright
--- qmidiarp-0.4.2/debian/copyright 2011-06-01 11:00:51.000000000 +0000
+++ qmidiarp-0.4.5/debian/copyright 2012-01-31 00:03:44.000000000 +0000
@@ -1,12 +1,10 @@
-Format: http://svn.debian.org/wsvn/dep/web/deps/dep5.mdwn?op=file&rev=166
+Format: http://svn.debian.org/wsvn/dep/web/deps/dep5.mdwn?op=file&rev=202
Upstream-Name: QMidiArp
Upstream-Contact:
Matthias Nagorni
Frank Kober
Guido Scholz
Source: https://sourceforge.net/projects/qmidiarp/files
-Copyright: 2009, 2010, 2011
-License: GPL-2+
Files: *
Copyright:
@@ -17,7 +15,9 @@
License: GPL-2+
Files: debian/*
-Copyright: 2011 Alessio Treglia
+Copyright:
+ 2011 Alessio Treglia
+ 2011 Jaromír Mikeš
License: GPL-2+
License: GPL-2+
@@ -30,10 +30,11 @@
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
- .
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software Foundation,
- Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
+Comment:
+ You should have 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.
or point your web browser to http://www.gnu.org.
-Comment: On Debian systems, the complete text of the GNU General
- Public License can be found in `/usr/share/common-licenses/GPL-2'.
+ .
+ On Debian systems, the full text of the GNU General Public
+ License can be found in the file `/usr/share/common-licenses/GPL-2'.
diff -Nru qmidiarp-0.4.2/debian/patches/01-desktop-file.patch qmidiarp-0.4.5/debian/patches/01-desktop-file.patch
--- qmidiarp-0.4.2/debian/patches/01-desktop-file.patch 1970-01-01 00:00:00.000000000 +0000
+++ qmidiarp-0.4.5/debian/patches/01-desktop-file.patch 2012-01-31 00:03:44.000000000 +0000
@@ -0,0 +1,16 @@
+Description:
+ Patch removes encoding line from desktop file,
+ it is deprecated now.
+Author: Jaromír Mikeš
+Forwarded: yes
+
+Index: qmidiarp/qmidiarp.desktop
+===================================================================
+--- qmidiarp.orig/qmidiarp.desktop 2012-01-31 00:00:21.569606723 +0100
++++ qmidiarp/qmidiarp.desktop 2012-01-31 00:04:21.721600451 +0100
+@@ -1,5 +1,4 @@
+ [Desktop Entry]
+-Encoding=UTF-8
+ Type=Application
+ Categories=AudioVideo;X-Sound;Midi;Audio;AudioVideoEditing;X-Jack;X-Midi;
+ Name=QMidiArp
diff -Nru qmidiarp-0.4.2/debian/patches/02-man-pages.patch qmidiarp-0.4.5/debian/patches/02-man-pages.patch
--- qmidiarp-0.4.2/debian/patches/02-man-pages.patch 1970-01-01 00:00:00.000000000 +0000
+++ qmidiarp-0.4.5/debian/patches/02-man-pages.patch 2012-01-31 00:03:44.000000000 +0000
@@ -0,0 +1,76 @@
+Description:
+ Patch fix few syntax and spelling errors in man pages.
+Author: Jaromír Mikeš
+Forwarded: yes
+
+Index: qmidiarp/man/de/qmidiarp.1
+===================================================================
+--- qmidiarp.orig/man/de/qmidiarp.1 2012-01-31 00:33:29.000000000 +0100
++++ qmidiarp/man/de/qmidiarp.1 2012-01-31 00:37:18.437548827 +0100
+@@ -46,7 +46,7 @@
+
+ .SS "Allgemeine Funktion"
+ Wenn keine Startoptionen angegeben werden, startet QMidiArp als JACK MIDI
+-client mit einem MIDI-Eingang und zwei MIDI-Ausgängen. Durch die -a
++client mit einem MIDI\-Eingang und zwei MIDI\-Ausgängen. Durch die \-a
+ Option wird QMidiArp als ALSA client gestartet.
+
+ Ein neuer Arpeggiator, Sequenzer oder LFO wird erzeugt durch Klicken auf
+@@ -365,7 +365,7 @@
+ Welle kann durch losgelassene Tasten gestoppt werden wenn
+ .B Note Off
+ Signal am Eingang mit dem entsprechenden
+-.Kanal
++.B Kanal
+ empfangen wird.
+ .PP
+ .B "LFO Ausgangs-Feld"
+Index: qmidiarp/man/fr/qmidiarp.1
+===================================================================
+--- qmidiarp.orig/man/fr/qmidiarp.1 2012-01-31 00:33:29.000000000 +0100
++++ qmidiarp/man/fr/qmidiarp.1 2012-01-31 00:36:54.165549461 +0100
+@@ -51,7 +51,7 @@
+ .SS "Fonctionnement Général"
+ Si aucune option est spécifiée au démarrage, QMidiArp utilise devient un
+ client JACK MIDI et cré un port d'entrée ainsi que deux ports de sortie.
+-Si l'on démarre QMidiArp avec l'option -a, le système MIDI est ALSA.
++Si l'on démarre QMidiArp avec l'option \-a, le système MIDI est ALSA.
+ En cliquant sur les boutons
+ .B Nouvel Arpège..., Nouveau LFO...
+ ou
+@@ -346,7 +346,7 @@
+ être arrêtée en cas de touches relachées, donc à la réception d'un signal
+ .B Note Off
+ à l'entrée avec le
+-.Canal
++.B Canal
+ correspondant.
+ .PP
+ .B "Le champ Sortie du LFO"
+Index: qmidiarp/man/qmidiarp.1
+===================================================================
+--- qmidiarp.orig/man/qmidiarp.1 2012-01-31 00:33:29.000000000 +0100
++++ qmidiarp/man/qmidiarp.1 2012-01-31 00:36:54.165549461 +0100
+@@ -49,7 +49,7 @@
+ .SS "General Operation"
+ When no commandline options are given, QMidiArp starts as a JACK MIDI
+ client with an input port and two output ports. For starting QMidiArp as
+-an ALSA client, use the -a option.
++an ALSA client, use the \-a option.
+ A new arpeggiator or LFO module can be created by
+ clicking one of the
+ .B Add Arp..., Add LFO...
+@@ -434,11 +434,11 @@
+ channel and port as the Seq module.
+
+ .SS "Settings"
+-The Settings window allows to configure if and to which port incoming
++The Settings window allows one to configure if and to which port incoming
+ events that do not match any module's input filter are forwarded (
+ .B unmatched
+ events). It also
+-allows to set whether incoming controller events are recognized for
++allows one to set whether incoming controller events are recognized for
+ muting and controlling
+ the modules separately. If this option is set, QMidiArp will recognize
+ MIDI control events that can be attributed to different parameters (see
diff -Nru qmidiarp-0.4.2/debian/patches/series qmidiarp-0.4.5/debian/patches/series
--- qmidiarp-0.4.2/debian/patches/series 1970-01-01 00:00:00.000000000 +0000
+++ qmidiarp-0.4.5/debian/patches/series 2012-01-31 00:03:44.000000000 +0000
@@ -0,0 +1,2 @@
+01-desktop-file.patch
+02-man-pages.patch
diff -Nru qmidiarp-0.4.2/Doxyfile qmidiarp-0.4.5/Doxyfile
--- qmidiarp-0.4.2/Doxyfile 2011-07-10 08:10:22.000000000 +0000
+++ qmidiarp-0.4.5/Doxyfile 2011-09-01 19:09:39.000000000 +0000
@@ -31,7 +31,7 @@
# This could be handy for archiving the generated documentation or
# if some version control system is used.
-PROJECT_NUMBER = 0.4.2
+PROJECT_NUMBER = 0.4.3
# Using the PROJECT_BRIEF tag one can provide an optional one line description
# for a project that appears at the top of each page and should give viewer
@@ -327,7 +327,7 @@
# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
# will be included in the documentation.
-EXTRACT_PRIVATE = YES
+EXTRACT_PRIVATE = NO
# If the EXTRACT_STATIC tag is set to YES all static members of a file
# will be included in the documentation.
@@ -375,7 +375,7 @@
# If set to NO (the default) these declarations will be included in the
# documentation.
-HIDE_FRIEND_COMPOUNDS = NO
+HIDE_FRIEND_COMPOUNDS = YES
# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any
# documentation blocks found inside the body of a function.
diff -Nru qmidiarp-0.4.2/examples/demo.qma qmidiarp-0.4.5/examples/demo.qma
--- qmidiarp-0.4.2/examples/demo.qma 2011-01-03 22:25:02.000000000 +0000
+++ qmidiarp-0.4.5/examples/demo.qma 1970-01-01 00:00:00.000000000 +0000
@@ -1,26 +0,0 @@
-0 0
-0 0 0
-Arp 1
-0 1
-0 127
-0 127
-0 0
-51 63 0
-d(012)>h(123)>d(012)hh(23)(42)(12)(43)>d012342
-EOP
-Arp 2
-0 1
-0 127
-0 127
-1 0
-59 70 0
-++01>h22
-EOP
-Arp 3
-0 1
-0 127
-0 127
-2 0
-38 67 0
--0-0+0-0h+0-0
-EOP
diff -Nru qmidiarp-0.4.2/examples/demo.qmax qmidiarp-0.4.5/examples/demo.qmax
--- qmidiarp-0.4.2/examples/demo.qmax 1970-01-01 00:00:00.000000000 +0000
+++ qmidiarp-0.4.5/examples/demo.qmax 2011-11-20 16:28:38.000000000 +0000
@@ -0,0 +1,115 @@
+
+
+
+
+ 100
+
+ 1
+ 0
+ 0
+ 0
+ 1
+
+
+ 0
+ 0
+ 0
+
+
+
+
+
+
+ d(012)>h(123)>d(012)<d(234)>hh(23)(42)(12)(43)>d012342
+ 1
+ 0
+ 0
+
+
+ 0
+ 0
+ 127
+ 0
+ 127
+
+
+
+ 51
+ 63
+ 0
+
+
+ 0
+ 0
+
+
+
+
+
+ ++01>h2<d3h4d3>2
+ 1
+ 0
+ 0
+
+
+ 0
+ 0
+ 127
+ 0
+ 127
+
+
+
+ 59
+ 70
+ 0
+
+
+ 0
+ 0
+
+
+
+
+
+ -0-0+0-0h+0-0
+ 1
+ 0
+ 0
+
+
+ 0
+ 0
+ 127
+ 0
+ 127
+
+
+
+ 38
+ 67
+ 0
+
+
+ 0
+ 0
+
+
+
+
+
+ 000000ff00000000fd00000002000000020000024900000105fc0100000008fc00000000000002520000000000fffffffa000000000200000001fb0000000a005300650071003a00310100000000ffffffff0000000000000000fc00000000000002280000000000fffffffa000000000100000001fb0000000a005300650071003a00330100000000ffffffff0000000000000000fb0000000a005300650071003a0032010000022e000002280000000000000000fc00000000000002420000000000fffffffa000000010100000002fb0000001800670072006f006f0076006500570069006400670065007402000000430000003e0000015700000088fb0000000a004c0046004f003a00320100000000ffffffff0000000000000000fb0000000a004100720070003a00320100000225000001540000000000000000fb0000000a004100720070003a00310100000000000002520000000000000000fb0000000a004c0046004f003a00310100000000000002520000000000000000fc00000000000002490000016a00fffffffa000000000100000003fb00000014004100720070003a0020004100720070002000310100000000ffffffff0000016a00fffffffb00000014004100720070003a0020004100720070002000320100000000ffffffff0000016a00fffffffb00000014004100720070003a0020004100720070002000330100000000ffffffff0000016a00ffffff0000000300000379000000e6fc0100000002fb00000012006c006f0067005700690064006700650074020000000c0000012100000194000001a9fb00000014007000610073007300570069006400670065007402000002b80000005800000190000000c8000002490000000100000004000000040000000800000008fc0000000100000002000000020000001600660069006c00650054006f006f006c0042006100720100000000ffffffff00000000000000000000001c0063006f006e00740072006f006c0054006f006f006c0042006100720100000084ffffffff0000000000000000
+
+
diff -Nru qmidiarp-0.4.2/examples/demo_up_down.qma qmidiarp-0.4.5/examples/demo_up_down.qma
--- qmidiarp-0.4.2/examples/demo_up_down.qma 2011-01-03 22:25:02.000000000 +0000
+++ qmidiarp-0.4.5/examples/demo_up_down.qma 1970-01-01 00:00:00.000000000 +0000
@@ -1,34 +0,0 @@
-0 0
-0 0 0
-Arp 1
-0 1
-0 127
-0 127
-0 0
-51 70 100
->>01
-EOP
-Arp 2
-0 2
-0 127
-0 127
-0 0
-30 80 100
->-0
-EOP
-Arp 3
-0 1
-0 127
-0 127
-0 0
-30 90 100
->>>++02
-EOP
-Arp 4
-0 0
-0 127
-0 127
-0 0
-20 70 100
---0011
-EOP
diff -Nru qmidiarp-0.4.2/examples/demo_up_down.qmax qmidiarp-0.4.5/examples/demo_up_down.qmax
--- qmidiarp-0.4.2/examples/demo_up_down.qmax 1970-01-01 00:00:00.000000000 +0000
+++ qmidiarp-0.4.5/examples/demo_up_down.qmax 2011-11-20 16:28:57.000000000 +0000
@@ -0,0 +1,145 @@
+
+
+
+
+ 100
+
+ 1
+ 0
+ 0
+ 0
+ 1
+
+
+ 0
+ 0
+ 0
+
+
+
+
+
+
+ >>01
+ 1
+ 0
+ 0
+
+
+ 0
+ 0
+ 127
+ 0
+ 127
+
+
+
+ 51
+ 70
+ 100
+
+
+ 0
+ 0
+
+
+
+
+
+ >-0
+ 2
+ 0
+ 0
+
+
+ 0
+ 0
+ 127
+ 0
+ 127
+
+
+
+ 30
+ 80
+ 100
+
+
+ 0
+ 0
+
+
+
+
+
+ >>>++02
+ 1
+ 0
+ 0
+
+
+ 0
+ 0
+ 127
+ 0
+ 127
+
+
+
+ 30
+ 90
+ 100
+
+
+ 0
+ 0
+
+
+
+
+
+ --0011
+ 0
+ 0
+ 0
+
+
+ 0
+ 0
+ 127
+ 0
+ 127
+
+
+
+ 20
+ 70
+ 100
+
+
+ 0
+ 0
+
+
+
+
+
+ 000000ff00000000fd00000002000000020000024900000140fc0100000008fc00000000000002520000000000fffffffa000000000200000001fb0000000a005300650071003a00310100000000ffffffff0000000000000000fc00000000000002280000000000fffffffa000000000100000001fb0000000a005300650071003a00330100000000ffffffff0000000000000000fb0000000a005300650071003a0032010000022e000002280000000000000000fc00000000000002420000000000fffffffa000000010100000002fb0000001800670072006f006f0076006500570069006400670065007402000000430000003e0000015700000088fb0000000a004c0046004f003a00320100000000ffffffff0000000000000000fb0000000a004100720070003a00320100000225000001540000000000000000fb0000000a004100720070003a00310100000000000002520000000000000000fb0000000a004c0046004f003a00310100000000000002520000000000000000fc00000000000002490000016a00fffffffa000000000100000004fb00000014004100720070003a0020004100720070002000310100000000ffffffff0000016a00fffffffb00000014004100720070003a0020004100720070002000320100000000ffffffff0000016a00fffffffb00000014004100720070003a0020004100720070002000330100000000ffffffff0000016a00fffffffb00000014004100720070003a0020004100720070002000340100000000ffffffff0000016a00ffffff0000000300000379000000e6fc0100000002fb00000012006c006f0067005700690064006700650074020000000c0000012100000194000001a9fb00000014007000610073007300570069006400670065007402000002b80000005800000190000000c8000002490000000000000004000000040000000800000008fc0000000100000002000000020000001600660069006c00650054006f006f006c0042006100720100000000ffffffff00000000000000000000001c0063006f006e00740072006f006c0054006f006f006c0042006100720100000084ffffffff0000000000000000
+
+
diff -Nru qmidiarp-0.4.2/examples/Makefile.am qmidiarp-0.4.5/examples/Makefile.am
--- qmidiarp-0.4.2/examples/Makefile.am 2011-01-03 22:25:02.000000000 +0000
+++ qmidiarp-0.4.5/examples/Makefile.am 2011-11-20 16:30:43.000000000 +0000
@@ -2,5 +2,5 @@
examplesdatadir = $(pkgdatadir)/examples
dist_examplesdata_DATA = \
- demo.qma demo_up_down.qma old_arp.qma demo_seqlfo.qmax \
+ demo.qmax demo_up_down.qmax old_arp.qmax demo_seqlfo.qmax \
demo_seqlfo2.qmax
diff -Nru qmidiarp-0.4.2/examples/Makefile.in qmidiarp-0.4.5/examples/Makefile.in
--- qmidiarp-0.4.2/examples/Makefile.in 2011-07-09 15:48:16.000000000 +0000
+++ qmidiarp-0.4.5/examples/Makefile.in 2012-01-21 17:28:56.000000000 +0000
@@ -1,9 +1,9 @@
-# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# Makefile.in generated by automake 1.11.2 from Makefile.am.
# @configure_input@
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
-# Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+# Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
@@ -69,6 +69,12 @@
am__base_list = \
sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
am__installdirs = "$(DESTDIR)$(examplesdatadir)"
DATA = $(dist_examplesdata_DATA)
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -200,7 +206,7 @@
top_srcdir = @top_srcdir@
examplesdatadir = $(pkgdatadir)/examples
dist_examplesdata_DATA = \
- demo.qma demo_up_down.qma old_arp.qma demo_seqlfo.qmax \
+ demo.qmax demo_up_down.qmax old_arp.qmax demo_seqlfo.qmax \
demo_seqlfo2.qmax
all: all-am
@@ -253,9 +259,7 @@
@$(NORMAL_UNINSTALL)
@list='$(dist_examplesdata_DATA)'; test -n "$(examplesdatadir)" || list=; \
files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
- test -n "$$files" || exit 0; \
- echo " ( cd '$(DESTDIR)$(examplesdatadir)' && rm -f" $$files ")"; \
- cd "$(DESTDIR)$(examplesdatadir)" && rm -f $$files
+ dir='$(DESTDIR)$(examplesdatadir)'; $(am__uninstall_files_from_dir)
tags: TAGS
TAGS:
@@ -310,10 +314,15 @@
installcheck: installcheck-am
install-strip:
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- `test -z '$(STRIP)' || \
- echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
mostlyclean-generic:
clean-generic:
diff -Nru qmidiarp-0.4.2/examples/old_arp.qma qmidiarp-0.4.5/examples/old_arp.qma
--- qmidiarp-0.4.2/examples/old_arp.qma 2011-01-03 22:25:02.000000000 +0000
+++ qmidiarp-0.4.5/examples/old_arp.qma 1970-01-01 00:00:00.000000000 +0000
@@ -1,10 +0,0 @@
-0 0
-0 0 0
-Arp 1
-0 1
-0 127
-0 127
-0 1
-0 0 0
->>///////0\\\\\0+//////0\\\\\\\-00+0-00+0-00+0-00+0-0
-EOP
diff -Nru qmidiarp-0.4.2/examples/old_arp.qmax qmidiarp-0.4.5/examples/old_arp.qmax
--- qmidiarp-0.4.2/examples/old_arp.qmax 1970-01-01 00:00:00.000000000 +0000
+++ qmidiarp-0.4.5/examples/old_arp.qmax 2011-11-20 16:29:47.000000000 +0000
@@ -0,0 +1,55 @@
+
+
+
+
+ 100
+
+ 1
+ 0
+ 0
+ 0
+ 1
+
+
+ 0
+ 0
+ 0
+
+
+
+
+
+
+ >>///////0\\\\\0+//////0\\\\\\\-00+0-00+0-00+0-00+0-0
+ 1
+ 0
+ 0
+
+
+ 0
+ 0
+ 127
+ 0
+ 127
+
+
+
+ 0
+ 0
+ 0
+
+
+ 0
+ 0
+
+
+
+
+
+ 000000ff00000000fd0000000200000002000001c6000000edfc0100000009fc00000000000002520000000000fffffffa000000000200000001fb0000000a005300650071003a00310100000000ffffffff0000000000000000fc00000000000002280000000000fffffffa000000000100000001fb0000000a005300650071003a00330100000000ffffffff0000000000000000fb0000000a005300650071003a0032010000022e000002280000000000000000fc00000000000002420000000000fffffffa000000010100000002fb0000001800670072006f006f0076006500570069006400670065007402000000430000003e0000015700000088fb0000000a004c0046004f003a00320100000000ffffffff0000000000000000fb0000000a004100720070003a00320100000225000001540000000000000000fb0000000a004100720070003a00310100000000000002520000000000000000fb0000000a004c0046004f003a00310100000000000002520000000000000000fc00000000000002490000000000fffffffa000000000100000002fb00000014004100720070003a0020004100720070002000320100000000ffffffff0000000000000000fb00000014004100720070003a0020004100720070002000330100000000ffffffff0000000000000000fb00000014004100720070003a0020004100720070002000310100000000000001c60000016a00ffffff0000000300000379000000e6fc0100000002fb00000012006c006f0067005700690064006700650074020000000c0000012100000194000001a9fb00000014007000610073007300570069006400670065007402000002b80000005800000190000000c8000001c60000000000000004000000040000000800000008fc0000000100000002000000020000001600660069006c00650054006f006f006c0042006100720100000000ffffffff00000000000000000000001c0063006f006e00740072006f006c0054006f006f006c0042006100720100000084ffffffff0000000000000000
+
+
diff -Nru qmidiarp-0.4.2/Makefile.in qmidiarp-0.4.5/Makefile.in
--- qmidiarp-0.4.2/Makefile.in 2011-07-09 15:48:16.000000000 +0000
+++ qmidiarp-0.4.5/Makefile.in 2012-01-21 17:28:56.000000000 +0000
@@ -1,9 +1,9 @@
-# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# Makefile.in generated by automake 1.11.2 from Makefile.am.
# @configure_input@
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
-# Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+# Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
@@ -109,6 +109,12 @@
am__base_list = \
sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
am__installdirs = "$(DESTDIR)$(applicationsdir)" \
"$(DESTDIR)$(svgdatadir)"
DATA = $(dist_applications_DATA) $(dist_svgdata_DATA)
@@ -155,6 +161,8 @@
DIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.bz2
GZIP_ENV = --best
distuninstallcheck_listfiles = find . -type f -print
+am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
+ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
distcleancheck_listfiles = find . -type f -print
ACLOCAL = @ACLOCAL@
AMTAR = @AMTAR@
@@ -318,7 +326,7 @@
all: all-recursive
.SUFFIXES:
-am--refresh:
+am--refresh: Makefile
@:
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/aminclude.am $(am__configure_deps)
@for dep in $?; do \
@@ -369,9 +377,7 @@
@$(NORMAL_UNINSTALL)
@list='$(dist_applications_DATA)'; test -n "$(applicationsdir)" || list=; \
files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
- test -n "$$files" || exit 0; \
- echo " ( cd '$(DESTDIR)$(applicationsdir)' && rm -f" $$files ")"; \
- cd "$(DESTDIR)$(applicationsdir)" && rm -f $$files
+ dir='$(DESTDIR)$(applicationsdir)'; $(am__uninstall_files_from_dir)
install-dist_svgdataDATA: $(dist_svgdata_DATA)
@$(NORMAL_INSTALL)
test -z "$(svgdatadir)" || $(MKDIR_P) "$(DESTDIR)$(svgdatadir)"
@@ -389,9 +395,7 @@
@$(NORMAL_UNINSTALL)
@list='$(dist_svgdata_DATA)'; test -n "$(svgdatadir)" || list=; \
files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
- test -n "$$files" || exit 0; \
- echo " ( cd '$(DESTDIR)$(svgdatadir)' && rm -f" $$files ")"; \
- cd "$(DESTDIR)$(svgdatadir)" && rm -f $$files
+ dir='$(DESTDIR)$(svgdatadir)'; $(am__uninstall_files_from_dir)
# This directory's subdirectories are mostly independent; you can cd
# into them and run `make' without going through this Makefile.
@@ -599,7 +603,7 @@
tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
$(am__remove_distdir)
dist-bzip2: distdir
- tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
+ tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
$(am__remove_distdir)
dist-lzma: distdir
@@ -607,7 +611,7 @@
$(am__remove_distdir)
dist-xz: distdir
- tardir=$(distdir) && $(am__tar) | xz -c >$(distdir).tar.xz
+ tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz
$(am__remove_distdir)
dist-tarZ: distdir
@@ -625,7 +629,7 @@
dist dist-all: distdir
tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
- tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
+ tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
$(am__remove_distdir)
# This target untars the dist file and tries a VPATH configuration. Then
@@ -658,6 +662,7 @@
&& am__cwd=`pwd` \
&& $(am__cd) $(distdir)/_build \
&& ../configure --srcdir=.. --prefix="$$dc_install_base" \
+ $(AM_DISTCHECK_CONFIGURE_FLAGS) \
$(DISTCHECK_CONFIGURE_FLAGS) \
&& $(MAKE) $(AM_MAKEFLAGS) \
&& $(MAKE) $(AM_MAKEFLAGS) dvi \
@@ -686,8 +691,16 @@
list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
distuninstallcheck:
- @$(am__cd) '$(distuninstallcheck_dir)' \
- && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
+ @test -n '$(distuninstallcheck_dir)' || { \
+ echo 'ERROR: trying to run $@ with an empty' \
+ '$$(distuninstallcheck_dir)' >&2; \
+ exit 1; \
+ }; \
+ $(am__cd) '$(distuninstallcheck_dir)' || { \
+ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \
+ exit 1; \
+ }; \
+ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \
|| { echo "ERROR: files left after uninstall:" ; \
if test -n "$(DESTDIR)"; then \
echo " (check DESTDIR support)"; \
@@ -721,10 +734,15 @@
installcheck: installcheck-recursive
install-strip:
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- `test -z '$(STRIP)' || \
- echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
mostlyclean-generic:
clean-generic:
diff -Nru qmidiarp-0.4.2/man/de/Makefile.in qmidiarp-0.4.5/man/de/Makefile.in
--- qmidiarp-0.4.2/man/de/Makefile.in 2011-07-09 15:48:16.000000000 +0000
+++ qmidiarp-0.4.5/man/de/Makefile.in 2012-01-21 17:28:56.000000000 +0000
@@ -1,9 +1,9 @@
-# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# Makefile.in generated by automake 1.11.2 from Makefile.am.
# @configure_input@
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
-# Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+# Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
@@ -69,6 +69,12 @@
am__base_list = \
sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
am__installdirs = "$(DESTDIR)$(deman1datadir)"
DATA = $(dist_deman1data_DATA)
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -250,9 +256,7 @@
@$(NORMAL_UNINSTALL)
@list='$(dist_deman1data_DATA)'; test -n "$(deman1datadir)" || list=; \
files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
- test -n "$$files" || exit 0; \
- echo " ( cd '$(DESTDIR)$(deman1datadir)' && rm -f" $$files ")"; \
- cd "$(DESTDIR)$(deman1datadir)" && rm -f $$files
+ dir='$(DESTDIR)$(deman1datadir)'; $(am__uninstall_files_from_dir)
tags: TAGS
TAGS:
@@ -307,10 +311,15 @@
installcheck: installcheck-am
install-strip:
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- `test -z '$(STRIP)' || \
- echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
mostlyclean-generic:
clean-generic:
diff -Nru qmidiarp-0.4.2/man/de/qmidiarp.1 qmidiarp-0.4.5/man/de/qmidiarp.1
--- qmidiarp-0.4.2/man/de/qmidiarp.1 2011-06-03 14:24:46.000000000 +0000
+++ qmidiarp-0.4.5/man/de/qmidiarp.1 2011-12-22 09:13:38.000000000 +0000
@@ -1,4 +1,4 @@
-.\"
+.\"
.\" Handbuchseite für qmidiarp
.\" zu bearbeiten mit:
.\" groff -man -Tascii qmidiarp.1 | less
@@ -6,7 +6,7 @@
.\" Eine Druckform kann erzeugt werden mit:
.\" groff -t -e -mandoc -Tps qmidiarp.1 > qmidiarp.ps
.\"
-.TH QMIDIARP 1 2009-11-20
+.TH QMIDIARP 1 2011-11-10
.SH NAME
qmidiarp \- MIDI Arpeggiator, Sequenzer und LFO
@@ -14,18 +14,19 @@
.br
.B qmidiarp
[\fIOPTION\fR] [\fIfile\fR]
-.br
+.br
.B qmidiarp
{
-.B \-\-help
-|
+.B \-\-help
+|
.B \-\-version
}
.SH BESCHREIBUNG
QMidiArp
-ist ein erweiterter Arpeggiator, Stepsequenzer und MIDI LFO für den
-ALSA-Sequenzer. Er kann beliebig viele Module parallel ausführen.
+ist ein erweiterter Arpeggiator, Stepsequenzer und MIDI LFO. Er kann
+beliebig viele Module parallel ausführen. QMidiArp läuft je nach option
+entweder mit JACK MIDI oder ALSA MIDI.
Die Arpeggiatormodule erzeugen Sequenzen in Abhängigkeit von den Noten,
die üblicherweise von einem MIDI-Keyboard oder einem Sequenzer an deren
Eingang geschickt werden. Die Stepsequenzermodule sind angelehnt an die
@@ -35,45 +36,50 @@
Dauer. Jedes Modul besitzt ein Filter für eingehende Noten und sein
Ausgabeport bzw. Ausgabekanal kann frei eingestellt werden.
Da die Module auf einer gemeinsamen Sequenzerschiene arbeiten, sind sie
-automatisch zueinander synchron. QMidiArp arbeitet mit einer
-internen Zeitauflösung von 192 ticks per beat.
+automatisch zueinander synchron. QMidiArp arbeitet mit einer
+internen Zeitauflösung von 192 ticks per beat.
Die Queue kann mit einer externen MIDI-Echtzeituhr oder mit JACK Transport
synchronisiert werden.
-QMidiArp verfügt ebenso über ein Protokoll-Werkzeug, welches eingehende
+QMidiArp verfügt ebenso über ein Protokoll-Werkzeug, welches eingehende
MIDI Ereignisse abhängig von ihrem Typ in verschiedenen Farben darstellt.
QMidiArp benutzt den Qt4 Toolkit.
.SS "Allgemeine Funktion"
+Wenn keine Startoptionen angegeben werden, startet QMidiArp als JACK MIDI
+client mit einem MIDI-Eingang und zwei MIDI-Ausgängen. Durch die -a
+Option wird QMidiArp als ALSA client gestartet.
+
Ein neuer Arpeggiator, Sequenzer oder LFO wird erzeugt durch Klicken auf
.B Modul-->Neuer Arp..., Modul-->Neuer Sequenzer...,
-oder
-.B Modul-->Neuer LFO...
-in der Werkzeugleiste oder im Menu
+oder
+.B Modul-->Neuer LFO...
+in der Werkzeugleiste oder im Menu
.I Modul.
Ein neuer Reiter mit dem gewählten Modul erscheint im Hauptbedienfenster.
-Module können mit den entsprechenden Symbolen der Werkzeugleiste oder
+Module können mit den entsprechenden Symbolen der Werkzeugleiste oder
Menüfunktionen umbenannt oder gelöscht werden. Die Module können vom
Hauptfenster gelöst und parallel dargestellt und gesteuert werden. Hierzu
klickt man auf das Symbol rechts oben in der Titelleiste jedes Moduls.
Durch erneutes klicken dieses Symbols werden die Module wieder in die
Reiterleiste eingefügt. Die Module können auch nebeneinander im Hauptfenster
-angeordnet werden, wenn man das Hauptfenster vor dem Einfügen eines
+angeordnet werden, wenn man das Hauptfenster vor dem Einfügen eines
Moduls genügend vergrößert.
Alle Einstellungen (d.h. alle Module, deren Parameter sowie
alle sonstigen Änderungen, die unter
.B Ansicht-->Einstellungen
-getätigt wurden) können in einer QMidiArp-XML-Datei (.qmax) gespeichert
-und von dort wieder geladen werden. Das
-.B Tempo
+getätigt wurden) können in einer QMidiArp-XML-Datei (.qmax) gespeichert
+und von dort wieder geladen werden. Das
+.B Tempo
kann in beats pro Minute (BPM) eingestellt werden und
gilt für alle Module. Die Queue wird mit dem blauen Pfeilsymbol
gestartet/gestoppt.
-.SS "MIDI-Clock-Betrieb"
-QMidiArp kann eingehende MIDI-Realtime-Clock Signale als Taktquelle
+.SS "MIDI-Clock-Betrieb" (nur mit ALSA MIDI verfügbar)
+Im ALSA MIDI Modus benutzt QMidiArp sein eigenes Timing, kann aber
+wahlweise eingehende MIDI-Realtime-Clock Signale als Taktquelle
und Start/Stop-Signale verwenden.
Sobald der
-.B "MIDI-Uhr"-Knopf
+.B "MIDI-Uhr"-Knopf
rechts vom Tempo-Wahlfeld betätigt wird, wird der ALSA-Sequenzer
gestoppt und
QMidiArp
@@ -81,39 +87,39 @@
die an QMidiArp's MIDI-Eingang angeschlossen wurde. Sobald dieses
Signal eintrifft, wird die Sequenzerzeugung mit der MIDI-Taktvorgabe der
externen Quelle gestartet.
-Der Sequenzer/Arpeggiator hält an, sobald ein
+Der Sequenzer/Arpeggiator hält an, sobald ein
"MIDI Clock Stop"\-Signal empfangen wird. Während des
-"MIDI-Clock-Betriebs" sind die QMidiArp-eigenen Start/Stop-Funktionen
-sowie das Hinzufügen oder Laden weiterer Module gesperrt. Sie werden
-erst bei erneutem Klick auf das MIDI-Uhrsymbol wieder verfügbar. Die
-Synchronisation mit der externen Quelle funktioniert am besten, wenn das
-.B Tempo
-von QMidiArp mit dem der externen Quelle übereinstimmt. Das externe
-Tempo wird jedoch bei laufendem Sequenzer gemessen, sodaß ab dem
-zweiten Start die Synchronisation funktioniert, auch wenn das
+"MIDI-Clock-Betriebs" sind die QMidiArp-eigenen Start/Stop-Funktionen
+sowie das Hinzufügen oder Laden weiterer Module gesperrt. Sie werden
+erst bei erneutem Klick auf das MIDI-Uhrsymbol wieder verfügbar. Die
+Synchronisation mit der externen Quelle funktioniert am besten, wenn das
+.B Tempo
+von QMidiArp mit dem der externen Quelle übereinstimmt. Das externe
+Tempo wird jedoch bei laufendem Sequenzer gemessen, sodaß ab dem
+zweiten Start die Synchronisation funktioniert, auch wenn das
ursprüngliche Tempo nicht übereinstimmt.
.SS "JACK Transport Client-Betrieb"
-Wird das
-.B Jack Transport Connect
+Wird das
+.B Jack Transport Connect
Icon angeklickt, so versucht QMidiArp eine Verbindung mit einem laufenden
JACK server. Wenn diese gelingt, agiert QMidiArp als Jack Transport Client,
d.h. das Tempo und die Synchronisierung wird von einem JACK Transport
Master bereitgestellt. Hierbei startet QMidiArp seinen eigenen Sequenzer
-neu bei jedem Jack Transport Start, unabhängig von der anfänglichen
+neu bei jedem Jack Transport Start, unabhängig von der anfänglichen
Transportposition. Dies gilt ebenfalls bei einer Schleife des JACK
Transportbandes. Der Jack Betrieb wird automatisch deaktiviert, wenn kein
-Jack server gefunden werden kann.
+Jack server gefunden werden kann.
.PP
-Bemerkung: Die Zustände der MIDI Clock and Jack Transport Modi werden
-beim Abspeichern in der QMidiArp Session Datei mit abgespeichert und
-beim Öffnen dieser wiederhergestellt.
+Bemerkung: Die Zustände der MIDI Clock and Jack Transport Modi werden
+beim Abspeichern in der QMidiArp Session Datei mit abgespeichert und
+beim Öffnen dieser wiederhergestellt.
.SS "Arpeggiatormodule"
QMidiArp's Arpeggiatormodule können komplexe Sequenzen produzieren, die von
den auf dem Keyboard gespielten Noten abgeleitet werden. Die entstehende
Sequenz hängt vom Arpeggio-Muster und von den Modulparametern ab. QMidiArp's
-Arpeggiatoren wurden inspiriert durch den MAP1 hardware Arpeggiator von
+Arpeggiatoren wurden inspiriert durch den MAP1 hardware Arpeggiator von
Rudi Linhard.
.PP
.B Eingangs- and Ausgangsfelder
@@ -123,30 +129,30 @@
und ein
.B Ausgangs-Feld.
Das Eingangsfeld definiert den Notenbereich und den MIDI-Kanal, für den
-der jeweilige Arp empfänglich sein soll.
+der jeweilige Arp empfänglich sein soll.
Noten, die dieses Filter passieren, werden nach Tonhöhe sortiert dem
internen Notenpuffer des Arpeggiators zugefügt.
Noten, die nicht vom Filter erfasst werden, können entweder verworfen oder
an einen bestimmten Port weitergeleitet werden (siehe
-.B Ansicht-->Einstellungen).
-Das Feld
-.B Ausgang
+.B Ansicht-->Einstellungen).
+Das Feld
+.B Ausgang
enthält die Einstellungen für
-.B MIDI-Kanal
+.B MIDI-Kanal
und
-.B Ausgabeport,
-an den der Arpeggiator seine Noten sendet.
+.B Ausgabeport,
+an den der Arpeggiator seine Noten sendet.
.PP
.B "Arpeggiator-Muster"
.PP
Arpeggio-Muster können im
.B Muster-
Feld gewählt und geändert werden. Bereits definierte
-.B Arpeggio-Vorlagen
+.B Arpeggio-Vorlagen
können via Drop-Down-Menü ausgewählt werden. Das gerade aktive Muster wird
im Stile einer "Piano-Stanzrolle" dargestellt, in der die Basisnoten als
Streifen erscheinen. Die Position der Streifen in vertikaler Richtung
-entspricht dem jeweiligen Notenwert. Oktavenübergänge (siehe
+entspricht dem jeweiligen Notenwert. Oktavenübergänge (siehe
.B Arpeggio-Vorlagen bearbeiten
) werden als hervorgehobenene horizontale Linien dargestellt. Die
tatsächlich gesendeten Noten hängen ab von den empfangenen Eingangsnoten.
@@ -154,13 +160,13 @@
Noten zugeordnet. Zum Beispiel bedeutet ein einzelner Streifen im unteren
Teil der Grafik ("Simple"\-Muster), daß beim ersten Durchlauf durch das
Muster die unterste empfangene Note gespielt wird.
-Wenn ein Akkord auf dem Keyboard gespielt wird, und nur eine Note im
-Muster definiert ist, wird beim ersten Durchlauf die unterste Note
+Wenn ein Akkord auf dem Keyboard gespielt wird, und nur eine Note im
+Muster definiert ist, wird beim ersten Durchlauf die unterste Note
gespielt und die Noten der folgenden Durchläufe von dem eingestellten
-"Wiederholungsmodus" bestimmt.
-Wenn das Muster mehrere übereinander liegende Streifen enthält
+"Wiederholungsmodus" bestimmt.
+Wenn das Muster mehrere übereinander liegende Streifen enthält
(Akkord-Modus), werden auf dem Keyboard gespielte Akkorde auch als
-Akkorde gesendet. Die maximale Polyphonie der gesendeten Akkorde
+Akkorde gesendet. Die maximale Polyphonie der gesendeten Akkorde
entspricht der Anzahl der übereinander liegenden Streifen.
.PP
.B Wiederholungsmodus
@@ -168,22 +174,22 @@
Der
.B Wiederholungsmodus
bestimmt das Verhalten der Arpeggios über mehrere Durchläufe des
-Musters hinweg. Er ist entscheidend, wenn die Anzahl der auf dem Keyboard
+Musters hinweg. Er ist entscheidend, wenn die Anzahl der auf dem Keyboard
gespielten Noten die Anzahl der Noten im Muster übersteigt. Wenn
-"Aufsteigend" gewählt ist, wird bei jedem Durchlauf die nächst höhere
+"Aufsteigend" gewählt ist, wird bei jedem Durchlauf die nächst höhere
Note des Keyboard-Akkordes gespielt. Ist "Absteigend" gewählt, so wird
die nächst tiefere Note gespielt. Wenn nur eine Note im Muster vorhanden
-ist, erzeugt dies ein klassisches lineares Arpeggio. So kann man selbst
-mit einfachen Mustern wie "01" oder "0" ein komplettes Arpeggio leicht
+ist, erzeugt dies ein klassisches lineares Arpeggio. So kann man selbst
+mit einfachen Mustern wie "01" oder "0" ein komplettes Arpeggio leicht
erzeugen. Wenn der Wiederholungsmodus "Statisch" gewählt ist, ist
dieser klassische Arpeggio-Modus deaktiviert, und die gesendeten Noten
-bleiben konstant.
+bleiben konstant.
.PP
.B "Triggermodus (Verhalten bei neuer Stakato-Note)"
.PP
-QMidiArp's Arpeggiatoren besitzen drei Startmodi. Steht der Modus auf
+QMidiArp's Arpeggiatoren besitzen drei Startmodi. Steht der Modus auf
"Durchspielen", so läuft die Sequenz synchron zur internen oder externen
-Uhr ununterbrochen weiter, unabhängig von dem Moment, in dem neue Tasten
+Uhr ununterbrochen weiter, unabhängig von dem Moment, in dem neue Tasten
gedrückt werden. Bei "Neustart" wird die Sequenzposition zum Start
zurückgeschickt, wenn eine neue Taste stakato gespielt wird. Dies
geschieht aber ohne das Timing des Sequenzers zu beeinflussen. Nur im
@@ -194,7 +200,7 @@
.PP
Die Arpeggio-Muster sind durch eine Text-Sequenz definiert, die einerseits
die Noten selbst als Zahlen von 0...9 enthält, aber andererseits auch
-Steuersymbole zur Änderung von Tempo, Anschlagsdynamik, Oktave und
+Steuersymbole zur Änderung von Tempo, Anschlagsdynamik, Oktave und
Akkord-Modus. Durch Anwählen des Symbols
.B Muster bearbeiten
im Muster-Feld macht man das momentane Muster als Text sichtbar und
@@ -207,9 +213,9 @@
.B Muster löschen
Symbols aus der Liste entfernt werden.
Alle Muster-Vorlagen werden beim Speichern eines neuen Musters unmittelbar
-in die .qmidiarprc Ressourcen-Datei geschrieben, und eventuell vorhandenen
-weiteren Arpeggiatoren in der Reiterleiste zur Verfügung gestellt.
-Die Vorlagenliste wird beim Starten von QMidiArp geladen.
+in die .qmidiarprc Ressourcen-Datei geschrieben, und eventuell vorhandenen
+weiteren Arpeggiatoren in der Reiterleiste zur Verfügung gestellt.
+Die Vorlagenliste wird beim Starten von QMidiArp geladen.
Die Syntax des Muster-Textes ist folgende:
@@ -220,8 +226,8 @@
> : doppeltes Tempo
< : halbes Tempo
. : Standard-Tempo
-( ) : Beginn und Ende des Akkord Modus,
- z.B. erzeugt (012) einen Akkord der untersten drei Noten
+ ( ) : Beginn und Ende des Akkord Modus,
+ z.B. erzeugt (012) einen Akkord der untersten drei Noten
/ : Anschlag erhöhen um 20%
\\ : Anschlag senken um 20%
d : doppelte Notenlänge
@@ -230,37 +236,37 @@
Die Wirkung Steuersymbole bleibt bis zum Ende eines Muster-Durchlaufes
bestehen. Das Symbol > erhöht zum Beispiel das Tempo aller folgenden
-Noten im Muster bis zu seinem Ende. Beim nächsten Durchlauf des Musters
+Noten im Muster bis zu seinem Ende. Beim nächsten Durchlauf des Musters
wird das Tempo dann wieder auf seinen Ausgangswert (Viertelnoten)
-geschaltet.
+geschaltet.
.PP
.B Zufallsfunktion
.PP
Das Timing, der Anschlag und die Länge der gesendeten Noten können mit
-Hilfe der Zufallsfunktionen zu Abweichungen gebracht werden. Diese
+Hilfe der Zufallsfunktionen zu Abweichungen gebracht werden. Diese
werden mit den entsprechenden Reglern im Feld
.B Zufall
eingestellt. Man kann dadurch den Arpeggiator weniger mechanisch
-klingen lassen. Bei höheren Werten erzeugt man interessante Akzente
-innerhalb der Muster.
+klingen lassen. Bei höheren Werten erzeugt man interessante Akzente
+innerhalb der Muster.
.PP
.B Hüllkurve
.PP
-QMidiArp kann der Anschlagsdynamik der Arpeggios eine Hüllkurve
+QMidiArp kann der Anschlagsdynamik der Arpeggios eine Hüllkurve
überlagern, um langsame Übergänge von Akkordmustern zu erzeugen.
-Die Funktion dieser Hüllkurve wird durch
-.B Attack
+Die Funktion dieser Hüllkurve wird durch
+.B Attack
\-Zeit und
.B Release
\-Zeit definiert. Wird eine von Null verschiedene Attackzeit gewählt, so
-werden die Anschläge der gesendeten Noten während der Attackzeit von
+werden die Anschläge der gesendeten Noten während der Attackzeit von
Null bis zu ihrem eigentlichen Wert hochgefahren. Ist eine Releasezeit
-verschieden von Null eingestellt, so werden die losgelassenen Noten
-weiterhin gesendet, und ihre Anschlagsdynamik wird während der
-Releasezeit auf Null heruntergefahren. Erst dann wird die Note aus dem
-internen Puffer entfernt. Die Hüllkurven-Funktion hat nur dann Wirkung,
-wenn der angesteuerte Klang anschlagsempfindlich ist. Sie funktioniert
-am besten mit Mustern mit hoher Polyphonie, zum Beispiel "Chord Oct 16 A".
+verschieden von Null eingestellt, so werden die losgelassenen Noten
+weiterhin gesendet, und ihre Anschlagsdynamik wird während der
+Releasezeit auf Null heruntergefahren. Erst dann wird die Note aus dem
+internen Puffer entfernt. Die Hüllkurven-Funktion hat nur dann Wirkung,
+wenn der angesteuerte Klang anschlagsempfindlich ist. Sie funktioniert
+am besten mit Mustern mit hoher Polyphonie, zum Beispiel "Chord Oct 16 A".
.PP
.B Groove
.PP
@@ -268,13 +274,13 @@
.B Groove
\-Regler erlauben es, Noten innerhalb eines Taktes linear zu verschieben
in ihrer Zeit, Länge und ihrem Anschlag. Dies kann benutzt werden, um
-Swing-Rythmen und Akzente zu erzeugen, oder um den Akzent auf eine
-bestimmte Stelle jedes Taktes zu setzen. Die Groove-Einstellungen gelten
+Swing-Rythmen und Akzente zu erzeugen, oder um den Akzent auf eine
+bestimmte Stelle jedes Taktes zu setzen. Die Groove-Einstellungen gelten
für alle Arpeggios in der Reiterleiste.
.SS "LFO-Module"
Parallel zu den Arpeggiatoren kann QMidiArp auch MIDI-Steuerdaten in Form
-von Niederfrequenz-Oszillatoren (LFOs) an einen zugeordneten Ausgang
+von Niederfrequenz-Oszillatoren (LFOs) an einen zugeordneten Ausgang
schicken. Die LFO-Daten bestehen aus MIDI-Controller-Signalen, die mit
den Arpeggiator-Sequenzen synchron sind. Der Sequenzer muss gestartet
werden, damit die LFOs Daten produzieren. Jedes LFO-Modul hat ein
@@ -283,9 +289,9 @@
.B Ausgangs-
Feld, um den MIDI-Kanal, ALSA-Ausgangsport und die ID des zu erzeugenden
Controllers einzustellen. Die folgenden Wellenformen stehen im Moment
-zur Verfügung: Sinus, Sägezahn steigend, Dreieck, Sägezahn fallend,
-Rechteck und Frei.
-Die
+zur Verfügung: Sinus, Sägezahn steigend, Dreieck, Sägezahn fallend,
+Rechteck und Frei.
+Die
.B Frequenz
der LFOs wird in Vielfachen und Teilern des Sequenzer-
.B Tempos
@@ -294,16 +300,16 @@
als 1 gewählt werden, muss auch die
.B Länge
der Wellenform angepaßt werden, um eine volle Welle zu erzeugen. Die
-zeitliche
+zeitliche
.B Auflösung
-der LFOs bestimmt die Anzahl der Signale, die in jedem Vierteltakt
-ausgegeben werden. Die höchste Auflösung beträgt 192 Signale pro
+der LFOs bestimmt die Anzahl der Signale, die in jedem Vierteltakt
+ausgegeben werden. Die höchste Auflösung beträgt 192 Signale pro
Vierteltakt.
Niedrige Werte der
.B Auflösung
führen zu hörbar rythmischen Controller-Änderungen, während höhere
Auflösungen zu mehr und mehr kontinuierlichen Wellenformen führen.
-.B Amplitude
+.B Amplitude
und
.B Offset
der Wellenform können von 0...127 eingestellt werden.
@@ -313,7 +319,7 @@
.PP
Einzelne Punkte der Wellenform kann man mit der
.I rechten Maustaste
-stumm schalten. Stummgeschaltete Wellenform-Punkte erscheinen in
+stumm schalten. Stummgeschaltete Wellenform-Punkte erscheinen in
dunklerer Farbe.
.PP
.B Freie Wellenform
@@ -323,64 +329,90 @@
gewählt wird, kann die Wellenform mit der
.I linken Maustaste
in der Wellenform-Graphik gezeichnet werden. Beim Modifizieren einer
-errechneten Wellenform wird diese automatisch in die freie Form kopiert. Dies überschreibt die vorhergehende freie Wellenform mit
-der gerade dargestellten Form. Wie alle LFO-Funktionen kann auch das
+errechneten Wellenform wird diese automatisch in die freie Form kopiert.
+Dies überschreibt die vorhergehende freie Wellenform mit
+der gerade dargestellten Form. Wie alle LFO-Funktionen kann auch das
Zeichnen oder Stummschalten bei laufendem Sequenzer geschehen.
.PP
+.B Abspielrichtung und Wiederholungsmodus
+.PP
+Die folgenden Abspielmodi stehen zur Verfügung
+
+ ->_> : Vorwärts und wiederholen
+ <_<- : Rückwärts und wiederholen
+ ->_< : Hin und her und wiederholen
+ >_<- : Her und hin und wiederholen
+ ->_| : Forwärts Einzeldurchlauf
+ |_<- : Rückwärts Einzeldurchlauf
+
+Die Änderungen des Abspielmodus werden sofort angewandt.
+
+.PP
.B Aufnahme
.PP
-Controller-Daten, die das Filter im Eingang passieren, können
+Controller-Daten, die das Filter im Eingang passieren, können
kontinuierlich aufgezeichnet werden durch wählen des
.B Aufnehmen
Knopfes. Dieser Knopf ist selbst über MIDI ansteuerbar (siehe MIDI Learn)
und QMidiArp wird somit zu einem einfachen Control-Looper/Sampler.
-
+.PP
+.B LFO Eingangsfeld
+Im Eingangsfeld kann man den
+.B MIDI CC
+wählen der aufzunehmen ist. Man kann außerdem einstellen, wie der LFO
+auf eingehende Noten reagiert. So wie die Arpeggiatoren kann der
+LFO bei Notenempfang neugestartet oder getriggert werden, und die LFO
+Welle kann durch losgelassene Tasten gestoppt werden wenn
+.B Note Off
+Signal am Eingang mit dem entsprechenden
+.Kanal
+empfangen wird.
.PP
.B "LFO Ausgangs-Feld"
.PP
Das LFO Ausgangs-Feld enthält die Einstellungen für
-.B Ausgang,
+.B Ausgang,
.B Kanal
-und
-.B Controller
-ID der LFO-Daten jedes LFO-Reiters. Es erlaubt auch ein komplettes
-Stummschalten jedes LFOs durch Klicken des
-.B Stumm
+und
+.B Controller
+ID der LFO-Daten jedes LFO-Reiters. Es erlaubt auch ein komplettes
+Stummschalten jedes LFOs durch Klicken des
+.B Stumm
Knopfes.
.SS "Step-Sequenzer-Module"
Durch klicken auf
-.B "Neuer Sequenzer..."
+.B "Neuer Sequenzer..."
in der Werkzeugleiste wird ein neues
-.B Seq
+.B Seq
Modul hinzugefügt. Jedes dieser Module erzeugt eine einfache, lineare
und monophone Sequenz, ähnlich wie die ersten Hardware-Analogsequenzer.
-So wie die LFOs sind auch die Seq Module bei laufendem Sequenzer
-steuerbar, ebenfalls ähnlich einem analogen Stepsequenzer.
+So wie die LFOs sind auch die Seq Module bei laufendem Sequenzer
+steuerbar, ebenfalls ähnlich einem analogen Stepsequenzer.
.PP
.B Programmieren einer Sequenz
.PP
-So wie bei den LFO-Modulen, kann man Sequenzen programmieren, in dem man
-mit der linken Maustaste in der grafischen Darstellung jede Notenhöhe
+So wie bei den LFO-Modulen, kann man Sequenzen programmieren, in dem man
+mit der linken Maustaste in der grafischen Darstellung jede Notenhöhe
einstellt. Es steht ein Notenbereich von 4 Oktaven zur Verfügung, wobei
die niedrigste Note ein C2 ist, wenn die globale Stimmung auf Null steht.
-Die
+Die
.B Länge
der Sequenz kann zwischen 1 und 8 Vierteltakten liegen. Die
-zeitliche
-.B Auflösung
+zeitliche
+.B Auflösung
wird zwischen 1 und 16 Noten pro Vierteltakt eingestellt.
Eine Auflösung von 4 bedeutet daher, daß der Sequenzer Sechzehntel-Noten
spielt.
Eine Sequenz kann ebenfalls direkt über eine Tastatur eingegeben werden
-mit Hilfe der
+mit Hilfe der
.B Aufnahme
Funktion. Durch Anklicken des
.B Aufnahme
Knopfes werden auf einer angeschlossenen Tastatur gespielte Noten Schritt
-für Schritt aufgenommen, beginnend mit der zuletzt geänderten Note in
+für Schritt aufgenommen, beginnend mit der zuletzt geänderten Note in
der Sequenz. Hierzu muß der Noteneingang des Moduls aktiviert sein. Die
-Programmierung kann auch bei laufendem Sequenzer geschehen.
+Programmierung kann auch bei laufendem Sequenzer geschehen.
.PP
.B Regler für alle Noten
@@ -399,19 +431,19 @@
.B Eingangs-Feld
bestimmen, wie die über den einstellbaren MIDI-
.B Kanal
-empfangenen Noten verarbeitet werden. Wenn
+empfangenen Noten verarbeitet werden. Wenn
.B Note
-angekreuzt ist, wird die komplette Sequenz beim nächsten Durchlauf auf
+angekreuzt ist, wird die komplette Sequenz beim nächsten Durchlauf auf
die Tonhöhe der empfangenen Note transponiert. Wenn zusätzlich
.B Anschlag
angekreuzt ist, werden auch die Anschlagsdynamik-Daten der empfangenen
Noten auf die Sequenz übertragen, und die gesendeten Noten bekommen
dieselbe Anschlagsdynamik wie die auf der Tastatur gespielte Note.
-Weitere Optionen des Eingangsfeldes steuern das Start- und
-Stop-Verhalten der Sequenz beim Empfang von Noten.
+Weitere Optionen des Eingangsfeldes steuern das Start- und
+Stop-Verhalten der Sequenz beim Empfang von Noten.
.B Neustart
-verursacht ein Zurücksetzen der Sequenz an den Start, jedoch ohne den
-Rhythmus zu unterbrechen. Nur wenn
+verursacht ein Zurücksetzen der Sequenz an den Start, jedoch ohne den
+Rhythmus zu unterbrechen. Nur wenn
.B Trigger
angewählt ist, startet die Sequenz exakt mit dem Timing der angeschlagenen
Note.
@@ -425,7 +457,7 @@
.B Ausgangs-Feld
der Seq-Module ist das gleiche wie das der Arpeggiator- oder LFO-Module.
.PP
-Man kann die Sequenz mit Akzenten versehen, wenn man zusätzlich ein
+Man kann die Sequenz mit Akzenten versehen, wenn man zusätzlich ein
LFO-Modul aufbaut, welches an denselben Kanal und Ausgang zum Beispiel
Filterfrequenz-Controller schickt (CC#74).
@@ -434,16 +466,16 @@
diejenigen Signale weitergeleitet werden, die von keinem der Module
verarbeitet werden (
.B unpassende
-Signale). Hier wird auch bestimmt, ob empfangene MIDI Steuersignale
-(Control events) benutzt werden, um die Module zu steuern (siehe
+Signale). Hier wird auch bestimmt, ob empfangene MIDI Steuersignale
+(Control events) benutzt werden, um die Module zu steuern (siehe
B.MIDI-Steuerung). Durch Ankreuzen des Kästchens
.B Kompakte Darstellung der Module
-werden alle folgenden erzeugten Module in einer Platzsparenden Art
+werden alle folgenden erzeugten Module in einer Platzsparenden Art
dargestellt, um eine bessere Parallel-Darstellung auf dem Schreibtisch
zu ermöglichen.
.PP
-Die
-.B Einstellungen
+Die
+.B Einstellungen
werden zusammen mit den Moduldaten in der .qmax-Datei gespeichert.
.SS MIDI-Steuerung
@@ -451,23 +483,21 @@
.B Module steuerbar über MIDI Controller
im
.B Einstellungen
-Fenster aktiviert ist. Für die folgenden Parameter ist eine MIDI-Steuerung
-möglich. Seq-Module: Stummschaltung, Anschlag und Notenlänge. LFO-Module:
-Stummschaltung, Amplitude und Offset. Arp-Module: Stummschaltung.
+Fenster aktiviert ist.
.PP
.B Lernen von MIDI
.PP
-Die Steuerungen werden durch Rechtsklick auf ein entsprechendes
-Steuerelement zugeordnet. Durch Auswählen von
+Die Steuerungen werden durch Rechtsklick auf ein entsprechendes
+Steuerelement zugeordnet. Durch Auswählen von
.B Lernen von MIDI
wartet QMidiArp auf ein MIDI-Steuerungssignal, was zum Beispiel von einem
-angeschlossenen Controller gesendet wird. Das erste eingehende
+angeschlossenen Controller gesendet wird. Das erste eingehende
Steuerungssignal wird dann dem entsprechenden Element zugeordnet. Es
können auch mehrere MIDI-Steuerungen einem einzelnen Element zugeordnet
-werden.
-Wird
+werden.
+Wird
.B MIDI-Steuerungen vergessen
-ausgewählt, so werden alle Zuordnungen entfernt. Durch Auswahl von
+ausgewählt, so werden alle Zuordnungen entfernt. Durch Auswahl von
.B MIDI Lernen abbrechen
wird der Lernprozeß beendet.
.PP
@@ -475,57 +505,57 @@
interpretiert, d.h. bei jedem eingehenden Controller-Wert von 127 wird
der Stummschaltungsknopf umgeschaltet. Dies kann im
.B Steuerungseditor
-nachfolgend geändert werden.
+nachfolgend geändert werden.
.PP
.B Steuerungs-Editor
.PP
-Dieses Fenster wird durch Auswahl von
+Dieses Fenster wird durch Auswahl von
.B MIDI-Steuerungen
-im
+im
.I Ansicht
Menu geöffnet. Jede zugeordnete Steuerung kann in der dargestellten
Tabelle geändert oder entfernt werden. Die Stummschaltungs-Funktion
-hat hierbei eine Besonderheit. Wenn die min und max Werte
+hat hierbei eine Besonderheit. Wenn die min und max Werte
.I identisch
-sind, so wird die Stummschaltung
-.I umgeschaltet,
-wenn der eingestellte Wert von dem zugeordneten Controller übermittelt
-wird. Sind min und max voneinander
+sind, so wird die Stummschaltung
+.I umgeschaltet,
+wenn der eingestellte Wert von dem zugeordneten Controller übermittelt
+wird. Sind min und max voneinander
.I verschieden,
so wird das entsprechende Modul beim Eingehen des min-Wertes
-stummgeschaltet und bei Eingehen des max-Wertes lautgeschaltet.
+stummgeschaltet und bei Eingehen des max-Wertes lautgeschaltet.
.PP
Bei klicken auf
.B Entfernen
wird die ausgewählte Zeile aus der Tabelle entfernt.
.B Wiederherstellen
lädt die momentane Steuerungsbelegung neu.
-.B Cancel
-verläßt den Steuerungseditor und verwirft die Änderungen, und nur durch
+.B Cancel
+verläßt den Steuerungseditor und verwirft die Änderungen, und nur durch
klicken auf
.B OK
werden die Änderungen wirksam.
.SS "Protokoll"
Das Protokoll-Fenster zeichnet empfangene MIDI-Daten mit Zeitinformation
-auf und stellt diese als Liste dar.
-Das
-.I Protokoll
+auf und stellt diese als Liste dar.
+Das
+.I Protokoll
wird zu Beginn am unteren Ende des Programmfensters angezeigt und kann
verborgen oder als separates Fenster frei beweglich auf der
Arbeitsfläche platziert werden. Das Aufzeichnen der MIDI-Signale kann
generell abgeschaltet oder auch selektiv für Signale der MIDI-Echtzeituhr
-eingeschaltet werden.
+eingeschaltet werden.
.SS Beispieldateien
Es gibt zurzeit drei Beispiel-Arpeggios.
Das Arpeggio demo.qma ist ursprünglich für die folgende Klang-Auswahl
-gedacht: Ch 1: Marimba, Ch 2: Celesta, Ch 3: Acoustic Bass,
+gedacht: Ch 1: Marimba, Ch 2: Celesta, Ch 3: Acoustic Bass,
aber man kann interessante Ergebnisse auch mit einer anderen Instrument-
Belegung erhalten.
.PP
-Das demo_seqlfo.qmax Beispiel zeigt die parallele Benutzung der neuen
+Das demo_seqlfo.qmax Beispiel zeigt die parallele Benutzung der neuen
Sequenzer- und LFO-Module. Die Ausgänge sollten an perkussive Synthesizer
Sounds geschickt werden. Die LFOs sind für eine Filterfrequenz-Steuerung
vorgesehen, die über den MIDI-Standard-Controller #CC74 geschieht.
@@ -545,17 +575,20 @@
.BI \-\-version
Gibt die Programmversion aus und beendet das Programm.
.TP
+.BI \-\-alsa
+ALSA MIDI Treiber verwenden
+.TP
+.BI \-\-jack
+JACK MIDI Treiber verwenden (default)
+.TP
.B Datei
Name einer QMidiArp-Datei (.qmax) zu Öffnen beim Start des Programms.
.SH DATEIEN
.I *.qmax
.RS
-QMidiArp-XML-Dateien, enthalten Daten aller Module sowie Einstellungen
+QMidiArp-XML-Dateien, enthalten Daten aller Module sowie Einstellungen
im XML-Textformat.
-.RE
-.I *.qma
-.RS
-Ehemalige QMidiArp-Dateien in einem reinen Textformat.
+
.SH BEISPIELE
Eine Beispieldatei kann in einem der folgenden Verzeichnisse gefunden
werden:
@@ -563,13 +596,13 @@
oder
.I /usr/local/share/qmidiarp
.SH BEMERKUNGEN
-Fehler und Warnungen werden nach
+Fehler und Warnungen werden nach
.BR stderr (3)
geschrieben.
.SH UNTERSTÜTZUNG
qmidiarp-devel@lists.sourceforge.net
.SH AUTOREN
-Frank Kober and Guido Scholz, Matthias Nagorni. Das Original dieser
-Handbuchseite wurde von Frank Kober
+Frank Kober, Nedko Arnaudov, Guido Scholz, Matthias Nagorni. Das Original
+dieser Handbuchseite wurde von Frank Kober
geschrieben; die deutsche Übersetzung wurde von Robert Dietrich
angefertigt.
diff -Nru qmidiarp-0.4.2/man/fr/Makefile.in qmidiarp-0.4.5/man/fr/Makefile.in
--- qmidiarp-0.4.2/man/fr/Makefile.in 2011-07-09 15:48:16.000000000 +0000
+++ qmidiarp-0.4.5/man/fr/Makefile.in 2012-01-21 17:28:56.000000000 +0000
@@ -1,9 +1,9 @@
-# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# Makefile.in generated by automake 1.11.2 from Makefile.am.
# @configure_input@
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
-# Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+# Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
@@ -69,6 +69,12 @@
am__base_list = \
sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
am__installdirs = "$(DESTDIR)$(frman1datadir)"
DATA = $(dist_frman1data_DATA)
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -250,9 +256,7 @@
@$(NORMAL_UNINSTALL)
@list='$(dist_frman1data_DATA)'; test -n "$(frman1datadir)" || list=; \
files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
- test -n "$$files" || exit 0; \
- echo " ( cd '$(DESTDIR)$(frman1datadir)' && rm -f" $$files ")"; \
- cd "$(DESTDIR)$(frman1datadir)" && rm -f $$files
+ dir='$(DESTDIR)$(frman1datadir)'; $(am__uninstall_files_from_dir)
tags: TAGS
TAGS:
@@ -307,10 +311,15 @@
installcheck: installcheck-am
install-strip:
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- `test -z '$(STRIP)' || \
- echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
mostlyclean-generic:
clean-generic:
diff -Nru qmidiarp-0.4.2/man/fr/qmidiarp.1 qmidiarp-0.4.5/man/fr/qmidiarp.1
--- qmidiarp-0.4.2/man/fr/qmidiarp.1 2011-05-29 18:18:19.000000000 +0000
+++ qmidiarp-0.4.5/man/fr/qmidiarp.1 2011-12-22 09:14:38.000000000 +0000
@@ -1,4 +1,4 @@
-.\"
+.\"
.\" Page de manuel pour qmidiarp
.\" Traiter avec:
.\" groff -man -Tascii qmidiarp.1 | less
@@ -6,7 +6,7 @@
.\" Une version imprimable peut être obtenue par:
.\" groff -t -e -mandoc -Tps qmidiarp.1 > qmidiarp.ps
.\"
-.TH QMIDIARP 1 2009-11-06
+.TH QMIDIARP 1 2011-11-10
.SH NOM
qmidiarp \- Arpégiateur et LFO MIDI pour le séquenceur ALSA
@@ -14,51 +14,55 @@
.br
.B qmidiarp
[\fIOPTION\fR] [\fIfile\fR]
-.br
+.br
.B qmidiarp
{
-.B \-\-help
-|
+.B \-\-help
+|
.B \-\-version
}
.SH DESCRIPTION
QMidiArp
-est un arpégiateur, séquenceur linéaire programmable et oscillateur à
-basse fréquence (LFO) MIDI avancé pour le séquenceur ALSA. Un
-nombre illimité d'arpégiateurs, séquenceurs et LFOs peuvent être définis
-comme modules pour fonctionner en parallèle. Les modules arpégiateurs
+est un arpégiateur, séquenceur linéaire programmable et oscillateur à
+basse fréquence (LFO) MIDI avancé. Selon l'option choisi il utilise
+JACK MIDI ou ALSA MIDI. Un
+nombre illimité d'arpégiateurs, séquenceurs et LFOs peuvent être définis
+comme modules pour fonctionner en parallèle. Les modules arpégiateurs
produisent des séquences de notes dépendant des notes reçues sur leur
-port d'entrée, qui est typiquement connecté à un clavier MIDI ou un
-séquenceur. Les modules séquenceurs sont similaires aux premiers
+port d'entrée, qui est typiquement connecté à un clavier MIDI ou un
+séquenceur. Les modules séquenceurs sont similaires aux premiers
séquenceurs analogiques, linéaires, monophoniques et ajustables en étant
en marche. Les LFOs MIDI, de manière indépendante, produisent des
données de contrôleur MIDI avec forme d'onde, résolution temporelle,
amplitude et durée ajustables. Pour chaque module, un filtre d'entrée
-est disponible. Le port de sortie et le canal MIDI peuvent être
-attribués pour chaque module indépendamment. Puisque les modules
+est disponible. Le port de sortie et le canal MIDI peuvent être
+attribués pour chaque module indépendamment. Puisque les modules
utilisent un séquenceur commun, ils sont automatiquement synchronisés
entre eux. QMidiArp fonctionne avec une résolution interne de 192 ticks
-par quart de mesure (beat). La queue peut être synchronisée à une
+par quart de mesure (beat). La queue peut être synchronisée à une
horologe MIDI entrant ou en tant que client JACK Transport. La plupart
-des contrôles de QMidiArp est accessible par contrôle MIDI via un
-mécanisme d'apprentissage par menu contextuel.
+des contrôles de QMidiArp est accessible par contrôle MIDI via un
+mécanisme d'apprentissage par menu contextuel.
QMidiArp possède également un outil de journalisation d'évênements MIDI
-entrants.
+entrants.
QMidiArp utilise les bibliothèques du kit Qt4.
.SS "Fonctionnement Général"
+Si aucune option est spécifiée au démarrage, QMidiArp utilise devient un
+client JACK MIDI et cré un port d'entrée ainsi que deux ports de sortie.
+Si l'on démarre QMidiArp avec l'option -a, le système MIDI est ALSA.
En cliquant sur les boutons
-.B Nouvel Arpège..., Nouveau LFO...
+.B Nouvel Arpège..., Nouveau LFO...
ou
.B Nouveau Séquenceur...
le module choisi apparaît en tant qu'onglet dans la zone principale. Les
modules peuvent être renommés ou supprimés avec les boutons et fonctions
de menu correspondants. Le montage entier contenant tous les arpèges et
-LFOs de la barre d'onglets ainsi que les définitions de la
-fenêtre
-.B Paramètres
-peuvent être sauvegardées dans un fichier XML QMidiArp (.qmax). Les
+LFOs de la barre d'onglets ainsi que les définitions de la
+fenêtre
+.B Paramètres
+peuvent être sauvegardées dans un fichier XML QMidiArp (.qmax). Les
modules peuvent être détachées en tant que fenêtres indépendantes pour
les contrôler et visualiser en parallèle. Le
.B tempo
@@ -66,41 +70,41 @@
en unités de beats par minute (bpm). La queue du séquenceur est démarrée
en cliquant sur le bouton indiquant une flêche bleue.
-.SS "Fonctionnement en mode MIDI Clock"
-QMidiArp peut utiliser les évênements MIDI clock entrant en tant
+.SS "Fonctionnement en mode MIDI Clock" (disponible uniquement pour ALSA)
+QMidiArp peut utiliser les évênements MIDI clock entrant en tant
que source d'horologe et de contrôle start/stop.
-Si le
+Si le
.B bouton MIDI clock
-à droite de la boîte de réglage du tempo est enfoncé,
+à droite de la boîte de réglage du tempo est enfoncé,
la queue du séquenceur est arrêtée et
QMidiArp
attendra la réception d'un évênement "MIDI Clock Start" d'une source
-externe connectée à son entrée MIDI. Une fois cet évênement reçu,
+externe connectée à son entrée MIDI. Une fois cet évênement reçu,
la queue est démarrée en utilisant les évênements d'horologe MIDI comme
source.
La synchronisation fonctionne au mieux si le tempo de la source externe
correspond à peu près à celui de QMidiArp. La queue s'arrêtera
sur réception d'un évênement MIDI Clock Stop. Pendant le fonctionnement
-en mode MIDI Clock, les fonctions internes de start/stop ainsi que
-l'ajout ou le chargement de fichiers sont desactivées. Elles sont
-réactivées en cliquant sur le bouton MIDI Clock à nouveau.
+en mode MIDI Clock, les fonctions internes de start/stop ainsi que
+l'ajout ou le chargement de fichiers sont desactivées. Elles sont
+réactivées en cliquant sur le bouton MIDI Clock à nouveau.
.SS "Fonctionnement en tant que client JACK Transport"
-Lorsqu'on appuye sur le bouton
+Lorsqu'on appuye sur le bouton
.B Connecter à Jack Transport,
-QMidiArp essaiera de se connecter à un serveur JACK en marche. Il
+QMidiArp essaiera de se connecter à un serveur JACK en marche. Il
fonctionnera ensuite en tant que client Jack Transport, c'est à dire, le
-tempo sera déduit d'un maître Jack Transport et la synchronisation sera
-maintenue. Le séquenceur de QMidiArp redémarrera à zéro à chaque fois
+tempo sera déduit d'un maître Jack Transport et la synchronisation sera
+maintenue. Le séquenceur de QMidiArp redémarrera à zéro à chaque fois
que le maître Jack transport est mis en marche, indépendamment de la
position initiale de Jack Transport. Ceci s'applique également quand Jack
-Transport fonctionne en boucle. Le bouton Jack Transport se relâche
-automatiquement lors d'une déconnextion de Jack, par exemple si Jack
-n'est plus actif.
+Transport fonctionne en boucle. Le bouton Jack Transport se relâche
+automatiquement lors d'une déconnextion de Jack, par exemple si Jack
+n'est plus actif.
.PP
Note: Les états des boutons MIDI Clock et Jack Transport sont sauvegardés
dans le fichier de session QMidiArp à chaque enregistrement et deviennent
-actifs ou inactifs à chaque ouverture d'une session.
+actifs ou inactifs à chaque ouverture d'une session.
.SS "Les Modules Arpégiateur"
Les arpégiateurs de QMidiArp produisent des séquences de notes qui
@@ -110,86 +114,86 @@
.PP
.B Les champs Entrée et Sortie
.PP
-Chaque arpégiateur possède un champ
+Chaque arpégiateur possède un champ
.B Entrée
et un champ
.B Sortie.
Le champ d'entrée définit la gamme de notes et le canal MIDI auxquels
l'arpeggiator est assigné. Les notes qui passent par ce filtre sont
-triées par leur hauteur et ajoutées au tampon interne de notes de
-l'arpégiateur. Les notes ne passant par aucun filtre peuvent être
-acheminées à un port MIDI défini dans la fenêtre
+triées par leur hauteur et ajoutées au tampon interne de notes de
+l'arpégiateur. Les notes ne passant par aucun filtre peuvent être
+acheminées à un port MIDI défini dans la fenêtre
.B Paramètres
-ou ignorées. Le champ
+ou ignorées. Le champ
.B Sortie
-contient les réglages du
+contient les réglages du
.B canal MIDI
-et du
-.B port de sortie
+et du
+.B port de sortie
auxquels les notes de l'arpège seront envoyées.
.PP
.B "Motifs d'arpège"
.PP
Le motif de l'arpège peut être sélectionné et édité dans le champ
.B Motif.
-Les motifs prédéfinis
-.B (presets)
+Les motifs prédéfinis
+.B (presets)
sont accessibles d'un menu déroulant. Le motif actif est affiché dans un
écran dédié montrant les notes de base comme traits. L'échelle verticale
-de cet écran correspond à l'index des notes dans le motif. Les
+de cet écran correspond à l'index des notes dans le motif. Les
changements d'octave (voir
.B Editer les motifs d'arpège)
-sont affichés comme des séparateurs horizontaux supplémentaires. Les
-notes sortant de l'arpéggiateur dépendent des notes reçues à l'entrée,
-qui sont attribuées par ordre ascendant aux notes de base définies dans
-le motif. Par exemple, un trait unique en bas de l'écran d'affichage
+sont affichés comme des séparateurs horizontaux supplémentaires. Les
+notes sortant de l'arpéggiateur dépendent des notes reçues à l'entrée,
+qui sont attribuées par ordre ascendant aux notes de base définies dans
+le motif. Par exemple, un trait unique en bas de l'écran d'affichage
(presets "simple") signifie qu'au premier passage, la note la plus basse
jouée sur le clavier est produite. Si plusieurs notes sont appuyées sur
-le clavier et si seulement une note est présente dans le motif, c'est le
-.B mode de répétition
-qui détermine la séquence de notes jouées à la sortie. Si le motif
-contient des traits de note empîlés (mode accord), les accords joués sur
-le clavier deviennent aussi des accords à la sortie avec une polyphonie
+le clavier et si seulement une note est présente dans le motif, c'est le
+.B mode de répétition
+qui détermine la séquence de notes jouées à la sortie. Si le motif
+contient des traits de note empîlés (mode accord), les accords joués sur
+le clavier deviennent aussi des accords à la sortie avec une polyphonie
dans la limite du nombre de notes définies dans cette pîle.
.PP
.B Mode de répétition
.PP
-Le mode de répétition
+Le mode de répétition
définit le comportement de l'arpège sur plusieurs répétitions du motif
quand le nombre de notes jouées sur le clavier dépasse le nombre
de notes présentes dans le motif, par exemple avec une seule note dans
le motif mais un accord de trois notes joué sur le clavier.
Avec le
-.B mode de répétition
-"Monte", la note produite est incrémentée à chaque répétition vers la
-prochaine note
+.B mode de répétition
+"Monte", la note produite est incrémentée à chaque répétition vers la
+prochaine note
jouée sur le clavier. Avec le mode "Descend", la prochaine note
plus basse est jouée. Avec une seule note présente dans le motif, ceci
-produit un arpège classique linéaire. Ainsi, même avec des motifs
-simples comme "01" ou "0", on génère des arpèges complets. En revanche,
-avec le mode de répétition "Statique", les notes à la sortie seront
+produit un arpège classique linéaire. Ainsi, même avec des motifs
+simples comme "01" ou "0", on génère des arpèges complets. En revanche,
+avec le mode de répétition "Statique", les notes à la sortie seront
constantes.
.PP
.B Mode de Déclenchement
.PP
Les arpégiateurs de QMidiArp possèdent trois modes de déclenchement
-par le clavier d'entrée. En mode "Continu", le motif est répété en
+par le clavier d'entrée. En mode "Continu", le motif est répété en
permanence en synchronisation avec le séquenceur interne sans tenir
-compte du moment où les notes sont jouées. Le mode "Redémarre"
+compte du moment où les notes sont jouées. Le mode "Redémarre"
permet de garder cette quantisation mais en renvoyant la séquence au
-point de départ à chaque nouvelle note jouée en stakato. Enfin, le
-mode "Déclenche" produit le démarrage de l'arpégiateur au moment où
-une note stakato est jouée.
+point de départ à chaque nouvelle note jouée en stakato. Enfin, le
+mode "Déclenche" produit le démarrage de l'arpégiateur au moment où
+une note stakato est jouée.
.PP
.B "Editer les motifs d'arpège"
.PP
-Les motifs d'arpège de QMidiArp sont définis par une séquence de
-caractères contenant les notes même ainsi que des caractères de
+Les motifs d'arpège de QMidiArp sont définis par une séquence de
+caractères contenant les notes même ainsi que des caractères de
contrôle pour des changements de tempo, de vélocité, de durée,
d'octave, et de mode accord. En appuyant sur le bouton
-.B Editer le motif,
+.B Editer le motif,
le preset de motif apparaît sous forme d'un champ de texte modifiable.
-Le motif modifié peut être sauvegardé dans la liste des motifs
+Le motif modifié peut être sauvegardé dans la liste des motifs
prédéfinis en cliquant le bouton
.B Mémoriser le motif.
Le motif actif peut être supprimé de la liste en cliquant sur le bouton
@@ -205,43 +209,42 @@
> : Double tempo
< : Demi tempo
. : Retour au tempo standard: un quart de mesure
-
-( ) : Mode accord début / fin
+ ( ) : Mode accord début / fin
e.g. (012) produit un accord des trois
- notes les plus basses dans le tampon
+ notes les plus basses dans le tampon
/ : Augmente la vélocité de 20%
\\ : Diminue la vélocité de 20%
d : Double durée de note
h : Demi durée de note
p : Pause
-Tous les contrôles sont valides jusqu'à la fin du motif.
+Tous les contrôles sont valides jusqu'à la fin du motif.
Par exemple, le contrôle > doublera la vitesse de l'arpège pour toutes
-les notes suivantes dans le motif jusqu'à la prochaine répétition à
-laquelle la vitesse reprendra à un quart de mesure.
+les notes suivantes dans le motif jusqu'à la prochaine répétition à
+laquelle la vitesse reprendra à un quart de mesure.
.PP
.B Randomisation
.PP
-Le rythme, la vélocité et la durée des notes produites peuvent être
+Le rythme, la vélocité et la durée des notes produites peuvent être
randomisés par les réglettes du champ
.B Randomisation.
-Ces réglages peuvent être utilisés pour produire des motifs moins
+Ces réglages peuvent être utilisés pour produire des motifs moins
mécaniques, mais à des valeurs plus élevées, ils ajoutent des accents
intéressants au motif joué.
.PP
.B Enveloppe
.PP
-QMidiArp peut superposer une fonction d'enveloppe aux vélocités des
+QMidiArp peut superposer une fonction d'enveloppe aux vélocités des
arpèges. La dynamique de cette enveloppe est définie par les réglettes
-.B Attack
+.B Attack
et
.B Release.
-En ajustant un temps d'"attack" non-nul, les vélocités de notes à la
-sortie sont incrémentées pendant le temps d'attack défini en secondes.
-Si un temps "release" est spécifié, les notes relâchées sont gardées dans
-le tampon, et leur vélocité est linéairement diminuée jusqu'à la fin du
-temps "release". Cette fonction n'a un effet sur le son que si le
-synthétiseur connecté à la sortie produit des sons sensibles à la
+En ajustant un temps d'"attack" non-nul, les vélocités de notes à la
+sortie sont incrémentées pendant le temps d'attack défini en secondes.
+Si un temps "release" est spécifié, les notes relâchées sont gardées dans
+le tampon, et leur vélocité est linéairement diminuée jusqu'à la fin du
+temps "release". Cette fonction n'a un effet sur le son que si le
+synthétiseur connecté à la sortie produit des sons sensibles à la
vélocité. Elle fonctionne aux mieux avec des motifs à haute polyphonie
comme par exemple le motif "Chord Oct 16 A".
.PP
@@ -250,12 +253,12 @@
Les réglettes de la fenêtre
.B Groove
permettent de contrôler un décalage linéaire du rythme, de la durée des
-notes et de leur vélocité à l'intérieur de chaque quart de mesure du
-motif. Ceci permet de créer un rythme du type swing ou d'accentuer le
+notes et de leur vélocité à l'intérieur de chaque quart de mesure du
+motif. Ceci permet de créer un rythme du type swing ou d'accentuer le
motif. Les ajustements Groove sont valables pour tous les arpégiateurs
simultanément.
.PP
-Les modules arpégiateurs de QMidiArp ont été inspiré par l'arpégiateur
+Les modules arpégiateurs de QMidiArp ont été inspiré par l'arpégiateur
matériel MAP1 par Rudi Linhard.
.SS "Les modules LFO"
@@ -263,74 +266,101 @@
peut envoyer des données de contrôle MIDI sous forme d'un oscillateur
à basse fréquence (LFO) à une sortie spécifiée. Les données LFO sont des
évênements MIDI envoyés en synchronie avec la queue de l'arpégiateur.
-La queue doit être en état démarré pour activer les LFOs.
+La queue doit être en état démarré pour activer les LFOs.
Chaque module LFO possède un champ
.B forme d'onde
pour définir la forme des données produites et un champ
.B Sortie
-pour définir leur canal MIDI, port ALSA ainsi que le numéro de
-contrôleur à produire. Actuellement, la forme d'onde peut être choisie
-entre Sinus, Scie montant, Scie descendant, Triangle, Créneau et Libre.
-La
+pour définir leur canal MIDI, port ALSA ainsi que le numéro de
+contrôleur à produire. Actuellement, la forme d'onde peut être choisie
+entre Sinus, Scie montant, Scie descendant, Triangle, Créneau et Libre.
+La
.B fréquence
du LFO est définie en multiples et diviseurs du
.B tempo
de l'arpégiateur, une fréquence de 1 produit une onde entière à chaque
-quart de mesure. Si l'on spécifie des fréquences plus basses, la
-longueur de la table d'onde doit être ajustée en conséquence si l'on
-souhaite produire un cycle d'onde complet. La
-.B résolution
-temporelle du LFO détermine le nombre d'évênements produits à chaque
+quart de mesure. Si l'on spécifie des fréquences plus basses, la
+longueur de la table d'onde doit être ajustée en conséquence si l'on
+souhaite produire un cycle d'onde complet. La
+.B résolution
+temporelle du LFO détermine le nombre d'évênements produits à chaque
quart de temps. Elle peut aller de 1 à 192 évênements par quart de temps.
-.B L'amplitude
+.B L'amplitude
et
.B l'offset
de l'onde peuvent être spécifiés entre 0 et 127. A basse résolution
-temporelle, le LFO produira des changements rythmiques du contrôle,
+temporelle, le LFO produira des changements rythmiques du contrôle,
tandis que des résolutions élevées mènent à des ondes de plus en plus
continues.
.PP
.B Rendre muet l'onde point par point
.PP
On peut retenir l'emission d'un point individuel sur la forme d'onde
-en cliquant avec le
-.I bouton droit
-de la souris à l'endroit correspondant dans l'écran d'affichage de
+en cliquant avec le
+.I bouton droit
+de la souris à l'endroit correspondant dans l'écran d'affichage de
l'onde. Les points muets de l'onde sont affichés en couleur sombre.
.PP
.B Formes Libres
.PP
En sélectionnant la forme
.B Libre,
-l'onde peut être dessinée ou modifiée avec le
-.I bouton gauche
+l'onde peut être dessinée ou modifiée avec le
+.I bouton gauche
de la souris. Lorqu'on tente à modifier une forme calculée, elle est
-automatiquement copiée vers la forme libre, et la forme libre précédente
+automatiquement copiée vers la forme libre, et la forme libre précédente
est écrasée.
-Toutes les opérations du LFO incluant le dessin peuvent être faites
+Toutes les opérations du LFO incluant le dessin peuvent être faites
pendant que le transport est en marche.
.PP
+.B Direction de lecture et répétition
+.PP
+The play mode can be switched between:
+
+
+ ->_> : En avant et répéter
+ <_<- : En arrière et répéter
+ ->_< : Aller-retour et répéter
+ >_<- : Retour-aller et répéter
+ ->_| : Un seul aller
+ |_<- : Un seul retour
+
+Les changements faits dans ces contrôles s'appliquent immédiatement.
+
+.PP
.B Enregistrement
.PP
Les données de contrôle MIDI reçues à l'entrée peuvent être enregistrées
en continue en appuyant sur le bouton
.B Enregistrer.
-Ce bouton est lui-même contrôlable par MIDI (c.f.
+Ce bouton est lui-même contrôlable par MIDI (c.f.
.B Apprentissage MIDI)
et QMidiArp est ainsi utilisable comme Looper et séquenceur de contrôles.
.PP
+.B "Le champ Entrée du LFO"
+Le champ d'entrée permet de spécifier le contrôleur
+.B MIDI CC
+à enregistrer. On spécifie ici également comment le module réagit en cas
+de réception de notes à l'entrée. Comme les arpégiateurs, le LFO peut
+être redémarré ou déclenché (triggé), et la production de données peut
+être arrêtée en cas de touches relachées, donc à la réception d'un signal
+.B Note Off
+à l'entrée avec le
+.Canal
+correspondant.
+.PP
.B "Le champ Sortie du LFO"
.PP
-Ce champ contient les réglages du
-.B port,
+Ce champ contient les réglages du
+.B port,
.B canal
et
-.B contrôleur
-des données produites. Il permet également de rendre muet le module
+.B contrôleur
+des données produites. Il permet également de rendre muet le module
entièrement.
.SS "Les modules séquenceurs"
-En cliquant sur le bouton
+En cliquant sur le bouton
.B "Nouveau Séquenceur..."
dans la barre de contrôle, un nouveau module
.B Seq
@@ -341,22 +371,22 @@
.PP
.B Programmer une séquence
.PP
-Comme les modules LFO de QMidiArp, le séquenceur peut être programmé en
+Comme les modules LFO de QMidiArp, le séquenceur peut être programmé en
ajustant les notes avec le bouton gauche de la souris sur l'écran
-d'affichage. La gamme d'octaves est fixée à 4, la note la plus basse
-étant C2, si la transposition globale est zéro. Les notes peuvent être
+d'affichage. La gamme d'octaves est fixée à 4, la note la plus basse
+étant C2, si la transposition globale est zéro. Les notes peuvent être
rendues muettes avec le bouton droit de la souris. La
.B durée
de la séquence peut être ajustée entre 1 et 8 beats (quarts de mesure),
-la résolution temporelle entre 1 et 16 par beat. Une
+la résolution temporelle entre 1 et 16 par beat. Une
résolution de 4 produit 4 notes par beat, donc des notes double croche.
On peut aussi programmer des séquences en utilisant la fonction
.B Enregistrer.
-Si le bouton
-.B Enregistrer
-est enfoncé, les notes reçues sur le port d'entrée sont enregistrées
+Si le bouton
+.B Enregistrer
+est enfoncé, les notes reçues sur le port d'entrée sont enregistrées
pas à pas commençant par la dernière note modifiée. La séquence peut
-être programmée avec la queue de séquenceur en marche.
+être programmée avec la queue de séquenceur en marche.
.PP
.B Contrôler la séquence globalement
.PP
@@ -386,7 +416,7 @@
définit également le comportement de déclenchement de la séquence en
cas de réception de notes à l'entrée.
.B Redémarre
-renvoie la séquence à son début, mais sans interrompre le rythme. La
+renvoie la séquence à son début, mais sans interrompre le rythme. La
séquence est re-déclenchée avec le timing des notes jouées seulement
si
.B Trigger
@@ -394,12 +424,12 @@
.B Note Off
arretera la séquence avec une note relachée, et
.B Boucle
-doit être cochée pour une répétition permanente au lieu d'un seul
+doit être cochée pour une répétition permanente au lieu d'un seul
passage. Le
champ
.B Sortie
-est équivalent à celui des arpégiateurs et LFOs.
-.PP
+est équivalent à celui des arpégiateurs et LFOs.
+.PP
On peut produire des accents dans une séquence en ajoutant des
modules LFO en parallèle aux modules Seq. Pour ceci, il suffit que le LFO
envoie ses données vers le même port et canal MIDI que les modules Seq.
@@ -412,18 +442,18 @@
est contrôlable par des contrôleurs MIDI. En cochant la case
.B Style compact d'affichage des modules
tous les nouveaux modules créés auront une apparence économique en place
-pour la distribution sur le bureau de l'ordinateur.
+pour la distribution sur le bureau de l'ordinateur.
.PP
-Tous les ajustements faits dans le dialogue
+Tous les ajustements faits dans le dialogue
.B Paramètres
sont sauvegardés avec les données des modules dans le fichier .qmax.
.SS Contrôle MIDI
-QMidiArp accepte les évênements de contrôle MIDI, si l'option
+QMidiArp accepte les évênements de contrôle MIDI, si l'option
.B Modules contrôlables par MIDI
est cochée dans le dialogue
.B Settings.
-Le contrôle par MIDI est dispobible pour les modules Seq
+Le contrôle par MIDI est dispobible pour les modules Seq
(boutons muets, vélocité, durée des notes), les modules LFO
(boutons muets, amplitude, décalage) et les modules d'arpège (boutons
muets).
@@ -431,16 +461,16 @@
.B Apprentissage MIDI
.PP
Les contrôleurs peuvent être attribués par un clic de droite sur l'élément
-de contrôle correspondant, et en sélectionnant
+de contrôle correspondant, et en sélectionnant
.B Apprendre du MIDI.
QMidiArp attendra ensuite la réception d'un évênement de contrôle MIDI
(envoyé par exemple à partir d'une réglette d'une surface de contrôle).
-Lors de la première réception d'un tel évênement, ce contrôleur est
-acheminé vers l'élément de contrôle sélectionné. Il est possible
-d'attribuer plusieurs contrôleurs MIDI à un seul élément. Lorsqu'on
-sélectionne
+Lors de la première réception d'un tel évênement, ce contrôleur est
+acheminé vers l'élément de contrôle sélectionné. Il est possible
+d'attribuer plusieurs contrôleurs MIDI à un seul élément. Lorsqu'on
+sélectionne
.B Oublier les contrôleurs,
-toutes les attributions de cet élément seront supprimées. Si l'on choisit
+toutes les attributions de cet élément seront supprimées. Si l'on choisit
.B Annuler l'apprentissage,
QMidiArp n'attendra plus d'évênements de contrôle MIDI.
.PP
@@ -452,44 +482,44 @@
.PP
Pour modifier les contrôles attribués, on choisit
.B Contrôles MIDI
-dans le menu
+dans le menu
.I Affichage.
-Les propriétés de chaque contrôle MIDI peuvent être modifiées dans le
-tableau de cette fenêtre. Les contrôleurs de
-.B boutons
-ont un fonctionnement spécifique. Si les valeurs min et max sont
-.I identiques,
+Les propriétés de chaque contrôle MIDI peuvent être modifiées dans le
+tableau de cette fenêtre. Les contrôleurs de
+.B boutons
+ont un fonctionnement spécifique. Si les valeurs min et max sont
+.I identiques,
le contrôleur fonctionnera en tant que "toggle". Si min et max sont
.I différents,
-le module devient muet lors de la réception de min (case muet
+le module devient muet lors de la réception de min (case muet
.I cochée)
-et devient actif lors de la réception d'une valeur de max.
+et devient actif lors de la réception d'une valeur de max.
.PP
-Lorsqu'on appuye sur
+Lorsqu'on appuye sur
.B Supprimer,
la ligne sélectionnée est effacée, et le bouton
.B Rétablir
-recharge les attributions actuelles. Toutes les modifications faites
-dans ce tableau sont appliquées sur appui du bouton
+recharge les attributions actuelles. Toutes les modifications faites
+dans ce tableau sont appliquées sur appui du bouton
.B OK
alors que
.B Cancel
-annule les changements.
+annule les changements.
.SS "Journal"
La fenêtre du
-.B Journal
-d'évênements liste les évênements MIDI entrants. Les évênements sont
-affichés en couleur dépendant de leur type.
-Le journal est affiché dans la partie inférieure du logiciel par défaut,
+.B Journal
+d'évênements liste les évênements MIDI entrants. Les évênements sont
+affichés en couleur dépendant de leur type.
+Le journal est affiché dans la partie inférieure du logiciel par défaut,
mais il peut être caché ou détaché en tant que fenêtre indépendante.
-La journalisation peut être desactivée entièrement ou uniquement pour
+La journalisation peut être desactivée entièrement ou uniquement pour
les évênements d'horologe MIDI.
.SS Fichiers d'exemple
-Il y a actuellement trois fichiers de démonstration de l'arpégiateur.
+Il y a actuellement trois fichiers de démonstration de l'arpégiateur.
Le fichier demo.qma a été conçu pour être utilisé avec des sons de type
-suivant: Canal 1: Marimba, Canal 2: Celesta, Canal 3: Basse acoustique,
+suivant: Canal 1: Marimba, Canal 2: Celesta, Canal 3: Basse acoustique,
mais on peut obtenir des résultats intéressants en employant d'autres
types de son.
.PP
@@ -497,49 +527,51 @@
Seq et LFO fonctionnant en parallèle. Les sorties des séquenceurs
devraient être connectées à des synthétiseurs et des sons percussifs.
Les LFO produisent des données destinées aux fréquences de filtres
-(cutoffs) qui ont le contrôleur MIDI standard CC#74. Le synthétiseur
+(cutoffs) qui ont le contrôleur MIDI standard CC#74. Le synthétiseur
ZynAddSubFX par Paul Nasca réagit à ces contrôleurs, et ses presets
"Bass 1" ou "Plucked 3" fonctionnenet bien avec cette démonstration.
.SH OPTIONS
.TP
.B \-\-portCount
-Définir le nombre de ports ALSA disponibles égal à . La valeur
+Définir le nombre de ports ALSA disponibles égal à . La valeur
par défaut est 2.
.TP
-.B \-\-help
-Affiche les options de ligne de commande disponibles et quitte le
+.B \-\-help
+Affiche les options de ligne de commande disponibles et quitte le
programme.
.TP
-.B \-\-version
+.B \-\-version
Affiche l'information de version du programme et quitte celui-ci.
.TP
+.BI \-\-alsa
+Utiliser le pilote ALSA MIDI
+.TP
+.BI \-\-jack
+Utiliser le pilote JACK MIDI (par défaut)
+.TP
.B fichier
-Nom d'un fichier QMidiArp (.qmax) valide à charger au démarrage du
+Nom d'un fichier QMidiArp (.qmax) valide à charger au démarrage du
programme.
.SH FICHIERS
.I *.qmax
.RS
Fichiers XML QMidiArp contenant les données au format texte XML.
-.RE
-.I *.qma
-.RS
-Anciens fichiers QMidiArp au format plein texte.
.SH EXEMPLES
-Les fichiers d'exemple de QMidiArp se situent dans
+Les fichiers d'exemple de QMidiArp se situent dans
.I /usr/share/qmidiarp
ou dans
.I /usr/local/share/qmidiarp
.SH NOTES
-Les erreurs et avertissements sont écrits dans
+Les erreurs et avertissements sont écrits dans
.BR stderr (3).
.PP
.SH SUPPORT
qmidiarp-devel@lists.sourceforge.net
.SH AUTEURS
-Frank Kober, Guido Scholz et Matthias Nagorni. Cette page de manuel
-a été écrite par
+Frank Kober, Nedko Arnaudov, Guido Scholz et Matthias Nagorni. Cette
+page de manuel a été écrite par
Frank Kober .
diff -Nru qmidiarp-0.4.2/man/Makefile.in qmidiarp-0.4.5/man/Makefile.in
--- qmidiarp-0.4.2/man/Makefile.in 2011-07-09 15:48:16.000000000 +0000
+++ qmidiarp-0.4.5/man/Makefile.in 2012-01-21 17:28:56.000000000 +0000
@@ -1,9 +1,9 @@
-# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# Makefile.in generated by automake 1.11.2 from Makefile.am.
# @configure_input@
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
-# Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+# Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
@@ -75,6 +75,12 @@
am__base_list = \
sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
man1dir = $(mandir)/man1
am__installdirs = "$(DESTDIR)$(man1dir)"
NROFF = nroff
@@ -309,9 +315,7 @@
sed -n '/\.1[a-z]*$$/p'; \
} | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
-e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
- test -z "$$files" || { \
- echo " ( cd '$(DESTDIR)$(man1dir)' && rm -f" $$files ")"; \
- cd "$(DESTDIR)$(man1dir)" && rm -f $$files; }
+ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir)
# This directory's subdirectories are mostly independent; you can cd
# into them and run `make' without going through this Makefile.
@@ -537,10 +541,15 @@
installcheck: installcheck-recursive
install-strip:
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- `test -z '$(STRIP)' || \
- echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
mostlyclean-generic:
clean-generic:
diff -Nru qmidiarp-0.4.2/man/qmidiarp.1 qmidiarp-0.4.5/man/qmidiarp.1
--- qmidiarp-0.4.2/man/qmidiarp.1 2011-05-29 18:18:19.000000000 +0000
+++ qmidiarp-0.4.5/man/qmidiarp.1 2011-12-22 09:12:33.000000000 +0000
@@ -1,4 +1,4 @@
-.\"
+.\"
.\" Manual page for qmidiarp
.\" Process with:
.\" groff -man -Tascii qmidiarp.1 | less
@@ -6,7 +6,7 @@
.\" Get a printable version with:
.\" groff -t -e -mandoc -Tps qmidiarp.1 > qmidiarp.ps
.\"
-.TH QMIDIARP 1 2009-10-20
+.TH QMIDIARP 1 2011-11-07
.SH NAME
qmidiarp \- MIDI arpeggiator and LFO
@@ -14,41 +14,44 @@
.br
.B qmidiarp
[\fIOPTION\fR] [\fIfile\fR]
-.br
+.br
.B qmidiarp
{
-.B \-\-help
-|
+.B \-\-help
+|
.B \-\-version
}
.SH DESCRIPTION
QMidiArp
-is an advanced MIDI arpeggiator, programmable step sequencer and LFO for
-the ALSA sequencer. It can
-hold any number of arpeggiator or LFO modules running in parallel. The
+is an advanced MIDI arpeggiator, programmable step sequencer and LFO.
+It runs with either JACK MIDI or ALSA MIDI. It can
+hold any number of arpeggiator or LFO modules running in parallel. The
arpeggiator modules produce sequences depending on the notes sent to
-their input port, which is typically connected to a keyboard or another
-sequencer. The step sequencer modules allow to create simple linear,
-monophonic and globally transposable sequences similar to the first
+their input port, which is typically connected to a keyboard or another
+sequencer. The step sequencer modules allow to create simple linear,
+monophonic and globally transposable sequences similar to the first
analog sequencers. The MIDI LFOs independently
produce MIDI controller data of adjustable waveform, time resolution,
-amplitude and duration. For each module, an input note filter is
-available, and the output port and channel can be set independently.
-Since the modules use a common sequencer queue, they are automatically
+amplitude and duration. For each module, an input note filter is
+available, and the output port and channel can be set independently.
+Since the modules use a common sequencer queue, they are automatically
in sync with each other. QMidiArp works with an internal tick resolution
-of 192 ticks per beat. The queue can be synchronized to an incoming MIDI
+of 192 ticks per beat. The queue can be synchronized to an incoming MIDI
realtime clock or as a JACK transport client. Most of the relevant
control elements are accessible via MIDI controller through a MIDI-learn
infrastructure.
QMidiArp
-also has a log tool displaying the history of incoming MIDI events in
+also has a log tool displaying the history of incoming MIDI events in
colors depending on their type.
QMidiArp is based on the Qt4 toolkit.
.SS "General Operation"
+When no commandline options are given, QMidiArp starts as a JACK MIDI
+client with an input port and two output ports. For starting QMidiArp as
+an ALSA client, use the -a option.
A new arpeggiator or LFO module can be created by
-clicking one of the
+clicking one of the
.B Add Arp..., Add LFO...
or
.B Add Step Sequencer...
@@ -60,122 +63,123 @@
on the icon on the left side of each module title bar. They can also be
aligned side-by-side within the same window if the main window is
stretched sufficiently before reinserting a module. The entire
-setup containing all arps, sequences and LFOs in the tab bar along with
-the parameters set in the
-.B Settings
+setup containing all arps, sequences and LFOs in the tab bar along with
+the parameters set in the
+.B Settings
window can be saved to or loaded from
-a QMidiArp XML file (.qmax). The
-.B tempo
+a QMidiArp XML file (.qmax). The
+.B tempo
of the queue can be set in beats per minute and
-affects all modules. The queue is started and stopped by
-the blue arrow button.
+affects all modules. The queue is started and stopped by
+the blue arrow button.
-.SS "MIDI Clock operation"
-QMidiArp can use incoming MIDI clock events as clock and start/stop
+.SS "MIDI Clock operation (ALSA MIDI only)"
+In ALSA mode, QMidiArp runs using its own clock and tempo, but it can
+optionally use incoming MIDI clock events as clock and start/stop
control source.
-If the
-.B MIDI clock button
-right of the tempo box is pressed, the running ALSA queue is stopped,
+If the
+.B MIDI clock button
+right of the tempo box is pressed, the running ALSA queue is stopped,
and QMidiArp
-will wait for an incoming "MIDI Clock Start" event from an external
+will wait for an incoming "MIDI Clock Start" event from an external
source connected to QMidiArp's MIDI input. Once this event is received,
the queue is started using MIDI realtime clock events as clock
-source. QMidiArp will best remain in sync with the incoming
-MIDI clock if its internal tempo value (see above) approximately
+source. QMidiArp will best remain in sync with the incoming
+MIDI clock if its internal tempo value (see above) approximately
corresponds to that of the incoming clock. The MIDI clock tempo is,
-however, measured while the queue is running. Therefore, if the tempos of
-the MIDI clock and that of QMidiArp differ, synchronization should
-become stable from the second queue start. The queue will stop when a
-MIDI Clock Stop event is received. During MIDI Clock operation,
-QMidiArp's own clock start and stop functions as well as adding or
-loading new setups are disabled. They are enabled again by
-unchecking the MIDI clock button.
+however, measured while the queue is running. Therefore, if the tempos of
+the MIDI clock and that of QMidiArp differ, synchronization should
+become stable from the second queue start. The queue will stop when a
+MIDI Clock Stop event is received. During MIDI Clock operation,
+QMidiArp's own clock start and stop functions as well as adding or
+loading new setups are disabled. They are enabled again by
+unchecking the MIDI clock button.
.SS "JACK Transport Client Operation"
-When the
-.B Jack Transport Connect
-button is pressed, QMidiArp will try to connect to a running Jack server
+When the
+.B Jack Transport Connect
+button is pressed, QMidiArp will try to connect to a running Jack server
and then function
-as a Jack Transport client, i.e. set its tempo and remain synchronized
+as a Jack Transport client, i.e. set its tempo and remain synchronized
to a running Jack Transport master. Note that QMidiArp will restart
-its queue from zero whenever Jack transport is starting regardless of
+its queue from zero whenever Jack transport is starting regardless of
Jack Transport's position. This also applies in case of a looping Jack
Transport queue. The Jack button will be released automatically
if QMidiArp gets disconnected from Jack by a possible Jack shutdown or
-if Jack is not available at connection time.
+if Jack is not available at connection time.
.PP
-Note: MIDI Clock and Jack Transport button states will be saved with the
+Note: MIDI Clock and Jack Transport button states will be saved with the
QMidiArp session file, and get active or inactive when a new session
-file is loaded.
+file is loaded.
.SS "Arpeggiator Modules"
QMidiArp's arpeggiators can produce complex patterns derived from the
-notes played on a MIDI keyboard. QMidiArp's arpeggiator modules
+notes played on a MIDI keyboard. QMidiArp's arpeggiator modules
were inspired by the MAP1 hardware arpeggiator by Rudi Linhard.
.PP
.B Input and Output panels
.PP
-Each arpeggiator has an
-.B Input
-and an
+Each arpeggiator has an
+.B Input
+and an
.B Output
-panel. The Input panel
-defines the note range and the MIDI channel to which the arp is
+panel. The Input panel
+defines the note range and the MIDI channel to which the arp is
assigned. Notes that pass this Input
filter are sorted by pitch and added to the internal note buffer of the
arpeggiator. Incoming notes that do not match any filter can either be
-discarded or forwarded to a selectable MIDI port (see
+discarded or forwarded to a selectable MIDI port (see
.B Settings
-). The
-.B Output
-panel holds settings for the
-.B MIDI channel
-and
-.B output port
-to which the arpeggiator notes will be sent.
+). The
+.B Output
+panel holds settings for the
+.B MIDI channel
+and
+.B output port
+to which the arpeggiator notes will be sent.
.PP
.B "Arpeggiator Patterns"
.PP
-Arpeggio patterns can be selected and edited in the
+Arpeggio patterns can be selected and edited in the
.B Pattern
-panel.
-.B Pattern presets
+panel.
+.B Pattern presets
are selectable from a combo box. The currently
active pattern is displayed as a piano roll type screen showing the
-base notes as streaks. The y-scale of the graphics
-window corresponds to the index of the notes in the pattern. Octave
-changes (see
+base notes as streaks. The y-scale of the graphics
+window corresponds to the index of the notes in the pattern. Octave
+changes (see
.B Editing patterns
-) are shown as additional horizontal lines.
-The notes that are eventually sent depend on the input notes received
-by the arpeggiator. The received notes notes are attributed in ascending
-order to the notes defined in the pattern. For example, a single streak
+) are shown as additional horizontal lines.
+The notes that are eventually sent depend on the input notes received
+by the arpeggiator. The received notes notes are attributed in ascending
+order to the notes defined in the pattern. For example, a single streak
on the bottom of the arp display ("simple" presets) means that at
-the first pass through the pattern, the lowermost note played on the
+the first pass through the pattern, the lowermost note played on the
keyboard is played.
If a chord is played on the keyboard and only one note is
present in the pattern, only the lowermost pressed note is output at
-the first pass through the pattern. For the following repetitions of
-the pattern, the chosen "repeat mode" is used to determine the
-following notes.
-If the pattern contains stacked note streaks (chord mode), chords played
-on the keyboard are also output as chords with polyphony up to the
+the first pass through the pattern. For the following repetitions of
+the pattern, the chosen "repeat mode" is used to determine the
+following notes.
+If the pattern contains stacked note streaks (chord mode), chords played
+on the keyboard are also output as chords with polyphony up to the
number of notes defined in the stack.
.PP
.B Repeat Mode
.PP
-This setting defines the behavior of the arpeggio over several repetitions
+This setting defines the behavior of the arpeggio over several repetitions
of the pattern when the number of notes pressed on the keyboard is higher
than the number of notes present in the pattern.
-When
-.B Repeat Mode
+When
+.B Repeat Mode
is "Up", the next higher note played on the keyboard is played at each
repetition. With "Down", the next lower note is played. With a single
-note present in the arp pattern, this creates classical linear
-arpeggios. This way even simple patterns like "01" (or even "0") will
+note present in the arp pattern, this creates classical linear
+arpeggios. This way even simple patterns like "01" (or even "0") will
generate a complete arpeggio.
When "Static" is selected, this classical arpeggio mode will
-be disabled, and the output notes remain constant.
+be disabled, and the output notes remain constant.
.PP
.B "Trigger mode"
.PP
@@ -183,30 +187,30 @@
the arp running continuously in synchronization with the internal or
external clock source. Even when new notes are played, they will be
output quantized to the running queue. "Kbd restart" will cause a reset
-of the playhead position upon the next note to be output, but the
+of the playhead position upon the next note to be output, but the
output pattern stays quantized to the queue. When "Kbd trigger" is
selected, each new note played in stakato will trigger the pattern
with the timing of the played note.
.PP
.B "Editing Arp patterns"
.PP
-Arp patterns are defined by a text sequence containing the notes
-themselves as numbers along with control changes for chord, tempo,
-velocity and octave changes. When the
+Arp patterns are defined by a text sequence containing the notes
+themselves as numbers along with control changes for chord, tempo,
+velocity and octave changes. When the
.B Edit pattern
-button in the pattern panel is clicked, the current pattern preset
-appears as a
-text input line. The edited pattern can be stored in the preset list
-by clicking on the
+button in the pattern panel is clicked, the current pattern preset
+appears as a
+text input line. The edited pattern can be stored in the preset list
+by clicking on the
.B Store pattern
-button. The currently active pattern
+button. The currently active pattern
can be removed from the
-preset list by clicking on the
+preset list by clicking on the
.B Remove pattern
button. All preset patterns are immediately saved in the .qmidiarprc
-resource file when a pattern is stored or removed, and the new pattern
-list is made available to the other arps in the tab bar. Pattern presets
-are automatically loaded on each application start.
+resource file when a pattern is stored or removed, and the new pattern
+list is made available to the other arps in the tab bar. Pattern presets
+are automatically loaded on each application start.
The syntax for the pattern text is as follows:
@@ -217,9 +221,9 @@
> : Double tempo
< : Half tempo
. : Reset to standard tempo
-( ) : Chord, begin..end,
- e.g. (012) would be a chord of the
- lowermost three notes in the buffer
+ ( ) : Chord, begin..end,
+ e.g. (012) would be a chord of the
+ lowermost three notes in the buffer
/ : Volume up by 20%
\\ : Volume down by 20%
d : Double length
@@ -234,8 +238,8 @@
.B Random
.PP
The timing, velocity and length of the output notes can be randomized
-using the sliders in the
-.B Random
+using the sliders in the
+.B Random
panel. These settings can be used to make the arpeggiator sound less
mechanical, but if they are set to higher values, they add
interesting accents to the patterns.
@@ -243,9 +247,9 @@
.B Envelope
.PP
QMidiArp can modulate the velocity of the arpeggios with an envelope
-function defined by
-.B Attack
-time and
+function defined by
+.B Attack
+time and
.B Release
time. If an attack
time is set, the velocities of the output notes are ramped up during the
@@ -258,47 +262,47 @@
.PP
.B Groove
.PP
-The
+The
.B Groove
-sliders control a linear shift of timing, length and
-velocity within each beat of the output pattern. This can be used to
-create swing timing and accent. The Groove settings are adjusted for all
+sliders control a linear shift of timing, length and
+velocity within each beat of the output pattern. This can be used to
+create swing timing and accent. The Groove settings are adjusted for all
arps simultaneously.
.SS "LFO Modules"
In parallel to the arps, QMidiArp
can send MIDI controller data in form of a low frequency oscillator (LFO)
-to the assigned output. The LFO data consist of controller events that
-are in sync with the arpeggiator queue. The queue has to be in running
-state to enable the LFO. Each LFO module has a
-.B waveform
-panel to define the shape of the outgoing data and an
-.B output
+to the assigned output. The LFO data consist of controller events that
+are in sync with the arpeggiator queue. The queue has to be in running
+state to enable the LFO. Each LFO module has a
+.B waveform
+panel to define the shape of the outgoing data and an
+.B output
panel to define MIDI Channel, ALSA port and controller number to be
produced. The waveform can currently be set to Sine,
-Saw Up, Saw Down, Triangle, Square and Custom. The
-.B frequency
-of the LFO can be set in muliples and divisors of the arp
-.B tempo,
+Saw Up, Saw Down, Triangle, Square and Custom. The
+.B frequency
+of the LFO can be set in muliples and divisors of the arp
+.B tempo,
such that frequency of 1
produces one full wave per beat. If frequencies lower than 1 are
selected, the length of the wavetable has to be adjusted correspondingly
-to produce a full wave. The time
-.B resolution
+to produce a full wave. The time
+.B resolution
of the LFO determines the number of events produced every beat and
-can be adjusted to up to 192 events per beat.
-.B Amplitude
-and
-.B offset
-of the waveform can be adjusted from 0...127. Low
-.B resolutions
-lead to audibly discrete rythmic controller changes whereas higher
+can be adjusted to up to 192 events per beat.
+.B Amplitude
+and
+.B offset
+of the waveform can be adjusted from 0...127. Low
+.B resolutions
+lead to audibly discrete rythmic controller changes whereas higher
resolution values lead to more continuous waves.
.PP
.B Muting individual wave points
.PP
Individual wave points can be muted/unmuted by clicking on
-the corresponding location in the wave display with the
+the corresponding location in the wave display with the
.I right mouse button.
A muted wave point is shown in darker color.
.PP
@@ -308,102 +312,129 @@
.B Custom
is selected, the waveform can be drawn with the
.I left mouse button
-in the waveform display. A calculated waveform is copied to the custom
-waveform whenever it is being modified by the mouse. This will overwrite
-the previous custom waveform with the currently displayed waveform. As
-all LFO operations, drawing and muting can be done while the queue is
+in the waveform display. A calculated waveform is copied to the custom
+waveform whenever it is being modified by the mouse. This will overwrite
+the previous custom waveform with the currently displayed waveform. As
+all LFO operations, drawing and muting can be done while the queue is
running, and becomes effective immediately.
.PP
+.B Play direction and looping
+.PP
+The play mode can be switched between:
+
+
+ ->_> : Forward and Loop
+ <_<- : Backward and Loop
+ ->_< : Forward and Bounce
+ >_<- : Backward and Bounce
+ ->_| : Forward Single shot
+ |_<- : Backward Single shot
+
+The direction and loop settings apply immediately when changed on the
+fly.
+.PP
.B Recording
.PP
-The LFO records incoming controller data as selected in the
+The LFO records incoming controller data as selected in the
.B Input
-panel, when the
+panel, when the
.B Record
button is pressed. Note that the Record button itself can be attributed
-to a MIDI toggle controller so that it provides a convenient
+to a MIDI toggle controller so that it provides a convenient
implementation of a controller motion sampler and looper.
.PP
+.B LFO Input panel
+.PP
+The input panel contains settings on which
+.B MIDI CC
+is to be recorded, how the LFO acts to note events received on the
+input. As the arpeggiators, the LFO can be restarted or (re-) triggered
+by notes played on the keyboard, and the wave output can be stopped or
+not when
+.B Note Off
+events are received on the input
+.B Channel
+.PP
.B "LFO Output panel"
.PP
-The LFO output panel contains the
-.B port,
-.B channel
-and
-.B controller
-number settings of the LFO data produced by each LFO tab. It also allows
-.B muting
+The LFO output panel contains the
+.B port,
+.B channel
+and
+.B controller
+number settings of the LFO data produced by each LFO tab. It also allows
+.B muting
of each LFO after a completed wave cycle.
.SS "Step Sequencer Modules"
-By clicking
-.B "Add Step Sequencer..."
-in the control tool bar, a new
-.B Seq
-module can be added to the tab bar. Each of these modules produce a
-simple linear (monophonic) sequence, similar to the first analog
+By clicking
+.B "Add Step Sequencer..."
+in the control tool bar, a new
+.B Seq
+module can be added to the tab bar. Each of these modules produce a
+simple linear (monophonic) sequence, similar to the first analog
hardware sequencers. The Seq modules are controllable while
running, also in a similar way to analog step sequencers.
.PP
.B Programming a sequence
.PP
As QMidiArp's LFO modules, the step sequencer can be programmed
-by adjusting notes with left mouse
+by adjusting notes with left mouse
clicks on the sequence display. The octave range is fixed to 4. The
-lowest note is C2 if the global transpose is set to 0. Notes can be
-muted with the right mouse click. The sequence
-.B length
-can be adjusted between 1 and 8 beats, and the time
-.B resolution
-can be set to values between 1 and 16 per beat. A resolution of 4 means
-that 4 notes are output every beat, i.e. sixteenth notes.
-The sequence can also be programmed using the
+lowest note is C2 if the global transpose is set to 0. Notes can be
+muted with the right mouse click. The sequence
+.B length
+can be adjusted between 1 and 8 beats, and the time
+.B resolution
+can be set to values between 1 and 16 per beat. A resolution of 4 means
+that 4 notes are output every beat, i.e. sixteenth notes.
+The sequence can also be programmed using the
+.B Record
+function. When the
.B Record
-function. When the
-.B Record
button is pressed, notes received on the input port will be recorded
-step-by-step starting from the last modified note. Programming can be
-done on the fly also when the sequencer queue is running.
+step-by-step starting from the last modified note. Programming can be
+done on the fly also when the sequencer queue is running.
.PP
.B Controlling the sequence globally
.PP
-There are sliders to adjust the global
-.B velocity
-(volume),
-.B note length
-and
-.B transpose
+There are sliders to adjust the global
+.B velocity
+(volume),
+.B note length
+and
+.B transpose
of the sequence in semitones.
.PP
.B Seq Input and Output panels
.PP
-The Seq
+The Seq
.B Input
panel determines how to handle incoming notes on the MIDI
.B Channel
-set in the channel box. If
+set in the channel box. If
.B Note
is checked, the sequence will be globally transposed with the incoming
-note as transpose value. If
+note as transpose value. If
.B Velocity
-is checked in addition, the sequence will output notes with the same
-velocity as that received on its input. The
+is checked in addition, the sequence will output notes with the same
+velocity as that received on its input. The
.B Input
panel also determines how the sequence behaves when incoming notes
-are received. It can be restarted, triggered and stopped with the
-timing of received notes.
+are received. It can be restarted, triggered and stopped with the
+timing of received notes as the LFO modules.
The Seq
.B Output
-panel is equivalent to that of arpeggiator and LFO modules.
-.PP
-Note that accents within a pattern can be produced by running LFO
-modules in parallel to the Seq module, and by sending to the same
+panel is equivalent to that of arpeggiator and LFO modules.
+.PP
+Note that accents within a pattern can be produced by running LFO
+modules in parallel to the Seq module, and by sending to the same
channel and port as the Seq module.
.SS "Settings"
-The Settings window allows to configure if and to which port incoming
+The Settings window allows to configure if and to which port incoming
events that do not match any module's input filter are forwarded (
.B unmatched
events). It also
@@ -412,87 +443,85 @@
the modules separately. If this option is set, QMidiArp will recognize
MIDI control events that can be attributed to different parameters (see
.B MIDI Control
-). By checking the
+). By checking the
.B compact module style
-all new created modules will show with small GUI elements to be more
+all new created modules will show with small GUI elements to be more
economic in space when distributed as separate windows over the desktop.
.PP
All settings in this dialog are stored along with the module data in the
qmax session file.
.SS MIDI control
-QMidiArp supports MIDI control events if the
+QMidiArp supports MIDI control events if the
.B Modules controllable by MIDI CC
option is checked in the
.B Settings
-dialog. MIDI control is available for Seq modules (Muting, Velocity,
-Note Length), LFO modules (Muting, Amplitude, Offset) and Arp modules
-(Muting only).
+dialog.
.PP
.B MIDI Learn
.PP
Controllers can be attributed by right-clicking on the sliders or
-mute checkbox in each module and selecting
+mute checkbox in each module and selecting
.B MIDI Learn.
-QMidiArp will then wait for MIDI control events,
-and moving a MIDI controller connected to QMidiArp's input will
-attribute this controller to the control item. It is
-possible to add several MIDI controllers to one item. If
+QMidiArp will then wait for MIDI control events,
+and moving a MIDI controller connected to QMidiArp's input will
+attribute this controller to the control item. It is
+possible to add several MIDI controllers to one item. If
.B MIDI Forget
-is selected, all controllers for that item are removed. If
+is selected, all controllers for that item are removed. If
.B Cancel MIDI learning
is selected, the learn process is stopped.
.PP
Note that by default, mute controllers are interpreted as toggles, i.e.
-the mute state is toggled on reception of a value of 127 from the
+the mute state is toggled on reception of a value of 127 from the
attributed controller.
.PP
.B Control Editor
.PP
The
.B Control Editor
-is accessible from the
-.I View
+is accessible from the
+.I View
menu. Controls can be edited by MIDI control number, channel, and the
-minimum and maximum values that are sent to the control item. Mute
-controllers have a special behaviour. If minimum and maximum are
+minimum and maximum values that are sent to the control item. Mute
+controllers have a special behaviour. If minimum and maximum are
.I equal,
the controller acts as toggler upon reception of the adjusted value.
-If minimum is
+If minimum is
.I different
-from maximum, the corresponding module will be muted upon reception of
+from maximum, the corresponding module will be muted upon reception of
minimum and unmuted upon reception of maximum as values.
.PP
If
.B Remove
is pressed, the currently selected line will be removed, pressing
.B Revert
-reloads the current controller settings. Pressing
-.B Cancel
-quits the control editor without applying changes, and only if
+reloads the current controller settings. Pressing
+.B Cancel
+quits the control editor without applying changes, and only if
.B OK
is pressed, the edited control list becomes active.
.SS "Event Log"
The
-.B Event Log
-displays incoming MIDI events. It is displayed in the bottom area by
+.B Event Log
+displays incoming MIDI events. It is displayed in the bottom area by
default, but can be hidden if not
-needed or set floating as a top-level window on the desktop. Logging
-can also be disabled generally or for MIDI Clock events only.
+needed or set floating as a top-level window on the desktop. Logging
+can also be disabled generally or for MIDI Clock events only.
.SS Example Files
-There are currently three demo arpeggios.
-The demo.qma arpeggio was intended to be used with the following sound
-types: Ch 1: Marimba, Ch 2: Celesta, Ch 3: Acoustic Bass,
+There are currently three demo arpeggios.
+The demo.qma arpeggio was intended to be used with the following sound
+types: Ch 1: Marimba, Ch 2: Celesta, Ch 3: Acoustic Bass,
but you can get interesting results if you use other instrument settings.
.PP
The demo_seqlfo.qmax setup shows the use of the new sequencer and LFO
modules playing in parallel. The sequencer outputs should be routed
-to percussive synthesizer sounds. The LFO data is intended to act on
+to percussive synthesizer sounds. The LFO data is intended to act on
filter cutoff, which has the standard controller CC#74. ZynAddSubFX by
Paul Nasca reacts on these filter cutoff controllers. The "Bass 1"
-and "Plucked 3" presets from this synthesizer work well with this demo
+and "Plucked 3" presets from this synthesizer work well with this demo
file.
.SH OPTIONS
@@ -507,27 +536,30 @@
.BI \-\-version
Print version information and exit.
.TP
+.BI \-\-alsa
+Use the ALSA MIDI backend
+.TP
+.BI \-\-jack
+Use the JACK MIDI backend (default)
+.TP
.B file
Name of a valid QMidiArp (.qmax) XML file to be loaded on start.
.SH FILES
.I *.qmax
.RS
QMidiArp XML files containing session data in XML text format.
-.RE
-.I *.qma
-.RS
-Old QMidiArp files in plain text format.
+
.SH EXAMPLES
-Example QMidiArp files can be found in
+Example QMidiArp files can be found in
.I /usr/share/qmidiarp
or in
.I /usr/local/share/qmidiarp
.SH NOTES
-Errors and warnings are written to
+Errors and warnings are written to
.BR stderr (3).
.SH SUPPORT
qmidiarp-devel@lists.sourceforge.net
.SH AUTHORS
-Frank Kober, Guido Scholz and Matthias Nagorni. This
+Frank Kober, Nedko Arnaudov, Guido Scholz and Matthias Nagorni. This
manual page was written by
Frank Kober .
diff -Nru qmidiarp-0.4.2/NEWS qmidiarp-0.4.5/NEWS
--- qmidiarp-0.4.2/NEWS 2011-07-10 08:05:09.000000000 +0000
+++ qmidiarp-0.4.5/NEWS 2012-01-21 17:20:24.000000000 +0000
@@ -1,3 +1,59 @@
+qmidiarp-0.4.5 (2012-01-21)
+
+Fixed Bugs
+ o JACK Transport start with ALSA backend was broken in 0.4.4
+ o Event forwarding port index was uninitialized in JACK MIDI backend
+
+
+qmidiarp-0.4.4 (2011-12-24)
+
+New Features
+ o JACK MIDI backend doesn't require Jack Transport anymore
+
+Improvements
+ o Better usability of the sequencer loop marker
+ o Improved LFO offset slider behavior
+ o Quantization to the minimum stepwidth in Arp modules active when
+ changes in Arp patterns occur
+
+Fixed Bugs
+ o Crash on startup in JACK MIDI mode on certain systems
+ o When cloning modules, the current play direction wasn't copied
+ o Unmatched MIDI event forwarding didn't work with Arp modules
+ o Typo in english manpage
+
+
+qmidiarp-0.4.3 (2011-11-20)
+
+New Features
+ o Groove functions now work for all modules, not only Arps
+ o Effect of groove settings is displayed in the Arp/LFO/Seq screen
+ o LFOs can be triggered and restarted by the keyboard
+ o When reducing the size of LFO waves or Sequences, the original data
+ is kept in memory and is also saved to the session file as a whole
+ o LFO and Seq play direction can now be chosen, and bouncing loops are
+ possible
+ o New user positionable loop marker in Seq module. The marker is
+ placed by left or right mouse click on the bottom cursor line of the
+ sequencer and represents an additional return/loop point. It can be
+ removed again by clicking in the bottom left or right area of the
+ Seq screen.
+ o Triggered one-shot play of LFO and Seqs improved
+ o JACK MIDI backend available. This is now default, use the -a option
+ for getting the ALSA backend
+ o JACK Session support when using JACK MIDI backend
+
+Fixed Bugs
+ o A rounding error led to desync when Arps were used with groove shift
+ o MIDI controls for Groove did not initialize upon "New..."
+ o MIDI Controllers assigned to multiple destinations stopped at the
+ first one encountered and ignored all others
+
+General Changes
+ o JACK MIDI is now the default backend, -a option enables ALSA backend
+ o Obsolete .qma text file import removed
+
+
qmidiarp-0.4.2 (2011-07-10)
New Features
diff -Nru qmidiarp-0.4.2/qmidiarp.desktop qmidiarp-0.4.5/qmidiarp.desktop
--- qmidiarp-0.4.2/qmidiarp.desktop 2011-05-29 18:18:19.000000000 +0000
+++ qmidiarp-0.4.5/qmidiarp.desktop 2011-11-07 21:28:10.000000000 +0000
@@ -5,12 +5,15 @@
Name=QMidiArp
Name[de]=QMidiArp
Name[fr]=QMidiArp
+Name[ru]=QMidiArp
GenericName=Arpeggiator-Sequencer-LFO
GenericName[de]=Arpeggiator-Sequenzer-LFO
GenericName[fr]=Arpégiateur-Séquenceur-LFO
+GenericName[ru]=Арпеджиатор, секвенсер и LFO
Comment=Arpeggiator-Sequencer-LFO
Comment[de]=Arpeggiator-Sequenzer-LFO
Comment[fr]=Arpégiateur-Séquenceur-LFO
+Comment[ru]=Арпеджиатор, секвенсер и LFO
Icon=qmidiarp
MimeType=application/qma;application/qmax;
Exec=qmidiarp
diff -Nru qmidiarp-0.4.2/src/arpscreen.cpp qmidiarp-0.4.5/src/arpscreen.cpp
--- qmidiarp-0.4.2/src/arpscreen.cpp 2011-03-26 12:31:07.000000000 +0000
+++ qmidiarp-0.4.5/src/arpscreen.cpp 2011-12-18 18:08:56.000000000 +0000
@@ -61,6 +61,7 @@
double curstep = 0.0;
int nlines = 0;
int notelen;
+ int dx = 0;
int ypos, xpos;
int octYoffset;
int w = QWidget::width();
@@ -78,7 +79,10 @@
double minTempo = 1.0;
int noctaves = 1;
double vel =1.0;
- //~ int grooveTmp = 0;
+ double v = 0;
+ int grv_cur_sft = 0;
+ int grv_cur_len = 0;
+ int grv_cur_vel = 0;
int grooveIndex = 0;
int chordIndex = 0;
l2 = 0;
@@ -111,9 +115,9 @@
break;
case '>':
- stepWidth /= 2.0;
+ stepWidth *= .5;
if (stepWidth < minTempo)
- minTempo /= 2.0;
+ minTempo *= .5;
break;
case '<':
@@ -158,7 +162,7 @@
break;
case 'h':
- notelen /= 2;
+ notelen *= .5;
break;
default:
@@ -243,14 +247,13 @@
for (l1 = 0; l1 < patternLen; l1++)
{
c = a_pattern.at(l1);
- //~ grooveTmp = (grooveIndex % 2) ? -grooveTick : grooveTick ;
if (c.isDigit())
{
nlines = c.digitValue() + 1;
if (!chordIndex)
{
if (chordMode) chordIndex++;
- curstep += stepWidth; // * (1.0 + 0.01 * (double)grooveTmp);
+ curstep += stepWidth;
grooveIndex++;
}
}
@@ -269,7 +272,7 @@
break;
case '>':
- stepWidth /= 2.0;
+ stepWidth *= .5;
break;
case '<':
@@ -282,7 +285,7 @@
case 'p':
if (!chordMode)
- curstep += stepWidth; // * (1.0 + 0.01 * (double)grooveTmp);
+ curstep += stepWidth;
grooveIndex++;
break;
@@ -311,7 +314,7 @@
break;
case 'h':
- notelen /= 2;
+ notelen *= .5;
break;
default:
@@ -319,34 +322,33 @@
}
}
- if (c.isDigit())
- {
+ grv_cur_sft = ((grooveIndex % 2)) ? 0 : grooveTick ;
+ grv_cur_len = ((grooveIndex % 2)) ? grooveLength : -grooveLength ;
+ grv_cur_vel = ((grooveIndex % 2)) ? grooveVelocity : -grooveVelocity ;
+
+ if (c.isDigit()) {
octYoffset = (octave - minOctave) * (patternMaxIndex + 1);
- x = (curstep - stepWidth) * xscale;
- if (nlines > 0)
- {
+ x = (curstep - stepWidth + 0.01 * (double)grv_cur_sft * stepWidth) * xscale;
+ dx = notelen * (1.0 + 0.005 * (double)grv_cur_len);
+ v = vel * (1.0 + 0.005 * (double)grv_cur_vel) - .8;
+
+ if (nlines > 0) {
pen.setWidth(notestreak_thick);
- pen.setColor(QColor(80 + 60 * (vel - 0.8),
- 160 + 40 * (vel - 0.8),
- 80 + 60 * (vel - 0.8)));
+ pen.setColor(QColor(80 + 60 * v, 160 + 40 * v, 80 + 60 * v));
p.setPen(pen);
ypos = yscale - yscale * (nlines - 1 + octYoffset)
/ (patternMaxIndex + 1) / noctaves
+ ARPSCR_VMARG - 3 + notestreak_thick;
xpos = ARPSCR_HMARG + x + pen.width() / 2;
- p.drawLine(xpos, ypos,
- xpos + notelen - pen.width(), ypos);
+ p.drawLine(xpos, ypos, xpos + dx - pen.width(), ypos);
// Cursor
if (grooveIndex == currentIndex) {
pen.setWidth(notestreak_thick * 2);
p.setPen(pen);
ypos = h - 2;
- xpos = ARPSCR_HMARG + x + pen.width() / 2;
- p.drawLine(xpos, ypos,
- xpos + notelen - pen.width(), ypos);
+ p.drawLine(xpos, ypos, xpos + dx - pen.width(), ypos);
}
pen.setWidth(1);
-
}
}
}
@@ -364,19 +366,10 @@
update();
}
-void ArpScreen::setGrooveTick(int tick)
+void ArpScreen::newGrooveValues(int tick, int vel, int length)
{
grooveTick = tick;
- update();
-}
-void ArpScreen::setGrooveVelocity(int vel)
-{
grooveVelocity = vel;
- update();
-}
-
-void ArpScreen::setGrooveLength(int length)
-{
grooveLength = length;
update();
}
diff -Nru qmidiarp-0.4.2/src/arpscreen.h qmidiarp-0.4.5/src/arpscreen.h
--- qmidiarp-0.4.2/src/arpscreen.h 2011-05-29 18:18:19.000000000 +0000
+++ qmidiarp-0.4.5/src/arpscreen.h 2011-09-09 20:31:44.000000000 +0000
@@ -75,9 +75,7 @@
public slots:
void updateScreen(const QString&);
void updateScreen(int p_index);
- void setGrooveTick(int tick);
- void setGrooveVelocity(int vel);
- void setGrooveLength(int length);
+ void newGrooveValues(int tick, int vel, int length);
void setMuted(bool on);
};
diff -Nru qmidiarp-0.4.2/src/arpwidget.cpp qmidiarp-0.4.5/src/arpwidget.cpp
--- qmidiarp-0.4.2/src/arpwidget.cpp 2011-07-09 15:25:08.000000000 +0000
+++ qmidiarp-0.4.5/src/arpwidget.cpp 2012-01-21 17:14:21.000000000 +0000
@@ -319,11 +319,11 @@
envelopeBox = new QGroupBox(tr("Envelope"), this);
QVBoxLayout *envelopeBoxLayout = new QVBoxLayout;
attackTime = new Slider(0, 20, 1, 1, 0, Qt::Horizontal,
- tr("&Attack (s)"), envelopeBox);
+ tr("&Attack (beats)"), envelopeBox);
connect(attackTime, SIGNAL(valueChanged(int)), this,
SLOT(updateAttackTime(int)));
releaseTime = new Slider(0, 20, 1, 1, 0, Qt::Horizontal,
- tr("&Release (s)"), envelopeBox);
+ tr("&Release (beats)"), envelopeBox);
connect(releaseTime, SIGNAL(valueChanged(int)), this,
SLOT(updateReleaseTime(int)));
@@ -575,78 +575,6 @@
}
}
-void ArpWidget::readDataText(QTextStream& arpText)
-{
- QString qs, qs2;
- MidiCC midiCC;
- qs = arpText.readLine();
- qs2 = qs.section(' ', 0, 0);
- chIn->setCurrentIndex(qs2.toInt());
- qs2 = qs.section(' ', 1, 1);
- repeatPatternThroughChord->setCurrentIndex(qs2.toInt());
- qs = arpText.readLine();
- qs2 = qs.section(' ', 0, 0);
- indexIn[0]->setValue(qs2.toInt());
- qs2 = qs.section(' ', 1, 1);
- indexIn[1]->setValue(qs2.toInt());
- qs = arpText.readLine();
- qs2 = qs.section(' ', 0, 0);
- rangeIn[0]->setValue(qs2.toInt());
- qs2 = qs.section(' ', 1, 1);
- rangeIn[1]->setValue(qs2.toInt());
- qs = arpText.readLine();
- qs2 = qs.section(' ', 0, 0);
- channelOut->setCurrentIndex(qs2.toInt());
- qs2 = qs.section(' ', 1, 1);
- portOut->setCurrentIndex(qs2.toInt());
- qs = arpText.readLine();
- qs2 = qs.section(' ', 0, 0);
- randomTick->setValue(qs2.toInt());
- qs2 = qs.section(' ', 1, 1);
- randomVelocity->setValue(qs2.toInt());
- qs2 = qs.section(' ', 2, 2);
- randomLength->setValue(qs2.toInt());
- qs = arpText.readLine();
- if (qs == "MIDICC")
- {
- qs = arpText.readLine();
- while (qs != "EOCC") {
- qs2 = qs.section(' ', 0, 0);
- int controlID = qs2.toInt();
- qs2 = qs.section(' ', 1, 1);
- int ccnumber = qs2.toInt();
- qs2 = qs.section(' ', 2, 2);
- int channel = qs2.toInt();
- qs2 = qs.section(' ', 3, 3);
- int min = qs2.toInt();
- qs2 = qs.section(' ', 4, 4);
- int max = qs2.toInt();
- midiControl->appendMidiCC(controlID, ccnumber, channel, min, max);
- qs = arpText.readLine();
- }
- qs = arpText.readLine();
- }
- if (qs == "Envelope")
- {
- qs = arpText.readLine();
- qs2 = qs.section(' ', 0, 0);
- attackTime->setValue(qs2.toInt());
- qs2 = qs.section(' ', 1, 1);
- releaseTime->setValue(qs2.toInt());
- qs = arpText.readLine();
- }
- while (!arpText.atEnd()) {
- qs2 = arpText.readLine();
-
- if (qs2.contains("EOP", Qt::CaseSensitivity(TRUE))) {
- break;
- }
- qs += '\n' + qs2;
- }
- patternText->setText(qs);
- modified = false;
-}
-
void ArpWidget::setChIn(int value)
{
chIn->setCurrentIndex(value);
@@ -920,3 +848,42 @@
modified = m;
midiControl->setModified(m);
}
+
+void ArpWidget::handleController(int ccnumber, int channel, int value)
+{
+ bool m;
+ int min, max, sval;
+ QVector cclist= midiControl->ccList;
+
+ for (int l2 = 0; l2 < cclist.count(); l2++) {
+ min = cclist.at(l2).min;
+ max = cclist.at(l2).max;
+
+ if ((ccnumber == cclist.at(l2).ccnumber) &&
+ (channel == cclist.at(l2).channel)) {
+ switch (cclist.at(l2).ID) {
+ case 0: if (min == max) {
+ if (value == max) {
+ m = muteOut->isChecked();
+ muteOut->setChecked(!m);
+ }
+ }
+ else {
+ if (value == max) {
+ muteOut->setChecked(false);
+ }
+ if (value == min) {
+ muteOut->setChecked(true);
+ }
+ }
+ break;
+ case 1:
+ sval = min + ((double)value * (max - min) / 127);
+ selectPatternPreset(sval);
+ break;
+ default:
+ break;
+ }
+ }
+ }
+}
diff -Nru qmidiarp-0.4.2/src/arpwidget.h qmidiarp-0.4.5/src/arpwidget.h
--- qmidiarp-0.4.2/src/arpwidget.h 2011-07-09 10:33:33.000000000 +0000
+++ qmidiarp-0.4.5/src/arpwidget.h 2012-01-21 17:14:21.000000000 +0000
@@ -99,7 +99,7 @@
* instance.
*
* @param p_midiWorker Associated MidiArp Object
- * @param portCount Number of available ALSA MIDI output ports
+ * @param portCount Number of available MIDI output ports
* @param compactStyle If set to True, Widget will use reduced spacing and small fonts
* @param mutedAdd If set to True, the module will be added in muted state
* @param parent The parent widget of this module, i.e. MainWindow
@@ -128,13 +128,6 @@
*/
void readData(QXmlStreamReader& xml);
/*!
-* @brief This function reads all module parameters of this module from an old
-* QMidiArp .qma text stream.
-*
-* @param arpText QTextStream to read from
-*/
- void readDataText(QTextStream& arpText);
-/*!
* @brief This function writes all parameters of this module to an XML stream
* passed by the caller, i.e. MainWindow.
*
@@ -174,6 +167,8 @@
*/
void setModified(bool);
+ int getNextTick() { return midiWorker->nextTick; }
+
/* SIGNALS */
signals:
/*! @brief Emitted to MainWindow::updatePatternPresets saving and deploying modified preset
@@ -241,6 +236,8 @@
*
*/
void setMuted(bool on);
+ void handleController(int ccnumber, int channel, int value);
+ int getGrooveIndex() { return midiWorker->getGrooveIndex(); }
};
#endif
diff -Nru qmidiarp-0.4.2/src/config.h.in qmidiarp-0.4.5/src/config.h.in
--- qmidiarp-0.4.2/src/config.h.in 2011-07-09 15:48:25.000000000 +0000
+++ qmidiarp-0.4.5/src/config.h.in 2012-01-21 17:29:21.000000000 +0000
@@ -80,6 +80,9 @@
/* Define to 1 if the system has the type `_Bool'. */
#undef HAVE__BOOL
+/* Define to enable jack session support */
+#undef JACK_SESSION
+
/* Define to 1 if `lstat' dereferences a symlink specified with a trailing
slash. */
#undef LSTAT_FOLLOWS_SLASHED_SYMLINK
diff -Nru qmidiarp-0.4.2/src/driverbase.h qmidiarp-0.4.5/src/driverbase.h
--- qmidiarp-0.4.2/src/driverbase.h 1970-01-01 00:00:00.000000000 +0000
+++ qmidiarp-0.4.5/src/driverbase.h 2011-12-04 22:01:21.000000000 +0000
@@ -0,0 +1,154 @@
+/* -*- Mode: C++ ; c-basic-offset: 4 -*- */
+/*!
+ * @file driverbase.h
+ * @brief Base class for drivers
+ *
+ * @section LICENSE
+ *
+ * Copyright 2011
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ */
+
+#ifndef DRIVERBASE_H__9383DA6E_DCDB_4840_86DA_6A36E87653D2__INCLUDED
+#define DRIVERBASE_H__9383DA6E_DCDB_4840_86DA_6A36E87653D2__INCLUDED
+
+#include
+
+class DriverBase : public QThread
+{
+public:
+
+ bool useMidiClock, useJackSync;
+ bool forwardUnmatched, queueStatus;
+ int portUnmatched;
+ QString jsFilename;
+
+ virtual void resetTick(unsigned int tick = 0)
+ {
+ m_current_tick = tick;
+ }
+
+ virtual unsigned int getCurrentTick() const
+ {
+ return m_current_tick;
+ }
+
+ virtual void setNextTick(unsigned int next_tick)
+ {
+ if (next_tick > m_current_tick)
+ {
+ m_next_tick = next_tick;
+ }
+ }
+
+ virtual void setTpm(uint64_t ticks_per_minute)
+ {
+ m_tpm = ticks_per_minute;
+ }
+
+ virtual void setUseJackTransport(bool on)
+ {
+ useJackSync = on;
+ }
+
+ virtual void setUseMidiClock(bool on)
+ {
+ useMidiClock = on;
+ }
+
+ virtual void setForwardUnmatched(bool on)
+ {
+ forwardUnmatched = on;
+ }
+
+ virtual void setPortUnmatched(int id)
+ {
+ portUnmatched = id;
+ }
+ virtual void setTempo(int bpm)
+ {
+ tempo = bpm;
+ internalTempo = bpm;
+ }
+
+ // duration is in ticks and is valid only for note on events
+ virtual void sendMidiEvent(MidiEvent ev, int n_tick, unsigned int outport, unsigned int duration = 0) = 0;
+ virtual bool requestEchoAt(int echoTick, bool echo_from_trig = 0) = 0;
+
+
+ virtual void setTransportStatus(bool run) = 0;
+ virtual int getClientId() = 0;
+
+protected:
+ DriverBase(
+ void * callback_context,
+ bool (* midi_event_received_callback)(void * context, MidiEvent ev),
+ void (* tick_callback)(void * context, bool echo_from_trig),
+ uint64_t backend_rate)
+ : m_midi_event_received_callback(midi_event_received_callback)
+ , m_tick_callback(tick_callback)
+ , m_callback_context(callback_context)
+ , m_backend_rate(backend_rate)
+ , m_current_tick(0)
+ , m_next_tick(0)
+ , m_tpm(0)
+ {
+ }
+
+ uint64_t tickToBackendOffset(unsigned int tick)
+ {
+ return (uint64_t)tick * m_backend_rate / m_tpm;
+ }
+
+ unsigned int backendOffsetToTick(uint64_t backend_offset)
+ {
+ return backend_offset * m_tpm / m_backend_rate;
+ }
+
+ uint64_t getCurrentTickBackendOffset()
+ {
+ return tickToBackendOffset(m_current_tick);
+ }
+
+ uint64_t getNextTickBackendOffset()
+ {
+ return tickToBackendOffset(m_next_tick);
+ }
+
+ bool midi_event_received(MidiEvent ev)
+ {
+ return m_midi_event_received_callback(m_callback_context, ev);
+ }
+
+ void tick_callback(bool echo_from_trig)
+ {
+ m_tick_callback(m_callback_context, echo_from_trig);
+ }
+
+ bool (* m_midi_event_received_callback)(void * context, MidiEvent ev);
+ void (* m_tick_callback)(void * context, bool echo_from_trig);
+ void * m_callback_context;
+ uint64_t m_backend_rate; // samples(?) per minute (granularity)
+ unsigned int m_current_tick;
+ unsigned int m_next_tick;
+ uint64_t m_tpm; // ticks per minute
+ int tempo, internalTempo;
+ int portCount;
+};
+
+#endif // #ifndef DRIVERBASE_H__9383DA6E_DCDB_4840_86DA_6A36E87653D2__INCLUDED
diff -Nru qmidiarp-0.4.2/src/engine.cpp qmidiarp-0.4.5/src/engine.cpp
--- qmidiarp-0.4.2/src/engine.cpp 2011-07-09 15:25:08.000000000 +0000
+++ qmidiarp-0.4.5/src/engine.cpp 2012-01-21 17:14:21.000000000 +0000
@@ -1,6 +1,6 @@
/**
* @file engine.cpp
- * @brief Implements the Engine module management class
+ * @brief Implementation of the Engine class
*
* @section LICENSE
*
@@ -29,8 +29,9 @@
#include "engine.h"
-Engine::Engine(GrooveWidget *p_grooveWidget, int p_portCount, QWidget *parent) : QWidget(parent), modified(false)
+Engine::Engine(GrooveWidget *p_grooveWidget, int p_portCount, bool p_alsamidi, QWidget *parent) : QThread(parent), modified(false)
{
+ ready = false;
grooveWidget = p_grooveWidget;
connect(grooveWidget, SIGNAL(newGrooveTick(int)),
this, SLOT(setGrooveTick(int)));
@@ -41,17 +42,36 @@
connect(grooveWidget->midiControl, SIGNAL(setMidiLearn(int, int, int)),
this, SLOT(setMidiLearn(int, int, int)));
portCount = p_portCount;
- seqDriver = new SeqDriver(&midiArpList, &midiLfoList, &midiSeqList, portCount, this);
- connect(seqDriver, SIGNAL(controlEvent(int, int, int)),
- this, SLOT(handleController(int, int, int)));
+
+ if (!p_alsamidi) {
+ driver = new JackDriver(portCount, this, tr_state_cb, midi_event_received_callback, tick_callback);
+ }
+ else {
+ // In case of ALSA MIDI with Jack Transport sync, JackDriver is instantiated with 0 ports
+ // a pointer to jackSync has to be passed to driver
+ jackSync = new JackDriver(0, this, tr_state_cb, midi_event_received_callback, tick_callback);
+ driver = new SeqDriver(jackSync, portCount, this, midi_event_received_callback, tick_callback);
+ }
+
midiLearnFlag = false;
+ midiControllable = true;
grooveTick = 0;
grooveVelocity = 0;
grooveLength = 0;
+ schedDelayTicks = 2;
+ status = false;
+ sendLogEvents = false;
+ useMidiClock = false;
+
+ resetTicks(0);
+ ready = true;
}
-Engine::~Engine(){
+Engine::~Engine()
+{
+ delete driver;
}
+
//Arp handling
void Engine::addMidiArp(MidiArp *midiArp)
{
@@ -66,8 +86,8 @@
void Engine::removeMidiArp(MidiArp *midiArp)
{
- if (seqDriver->runArp && (moduleWindowCount() < 1)) {
- seqDriver->setQueueStatus(false);
+ if (status && (moduleWindowCount() < 1)) {
+ setStatus(false);
}
int i = midiArpList.indexOf(midiArp);
if (i != -1)
@@ -133,8 +153,24 @@
void Engine::sendGroove()
{
- for (int l1 = 0; l1 < midiArpList.count(); l1++) {
- midiArpList.at(l1)->newGrooveValues(grooveTick, grooveVelocity,
+ int l1;
+
+ for (l1 = 0; l1 < midiArpList.count(); l1++) {
+ midiArp(l1)->newGrooveValues(grooveTick, grooveVelocity,
+ grooveLength);
+ arpWidget(l1)->screen->newGrooveValues(grooveTick, grooveVelocity,
+ grooveLength);
+ }
+ for (l1 = 0; l1 < midiSeqList.count(); l1++) {
+ midiSeq(l1)->newGrooveValues(grooveTick, grooveVelocity,
+ grooveLength);
+ seqWidget(l1)->screen->newGrooveValues(grooveTick, grooveVelocity,
+ grooveLength);
+ }
+ for (l1 = 0; l1 < midiLfoList.count(); l1++) {
+ midiLfo(l1)->newGrooveValues(grooveTick, grooveVelocity,
+ grooveLength);
+ lfoWidget(l1)->screen->newGrooveValues(grooveTick, grooveVelocity,
grooveLength);
}
}
@@ -154,8 +190,8 @@
void Engine::removeMidiLfo(MidiLfo *midiLfo)
{
- if (seqDriver->runArp && (moduleWindowCount() < 1)) {
- seqDriver->setQueueStatus(false);
+ if (status && (moduleWindowCount() < 1)) {
+ setStatus(false);
}
int i = midiLfoList.indexOf(midiLfo);
if (i != -1)
@@ -204,8 +240,8 @@
void Engine::removeMidiSeq(MidiSeq *midiSeq)
{
- if (seqDriver->runArp && (moduleWindowCount() < 1)) {
- seqDriver->setQueueStatus(false);
+ if (status && (moduleWindowCount() < 1)) {
+ setStatus(false);
}
int i = midiSeqList.indexOf(midiSeq);
if (i != -1)
@@ -292,6 +328,19 @@
//general
+void Engine::setCompactStyle(bool on)
+{
+ int l1;
+ if (on) {
+ for (l1 = 0; l1 < moduleWindowCount(); l1++)
+ moduleWindow(l1)->setStyleSheet(COMPACT_STYLE);
+ }
+ else {
+ for (l1 = 0; l1 < moduleWindowCount(); l1++)
+ moduleWindow(l1)->setStyleSheet("");
+ }
+}
+
bool Engine::isModified()
{
bool arpmodified = false;
@@ -315,14 +364,12 @@
break;
}
- return modified || seqDriver->isModified()
- || arpmodified || lfomodified || seqmodified;
+ return modified || arpmodified || lfomodified || seqmodified;
}
void Engine::setModified(bool m)
{
modified = m;
- seqDriver->setModified(m);
for (int l1 = 0; l1 < arpWidgetCount(); l1++)
arpWidget(l1)->setModified(m);
@@ -334,284 +381,300 @@
seqWidget(l1)->setModified(m);
}
+/* All following functions are the core engine of QMidiArp. They need to
+ * be made realtime-safe.
+ * They currently call different driver backend functions, which
+ * can eventually (hopefully) get a jackDriver equivalent, so that
+ * switching between the driver backends can be done from here.
+ */
+
int Engine::getPortCount()
{
return(portCount);
}
-void Engine::runQueue(bool on)
+int Engine::getClientId()
{
- if (midiArpList.count() > 0)
- seqDriver->setQueueStatus(on);
+ return driver->getClientId();
}
-int Engine::getAlsaClientId()
+void Engine::setStatus(bool on)
{
- return seqDriver->getAlsaClientId();
-}
-
-void Engine::handleController(int ccnumber, int channel, int value)
-{
- bool m;
- int min, max, sval;
- QVector cclist;
- if (!midiLearnFlag) {
- cclist = grooveWidget->midiControl->ccList;
- for (int l2 = 0; l2 < cclist.count(); l2++) {
- min = cclist.at(l2).min;
- max = cclist.at(l2).max;
- sval = min + ((double)value * (max - min) / 127);
- if ((ccnumber == cclist.at(l2).ccnumber) &&
- (channel == cclist.at(l2).channel)) {
- switch (cclist.at(l2).ID) {
- case 0:
- grooveWidget->grooveTick->setValue(sval);
- return;
- break;
-
- case 1:
- grooveWidget->grooveVelocity->setValue(sval);
- return;
- break;
-
- case 2:
- grooveWidget->grooveLength->setValue(sval);
- return;
- break;
+ if (moduleWindowCount()) {
+ if (!on) {
+ for (int l1 = 0; l1 < midiArpCount(); l1++) {
+ midiArp(l1)->clearNoteBuffer();
+ }
+ }
+ status = on;
+ resetTicks(0);
+ driver->setTransportStatus(on);
+ }
+}
- default:
- break;
+void Engine::tick_callback(void * context, bool echo_from_trig)
+{
+ ((Engine *)context)->echoCallback(echo_from_trig);
+}
+
+void Engine::echoCallback(bool echo_from_trig)
+{
+ int l1, l2;
+ QVector note, velocity;
+ int tick = driver->getCurrentTick();
+ int note_tick = 0;
+ int length;
+ int outport;
+ bool isNew;
+ MidiEvent outEv;
+
+ note.clear();
+ velocity.clear();
+
+ //~ printf(" tick %d ",tick);
+ //~ printf("nextMinLfoTick %d ",nextMinLfoTick);
+ //~ printf("nextMinSeqTick %d ",nextMinSeqTick);
+ //~ printf("nextMinArpTick %d \n",nextMinArpTick);
+
+ //LFO data request and queueing
+ //add 8 ticks to startoff condition to cope with initial sync imperfections
+ if (((tick + 8) >= nextMinLfoTick) && (midiLfoCount())) {
+ for (l1 = 0; l1 < midiLfoCount(); l1++) {
+ if ((echo_from_trig && midiLfo(l1)->gotKbdTrig)
+ || (!midiLfo(l1)->gotKbdTrig && !echo_from_trig)) {
+ if ((tick + 8) >= midiLfo(l1)->nextTick) {
+ outEv.type = EV_CONTROLLER;
+ outEv.data = midiLfo(l1)->ccnumber;
+ outEv.channel = midiLfo(l1)->channelOut;
+ lfoWidget(l1)->screen->updateScreen(lfoWidget(l1)->getFramePtr());
+ midiLfo(l1)->getNextFrame(&lfoData, tick);
+ outport = midiLfo(l1)->portOut;
+ if (!midiLfo(l1)->isMuted) {
+ l2 = 0;
+ while (lfoData.at(l2).value > -1) {
+ if (!lfoData.at(l2).muted) {
+ outEv.value = lfoData.at(l2).value;
+ driver->sendMidiEvent(outEv, lfoData.at(l2).tick
+ , outport);
+ }
+ l2++;
+ }
+ }
}
}
- }
- for (int l1 = 0; l1 < arpWidgetCount(); l1++) {
- cclist = arpWidget(l1)->midiControl->ccList;
- for (int l2 = 0; l2 < cclist.count(); l2++) {
- min = cclist.at(l2).min;
- max = cclist.at(l2).max;
-
- if ((ccnumber == cclist.at(l2).ccnumber) &&
- (channel == cclist.at(l2).channel)) {
- switch (cclist.at(l2).ID) {
- case 0: if (min == max) {
- if (value == max) {
- m = arpWidget(l1)->muteOut->isChecked();
- arpWidget(l1)->muteOut->setChecked(!m);
- return;
- }
- }
- else {
- if (value == max) {
- arpWidget(l1)->muteOut->setChecked(false);
- }
- if (value == min) {
- arpWidget(l1)->muteOut->setChecked(true);
- }
- }
- break;
- case 1:
- sval = min + ((double)value * (max - min)
- / 127);
- arpWidget(l1)->selectPatternPreset(sval);
- return;
- break;
- default:
- break;
+ if (!l1)
+ nextMinLfoTick = midiLfo(l1)->nextTick;
+ else if (midiLfo(l1)->nextTick < nextMinLfoTick)
+ nextMinLfoTick = midiLfo(l1)->nextTick;
+ }
+ driver->requestEchoAt(nextMinLfoTick, 0);
+ }
+
+ //Seq notes data request and queueing
+ //add 8 ticks to startoff condition to cope with initial sync imperfections
+ if (((tick + 8) >= nextMinSeqTick) && (midiSeqCount())) {
+ for (l1 = 0; l1 < midiSeqCount(); l1++) {
+ if ((echo_from_trig && midiSeq(l1)->gotKbdTrig)
+ || (!midiSeq(l1)->gotKbdTrig && !echo_from_trig)) {
+ if ((tick + 8) >= midiSeq(l1)->nextTick) {
+ outEv.type = EV_NOTEON;
+ outEv.value = midiSeq(l1)->vel;
+ outEv.channel = midiSeq(l1)->channelOut;
+ seqWidget(l1)->screen->updateScreen(seqWidget(l1)->getCurrentIndex());
+ midiSeq(l1)->getNextNote(&seqSample, tick);
+ length = midiSeq(l1)->notelength;
+ outport = midiSeq(l1)->portOut;
+ if ((!midiSeq(l1)->isMuted) && (!seqSample.muted)) {
+ outEv.data = seqSample.value;
+ driver->sendMidiEvent(outEv, seqSample.tick, outport, length);
}
}
}
- }
-
- for (int l1 = 0; l1 < lfoWidgetCount(); l1++) {
- cclist = lfoWidget(l1)->midiControl->ccList;
- for (int l2 = 0; l2 < cclist.count(); l2++) {
- min = cclist.at(l2).min;
- max = cclist.at(l2).max;
- if ((ccnumber == cclist.at(l2).ccnumber) &&
- (channel == cclist.at(l2).channel)) {
- switch (cclist.at(l2).ID) {
- case 0: if (min == max) {
- if (value == max) {
- m = lfoWidget(l1)->muteOut->isChecked();
- lfoWidget(l1)->muteOut->setChecked(!m);
- return;
- }
- }
- else {
- if (value == max) {
- lfoWidget(l1)->muteOut->setChecked(false);
- }
- if (value == min) {
- lfoWidget(l1)->muteOut->setChecked(true);
- }
- }
- break;
-
- case 1:
- sval = min + ((double)value * (max - min)
- / 127);
- lfoWidget(l1)->amplitude->setValue(sval);
- return;
- break;
-
- case 2:
- sval = min + ((double)value * (max - min)
- / 127);
- lfoWidget(l1)->offset->setValue(sval);
- return;
- break;
- case 3:
- sval = min + ((double)value * (max - min)
- / 127);
- lfoWidget(l1)->waveFormBox->setCurrentIndex(sval);
- lfoWidget(l1)->updateWaveForm(sval);
- return;
- break;
- case 4:
- sval = min + ((double)value * (max - min)
- / 127);
- lfoWidget(l1)->freqBox->setCurrentIndex(sval);
- lfoWidget(l1)->updateFreq(sval);
- return;
- break;
- case 5: if (min == max) {
- if (value == max) {
- m = lfoWidget(l1)->recordAction->isChecked();
- lfoWidget(l1)->recordAction->setChecked(!m);
- return;
- }
- }
- else {
- if (value == max) {
- lfoWidget(l1)->recordAction->setChecked(true);
- }
- if (value == min) {
- lfoWidget(l1)->recordAction->setChecked(false);
- }
- }
- break;
- case 6:
- sval = min + ((double)value * (max - min)
- / 127);
- lfoWidget(l1)->resBox->setCurrentIndex(sval);
- lfoWidget(l1)->updateRes(sval);
- return;
- break;
- case 7:
- sval = min + ((double)value * (max - min)
- / 127);
- lfoWidget(l1)->sizeBox->setCurrentIndex(sval);
- lfoWidget(l1)->updateSize(sval);
- return;
- break;
-
- default:
- break;
+ if (!l1)
+ nextMinSeqTick = midiSeq(l1)->nextTick;
+ else if (midiSeq(l1)->nextTick < nextMinSeqTick)
+ nextMinSeqTick = midiSeq(l1)->nextTick;
+ }
+ driver->requestEchoAt(nextMinSeqTick, 0);
+ }
+
+ //Arp Note queueing
+ if ((tick + 8) >= nextMinArpTick) {
+ for (l1 = 0; l1 < midiArpCount(); l1++) {
+ if ((echo_from_trig && midiArp(l1)->gotKbdTrig)
+ || (!midiArp(l1)->gotKbdTrig && !echo_from_trig)) {
+ if ((tick + 8) >= midiArp(l1)->nextTick) {
+ outEv.type = EV_NOTEON;
+ outEv.channel = midiArp(l1)->channelOut;
+ midiArp(l1)->newRandomValues();
+ midiArp(l1)->prepareCurrentNote(tick + schedDelayTicks);
+ note = midiArp(l1)->returnNote;
+ velocity = midiArp(l1)->returnVelocity;
+ note_tick = midiArp(l1)->returnTick;
+ length = midiArp(l1)->returnLength * 4;
+ outport = midiArp(l1)->portOut;
+ isNew = midiArp(l1)->returnIsNew;
+ arpWidget(l1)->screen->updateScreen(arpWidget(l1)->getGrooveIndex());
+ if (!velocity.isEmpty()) {
+ if (isNew && velocity.at(0)) {
+ l2 = 0;
+ while(note.at(l2) >= 0) {
+ outEv.data = note.at(l2);
+ outEv.value = velocity.at(l2);
+ driver->sendMidiEvent(outEv, note_tick, outport, length);
+ l2++;
+ }
+ }
}
}
}
+ if (!l1)
+ nextMinArpTick = midiArp(l1)->nextTick - schedDelayTicks;
+ else if (midiArp(l1)->nextTick < nextMinArpTick + schedDelayTicks)
+ nextMinArpTick = midiArp(l1)->nextTick - schedDelayTicks;
}
- for (int l1 = 0; l1 < seqWidgetCount(); l1++) {
- cclist = seqWidget(l1)->midiControl->ccList;
- for (int l2 = 0; l2 < cclist.count(); l2++) {
- min = cclist.at(l2).min;
- max = cclist.at(l2).max;
- if ((ccnumber == cclist.at(l2).ccnumber) &&
- (channel == cclist.at(l2).channel)) {
- switch (cclist.at(l2).ID) {
- case 0: if (min == max) {
- if (value == max) {
- m = seqWidget(l1)->muteOut->isChecked();
- seqWidget(l1)->muteOut->setChecked(!m);
- return;
- }
- }
- else {
- if (value == max) {
- seqWidget(l1)->muteOut->setChecked(false);
- }
- if (value == min) {
- seqWidget(l1)->muteOut->setChecked(true);
- }
- }
- break;
-
- case 1:
- sval = min + ((double)value * (max - min)
- / 127);
- seqWidget(l1)->velocity->setValue(sval);
- return;
- break;
-
- case 2:
- sval = min + ((double)value * (max - min)
- / 127);
- seqWidget(l1)->notelength->setValue(sval);
- return;
- break;
-
- case 3: if (min == max) {
- if (value == max) {
- m = seqWidget(l1)->recordAction->isChecked();
- seqWidget(l1)->recordAction->setChecked(!m);
- return;
- }
- }
- else {
- if (value == max) {
- seqWidget(l1)->recordAction->setChecked(true);
- }
- if (value == min) {
- seqWidget(l1)->recordAction->setChecked(false);
- }
- }
- break;
- case 4:
- sval = min + ((double)value * (max - min)
- / 127);
- seqWidget(l1)->resBox->setCurrentIndex(sval);
- seqWidget(l1)->updateRes(sval);
- return;
- break;
- case 5:
- sval = min + ((double)value * (max - min)
- / 127);
- seqWidget(l1)->sizeBox->setCurrentIndex(sval);
- seqWidget(l1)->updateSize(sval);
- return;
- break;
+ if (0 > nextMinArpTick) nextMinArpTick = 0;
+ if (midiArpCount()) driver->requestEchoAt(nextMinArpTick, 0);
+ }
+}
- default:
- break;
- }
- }
- }
+bool Engine::midi_event_received_callback(void * context, MidiEvent ev)
+{
+ return ((Engine *)context)->eventCallback(ev);
+}
+
+bool Engine::eventCallback(MidiEvent inEv)
+{
+ bool unmatched;
+ int l1;
+ unmatched = true;
+ int tick = driver->getCurrentTick();
+
+ /* Does this cost time or other problems? The signal is sent to the LogWidget.*/
+ if (sendLogEvents) emit midiEventReceived(inEv, tick);
+
+ if (useMidiClock){
+ if (inEv.type == EV_START) {
+ setStatus(true);
+ return(false);
+ }
+ if (inEv.type == EV_STOP) {
+ setStatus(false);
+ return(false);
}
}
- else {
- if (midiLearnWindowID == -1) {
- grooveWidget->midiControl->appendMidiCC(midiLearnID,
- ccnumber, channel, -100, 100);
- midiLearnFlag = false;
- return;
- }
- int min = (midiLearnID) ? 0 : 127; //if control is toggle min=max
- if (moduleWindow(midiLearnWindowID)->objectName().startsWith("Arp")) {
- arpWidget(midiLearnModuleID)->midiControl->appendMidiCC(midiLearnID,
- ccnumber, channel, min, 127);
- }
- if (moduleWindow(midiLearnWindowID)->objectName().startsWith("LFO")) {
- lfoWidget(midiLearnModuleID)->midiControl->appendMidiCC(midiLearnID,
- ccnumber, channel, min, 127);
- }
- if (moduleWindow(midiLearnWindowID)->objectName().startsWith("Seq")) {
- seqWidget(midiLearnModuleID)->midiControl->appendMidiCC(midiLearnID,
- ccnumber, channel, min, 127);
+
+ for (l1 = 0; l1 < midiLfoCount(); l1++) {
+ unmatched = midiLfo(l1)->handleEvent(inEv, tick);
+ if (midiLfo(l1)->gotKbdTrig) {
+ nextMinLfoTick = midiLfo(l1)->nextTick;
+ driver->requestEchoAt(nextMinLfoTick, true);
}
+ }
+ for (l1 = 0; l1 < midiSeqCount(); l1++) {
+ unmatched = midiSeq(l1)->handleEvent(inEv, tick);
+ if (inEv.type == EV_NOTEON && !unmatched && inEv.value) {
+ seqWidget(l1)->processNote(inEv.data, inEv.value);
+ }
+ if (midiSeq(l1)->gotKbdTrig) {
+ nextMinSeqTick = midiSeq(l1)->nextTick;
+ driver->requestEchoAt(nextMinSeqTick, true);
+ }
+ }
+ for (l1 = 0; l1 < midiArpCount(); l1++) {
+ unmatched = midiArp(l1)->handleEvent(inEv, tick, 1);
+ if (midiArp(l1)->gotKbdTrig) {
+ nextMinArpTick = midiArp(l1)->nextTick;
+ driver->requestEchoAt(nextMinArpTick, true);
+ }
+ }
+ if (inEv.type == EV_CONTROLLER) {
+ if (midiControllable) {
+ if (!midiLearnFlag)
+ sendController(inEv.data, inEv.channel, inEv.value);
+ else
+ learnController(inEv.data, inEv.channel);
+ unmatched = false;
+ }
+ }
+
+ return unmatched;
+}
+
+void Engine::sendController(int ccnumber, int channel, int value)
+{
+ int l1;
+
+ grooveWidget->handleController(ccnumber, channel, value);
+
+ for (l1 = 0; l1 < arpWidgetCount(); l1++)
+ arpWidget(l1)->handleController(ccnumber, channel, value);
+ for (l1 = 0; l1 < lfoWidgetCount(); l1++)
+ lfoWidget(l1)->handleController(ccnumber, channel, value);
+ for (l1 = 0; l1 < seqWidgetCount(); l1++)
+ seqWidget(l1)->handleController(ccnumber, channel, value);
+}
+
+void Engine::learnController(int ccnumber, int channel)
+{
+ if (midiLearnWindowID == -1) {
+ grooveWidget->midiControl->appendMidiCC(midiLearnID,
+ ccnumber, channel, -100, 100);
midiLearnFlag = false;
+ return;
+ }
+ int min = (midiLearnID) ? 0 : 127; //if control is toggle min=max
+ if (moduleWindow(midiLearnWindowID)->objectName().startsWith("Arp")) {
+ arpWidget(midiLearnModuleID)->midiControl->appendMidiCC(midiLearnID,
+ ccnumber, channel, min, 127);
+ }
+ if (moduleWindow(midiLearnWindowID)->objectName().startsWith("LFO")) {
+ lfoWidget(midiLearnModuleID)->midiControl->appendMidiCC(midiLearnID,
+ ccnumber, channel, min, 127);
+ }
+ if (moduleWindow(midiLearnWindowID)->objectName().startsWith("Seq")) {
+ seqWidget(midiLearnModuleID)->midiControl->appendMidiCC(midiLearnID,
+ ccnumber, channel, min, 127);
+ }
+
+ midiLearnFlag = false;
+}
+
+void Engine::resetTicks(int curtick)
+{
+ int l1;
+
+ for (l1 = 0; l1 < midiArpCount(); l1++) {
+ midiArp(l1)->foldReleaseTicks(curtick);
+ midiArp(l1)->initArpTick(0);
+ midiArp(l1)->nextTick = 0;
+ }
+ for (l1 = 0; l1 < midiLfoCount(); l1++) {
+ midiLfo(l1)->setFramePtr(0);
+ midiLfo(l1)->nextTick = 0;
}
+ for (l1 = 0; l1 < midiSeqCount(); l1++) {
+ midiSeq(l1)->setCurrentIndex(0);
+ midiSeq(l1)->nextTick = 0;
+ }
+ nextMinLfoTick = 0;
+ nextMinSeqTick = 0;
+ nextMinArpTick = 0;
+}
+
+void Engine::setMidiControllable(bool on)
+{
+ midiControllable = on;
+ modified = true;
+}
+
+void Engine::setUseMidiClock(bool on)
+{
+ setStatus(false);
+ driver->setUseMidiClock(on);
+ useMidiClock = on;
}
void Engine::setMidiLearn(int moduleWindowID, int moduleID, int controlID)
@@ -628,15 +691,22 @@
}
}
-void Engine::setCompactStyle(bool on)
+void Engine::setTempo(int bpm)
{
- int l1;
- if (on) {
- for (l1 = 0; l1 < moduleWindowCount(); l1++)
- moduleWindowList.at(l1)->setStyleSheet(COMPACT_STYLE);
- }
- else {
- for (l1 = 0; l1 < moduleWindowCount(); l1++)
- moduleWindowList.at(l1)->setStyleSheet("");
+ driver->setTempo(bpm);
+ modified = true;
+}
+
+void Engine::setSendLogEvents(bool on)
+{
+ sendLogEvents = on;
+}
+
+void Engine::tr_state_cb(bool on, void *context)
+{
+ if (((Engine *)context)->ready) {
+ if (((Engine *)context)->driver->useJackSync) {
+ ((Engine *)context)->setStatus(on);
+ }
}
}
diff -Nru qmidiarp-0.4.2/src/engine.h qmidiarp-0.4.5/src/engine.h
--- qmidiarp-0.4.2/src/engine.h 2011-07-09 15:25:08.000000000 +0000
+++ qmidiarp-0.4.5/src/engine.h 2012-01-21 17:14:21.000000000 +0000
@@ -1,6 +1,6 @@
/**
* @file engine.h
- * @brief Member definitions for the Engine module management class.
+ * @brief Header file for the Engine class
*
* @section LICENSE
*
@@ -25,10 +25,11 @@
#ifndef ENGINE_H
#define ENGINE_H
-#include
+#include
#include
#include
#include "seqdriver.h"
+#include "jackdriver.h"
#include "midiarp.h"
#include "arpwidget.h"
#include "midilfo.h"
@@ -38,18 +39,19 @@
#include "groovewidget.h"
/*!
- * @brief Manages created module components in lists. Instantiates SeqDriver.
+ * @brief Core Engine Thread. Instantiates SeqDriver and JackDriver.
*
* For each module type there is a QList for each of
* its components (for example MidiArp and ArpWidget). In parallel there is
* a common list for all modules containing their DockWidgets.
- * Engine also instantiates the SeqDriver MIDI backend and handles MIDI
- * controller events through signaling by SeqDriver. Controllers are
- * dispatched to the modules as requiered by their MIDI Learn
- * MidiCCList.
+ * Engine also instantiates the MIDI Driver backend and processes MIDI
+ * events coming in and going out. It dispatches incoming events to the
+ * worker modules and schedules resulting events back to the driver.
+ * Controller events are dispatched to the modules as requiered by their
+ * MIDI Learn MidiCCList.
*
*/
-class Engine : public QWidget {
+class Engine : public QThread {
Q_OBJECT
@@ -63,17 +65,34 @@
QList seqWidgetList;
int portCount;
bool modified;
- int mute_ccnumber, midiLearnID, midiLearnWindowID, midiLearnModuleID;
- bool midi_mutable, midiLearnFlag;
+ int midiLearnID, midiLearnWindowID, midiLearnModuleID;
+ bool midiLearnFlag;
+ bool useMidiClock;
+
+ //From SeqDriver
+ int schedDelayTicks;
+ int nextMinLfoTick;
+ int nextMinSeqTick;
+ int nextMinArpTick;
+ QVector lfoData;
+ Sample seqSample;
+ bool sendLogEvents;
+
+ static bool midi_event_received_callback(void * context, MidiEvent ev);
+ static void tick_callback(void * context, bool echo_from_trig);
+ static void tr_state_cb(bool tr_state, void * context);
public:
int grooveTick, grooveVelocity, grooveLength;
-
- public:
+ bool midiControllable;
+ bool status;
+ bool ready;
GrooveWidget *grooveWidget;
- SeqDriver *seqDriver;
+ JackDriver *jackSync;
+ DriverBase *driver;
- Engine(GrooveWidget *p_grooveWidget, int p_portCount, QWidget* parent=0);
+ public:
+ Engine(GrooveWidget *p_grooveWidget, int p_portCount, bool p_alsamidi, QWidget* parent=0);
~Engine();
int getPortCount();
bool isModified();
@@ -111,10 +130,20 @@
int seqWidgetCount();
MidiSeq *midiSeq(int index);
SeqWidget *seqWidget(int index);
- int getAlsaClientId();
+ int getClientId();
+ void setTempo(int bpm);
+
+ signals:
+/**
+ * @brief This signal is connected to the LogWidget::appendEvent() slot
+ *
+ * @param ev MidiEvent received by Engine
+ * @param tick Set to the tick value at which the event was received
+ */
+ void midiEventReceived(MidiEvent ev, int tick);
public slots:
- void runQueue(bool);
+ void setStatus(bool);
/**
* @brief This function is used to set the modified flag, which is queried before
* loading a new session file or quitting qmidiarp.
@@ -123,13 +152,20 @@
*/
void setModified(bool);
void updatePatternPresets(const QString& n, const QString& p, int index);
- void handleController(int ccnumber, int channel, int value);
+ void sendController(int ccnumber, int channel, int value);
+ void learnController(int ccnumber, int channel);
void setMidiLearn(int moduleWindowID, int moduleID, int controlID);
+ void setMidiControllable(bool on);
void setCompactStyle(bool on);
void setGrooveTick(int grooveTick);
void setGrooveVelocity(int grooveVelocity);
void setGrooveLength(int grooveLength);
void sendGroove();
+ void setSendLogEvents(bool on);
+ void setUseMidiClock(bool on);
+ bool eventCallback(MidiEvent inEv);
+ void echoCallback(bool echo_from_trig);
+ void resetTicks(int curtick);
};
#endif
diff -Nru qmidiarp-0.4.2/src/groovewidget.cpp qmidiarp-0.4.5/src/groovewidget.cpp
--- qmidiarp-0.4.2/src/groovewidget.cpp 2011-07-09 10:33:33.000000000 +0000
+++ qmidiarp-0.4.5/src/groovewidget.cpp 2011-09-02 21:25:05.000000000 +0000
@@ -90,4 +90,33 @@
{
emit(newGrooveLength(val));
}
+void GrooveWidget::handleController(int ccnumber, int channel, int value)
+{
+ int min, max, sval;
+ QVector cclist= midiControl->ccList;
+
+ for (int l2 = 0; l2 < cclist.count(); l2++) {
+ min = cclist.at(l2).min;
+ max = cclist.at(l2).max;
+ sval = min + ((double)value * (max - min) / 127);
+ if ((ccnumber == cclist.at(l2).ccnumber) &&
+ (channel == cclist.at(l2).channel)) {
+ switch (cclist.at(l2).ID) {
+ case 0:
+ grooveTick->setValue(sval);
+ break;
+
+ case 1:
+ grooveVelocity->setValue(sval);
+ break;
+ case 2:
+ grooveLength->setValue(sval);
+ break;
+
+ default:
+ break;
+ }
+ }
+ }
+}
diff -Nru qmidiarp-0.4.2/src/groovewidget.h qmidiarp-0.4.5/src/groovewidget.h
--- qmidiarp-0.4.2/src/groovewidget.h 2011-07-09 10:33:33.000000000 +0000
+++ qmidiarp-0.4.5/src/groovewidget.h 2011-09-02 21:21:35.000000000 +0000
@@ -66,6 +66,7 @@
void updateGrooveVelocity(int);
void updateGrooveTick(int);
void updateGrooveLength(int);
+ void handleController(int ccnumber, int channel, int value);
};
#endif
diff -Nru qmidiarp-0.4.2/src/jackdriver.cpp qmidiarp-0.4.5/src/jackdriver.cpp
--- qmidiarp-0.4.2/src/jackdriver.cpp 1970-01-01 00:00:00.000000000 +0000
+++ qmidiarp-0.4.5/src/jackdriver.cpp 2012-01-04 23:31:06.000000000 +0000
@@ -0,0 +1,495 @@
+/*!
+ * @file jackdriver.cpp
+ * @brief Implements the JackDriver QObject class.
+ *
+ * @section LICENSE
+ *
+ * Copyright 2009, 2010, 2011
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ */
+
+#include "jackdriver.h"
+#include
+
+
+JackDriver::JackDriver(
+ int p_portCount,
+ void * callback_context,
+ void (* p_tr_state_cb)(bool j_tr_state, void * context),
+ bool (* midi_event_received_callback)(void * context, MidiEvent ev),
+ void (* tick_callback)(void * context, bool echo_from_trig))
+ : DriverBase(callback_context, midi_event_received_callback, tick_callback, 60e9)
+{
+ portCount = p_portCount;
+ cbContext = callback_context;
+ trStateCb = p_tr_state_cb;
+ jackRunning = false;
+ portUnmatched = 0;
+ forwardUnmatched = false;
+
+ internalTempo = 120;
+
+/** Initialize and activate Jack with out_port_count ports if we use
+ * JACK driver backend, i.e. portCount > 0 */
+ if (portCount) {
+ callJack(portCount);
+ transportState = getState();
+ jSampleRate = jack_get_sample_rate(jack_handle);
+ setTransportStatus(false);
+ }
+ else {
+ transportState = JackTransportStopped;
+ }
+}
+void JackDriver::callJack(int port_count)
+{
+ if (port_count == -1 && jackRunning) {
+ deactivateJack();
+ if (jack_handle != 0) {
+ jack_client_close(jack_handle);
+ jack_handle = 0;
+ }
+ }
+ else if (port_count != -1) {
+ if (initJack(port_count)) {
+ emit j_shutdown();
+ }
+ else if (activateJack()) {
+ emit j_shutdown();
+ }
+ }
+}
+
+JackDriver::~JackDriver()
+{
+ if (jackRunning) {
+ deactivateJack();
+ }
+ if (jack_handle != 0) {
+ jack_client_close(jack_handle);
+ jack_handle = 0;
+ }
+}
+
+int JackDriver::initJack(int out_port_count)
+{
+ char buf[16];
+
+#ifdef JACK_SESSION
+ if (global_jack_session_uuid.isEmpty() || !out_port_count) {
+ if ((jack_handle = jack_client_open(PACKAGE, JackNullOption, NULL)) == 0) {
+ qCritical("jack server not running?");
+ return 1;
+ }
+ }
+ else if ((jack_handle = jack_client_open(PACKAGE, JackSessionID, NULL, global_jack_session_uuid.data())) == 0) {
+ qCritical("jack server not running?");
+ return 1;
+ }
+#else
+ if ((jack_handle = jack_client_open(PACKAGE, JackNullOption, NULL)) == 0) {
+ qCritical("jack server not running?");
+ return 1;
+ }
+#endif
+
+ jack_on_shutdown(jack_handle, jack_shutdown, (void *)this);
+
+ jack_set_process_callback(jack_handle, process_callback, (void *)this);
+
+ qWarning("jack process callback registered");
+
+ if (!out_port_count) return(0);
+
+ // register JACK MIDI input port
+ if ((in_port = jack_port_register(jack_handle, "in", JACK_DEFAULT_MIDI_TYPE, JackPortIsInput, 0)) == 0) {
+ qCritical("Failed to register JACK MIDI input port.");
+ return 1;
+ }
+
+ // register JACK MIDI output ports
+ for (int l1 = 0; l1 < out_port_count; l1++)
+ {
+ snprintf(buf, sizeof(buf), "out %d", l1 + 1);
+ if ((out_ports[l1] = jack_port_register(jack_handle, buf, JACK_DEFAULT_MIDI_TYPE, JackPortIsOutput, 0)) == 0)
+ {
+ qCritical("Failed to register JACK MIDI output port.");
+ return 1;
+ }
+ }
+
+#ifdef JACK_SESSION
+ jack_set_session_callback(jack_handle, session_callback, (void *)this);
+ qWarning("Session callback registered");
+#endif
+
+ return(0);
+}
+
+int JackDriver::activateJack()
+{
+ if (jack_activate(jack_handle)) {
+ qWarning("cannot activate client");
+ jackRunning = false;
+ return(1);
+ }
+
+ jackRunning = true;
+ return(0);
+}
+
+int JackDriver::deactivateJack()
+{
+ if (!jackRunning) return(0);
+
+ if (jack_deactivate(jack_handle)) {
+ qWarning("cannot deactivate client");
+ return(1);
+ }
+ jackRunning = false;
+ qWarning("jack client deactivated");
+ return(0);
+}
+
+void JackDriver::jack_shutdown(void *arg)
+{
+ JackDriver *rd = (JackDriver *) arg;
+ rd->setJackRunning(false);
+
+ qWarning("JACK shut down. JACK sync Disabled.");
+ emit rd->j_shutdown();
+}
+
+int JackDriver::process_callback(jack_nframes_t nframes, void *arg)
+{
+ uint i;
+ uint l1, l2, size;
+
+ JackDriver *rd = (JackDriver *) arg;
+ uint out_port_count = rd->portCount;
+ rd->jackTrCheckState();
+
+ if (!out_port_count) return (0);
+
+ int cur_tempo = rd->tempo;
+ uint64_t cur_j_frame = rd->curJFrame;
+ bool forward_unmatched = rd->forwardUnmatched;
+ int port_unmatched = rd->portUnmatched;
+
+ uint nexttick = 0;
+ uint tmptick = 0;
+ uint idx = 0;
+ int evport;
+ uint64_t ev_jframe, ev_sample;
+ uint ev_inframe;
+ MidiEvent inEv;
+ inEv.type = 0;
+ inEv.data = 0;
+ inEv.channel = 0;
+ inEv.value = 0;
+ MidiEvent outEv;
+ outEv.channel = 0;
+
+
+ unsigned char* buffer;
+ jack_midi_event_t in_event;
+ jack_nframes_t event_index = 0;
+ jack_nframes_t j_sample_rate = rd->jSampleRate;
+ void *in_buf = jack_port_get_buffer(rd->in_port, nframes);
+ void *out_buf[out_port_count];
+ for (l1 = 0; l1 < out_port_count; l1++) {
+ out_buf[l1] = jack_port_get_buffer(rd->out_ports[l1], nframes);
+ }
+ for (l1 = 0; l1 < out_port_count; l1++) {
+ jack_midi_clear_buffer(out_buf[l1]);
+ }
+
+ jack_nframes_t event_count = jack_midi_get_event_count(in_buf);
+ jack_midi_event_get(&in_event, in_buf, 0);
+
+ for(i = 0; i < nframes; i++) {
+
+ /** MIDI Output queue first **/
+ size = rd->evTickQueue.size();
+ if (size) { /** If we have events, find earliest event tick **/
+ idx = 0;
+ nexttick = rd->evTickQueue.head();
+ for (l1 = 0; l1 < size; l1++) {
+ tmptick = rd->evTickQueue.at(l1);
+ if (nexttick > tmptick) {
+ idx = l1;
+ nexttick = tmptick;
+ }
+ }
+ ev_sample = (uint64_t)j_sample_rate * 60 * nexttick / (TPQN * cur_tempo);
+ ev_jframe = ev_sample / nframes;
+ ev_inframe = ev_sample % nframes;
+ if ((ev_jframe <= cur_j_frame) && (ev_inframe <= i)) {
+ //qWarning("nexttick %d, ev_frame %d, ev_inframe %d, cur_jframe %d", nexttick, ev_jframe, ev_inframe, cur_j_frame);
+ outEv = rd->evQueue.takeAt(idx);
+ evport = rd->evPortQueue.takeAt(idx);
+ rd->evTickQueue.removeAt(idx);
+ int k = 0;
+ if ((ev_jframe) <= cur_j_frame) {
+ do {
+ if ((ev_jframe) < cur_j_frame) {
+ ev_inframe = 0;
+ }
+ buffer = jack_midi_event_reserve(out_buf[evport], ev_inframe + k, 3);
+ k++;
+ } while (buffer == NULL);
+
+ buffer[2] = outEv.value; /** velocity / value **/
+ buffer[1] = outEv.data; /** note / controller **/
+ if (outEv.type == EV_NOTEON) buffer[0] = 0x90;
+ if (outEv.type == EV_CONTROLLER) buffer[0] = 0xb0;
+ buffer[0] += outEv.channel;
+ }
+ }
+ }
+ /** MIDI Input handling **/
+ while ((in_event.time == i) && (event_index < event_count)) {
+
+ if( ((*(in_event.buffer) & 0xf0)) == 0x90 ) {
+ inEv.type = EV_NOTEON;
+ inEv.value = *(in_event.buffer + 2);
+ }
+ else if( ((*(in_event.buffer)) & 0xf0) == 0x80 ) {
+ inEv.type = EV_NOTEON;
+ inEv.value = 0;
+ }
+ else if( ((*(in_event.buffer)) & 0xf0) == 0xa0 ) {
+ inEv.type = EV_KEYPRESS;
+ inEv.value = *(in_event.buffer + 2);
+ }
+ else if( ((*(in_event.buffer)) & 0xf0) == 0xb0 ) {
+ inEv.type = EV_CONTROLLER;
+ inEv.value = *(in_event.buffer + 2);
+ }
+ else if( ((*(in_event.buffer)) & 0xf0) == 0xc0 ) {
+ inEv.type = EV_PGMCHANGE;
+ inEv.value = *(in_event.buffer + 1);
+ }
+ else if( ((*(in_event.buffer)) & 0xf0) == 0xd0 ) {
+ inEv.type = EV_CHANPRESS;
+ inEv.value = *(in_event.buffer + 1);
+ }
+ else if( ((*(in_event.buffer)) & 0xf0) == 0xe0 ) {
+ inEv.type = EV_PITCHBEND;
+ inEv.value = *(in_event.buffer + 2) * 128;
+ inEv.value += *(in_event.buffer + 1);
+ inEv.value -= 8192;
+ }
+ else inEv.type = EV_NONE;
+
+ inEv.data = *(in_event.buffer + 1);
+ inEv.channel = (*(in_event.buffer)) & 0x0f;
+ bool unmatched = rd->midi_event_received(inEv);
+
+ if (unmatched && forward_unmatched) {
+ buffer = jack_midi_event_reserve(out_buf[port_unmatched], i, in_event.size);
+ if (buffer) {
+ for (l2 = 0; l2 < in_event.size; l2++) {
+ buffer[l2] = *(in_event.buffer + l2);
+ }
+ }
+ }
+
+ event_index++;
+ if(event_index < event_count)
+ jack_midi_event_get(&in_event, in_buf, event_index);
+ }
+ }
+ rd->handleEchoes(nframes);
+ return(0);
+}
+
+#ifdef JACK_SESSION
+void JackDriver::session_callback(jack_session_event_t *event, void *arg )
+{
+ JackDriver *rd = (JackDriver *) arg;
+ rd->jsEv = event;
+ rd->jack_session_event();
+}
+
+bool JackDriver::jack_session_event()
+{
+ jsFilename = jsEv->session_dir;
+ jsFilename += JSFILENAME;
+
+ QString cmd = PACKAGE " ${SESSION_DIR}" JSFILENAME " --jack_session_uuid ";
+ cmd += jsEv->client_uuid;
+ cmd += " --portCount "+QString::number(portCount);
+ emit jsEvent(0);
+
+ jsEv->command_line = strdup(cmd.toAscii());
+
+ jack_session_reply(jack_handle, jsEv);
+
+ if(jsEv->type == JackSessionSaveAndQuit) emit jsEvent(1);
+
+ jack_session_event_free(jsEv);
+
+ return false;
+}
+#endif
+
+
+void JackDriver::jackTrCheckState()
+{
+ if (!useJackSync) return;
+
+ int state = getState();
+
+ if (transportState == state) return;
+
+ transportState = state;
+ switch (state){
+ case JackTransportStopped:
+ trStateCb(false, cbContext);
+ qWarning( "[JackTransportStopped]" );
+ break;
+
+ case JackTransportRolling:
+ trStateCb(true, cbContext);
+ qWarning( "[JackTransportRolling]" );
+ break;
+
+ case JackTransportStarting:
+ qWarning( "[JackTransportStarting]" );
+ break;
+
+ case JackTransportLooping:
+ qWarning( "[JackTransportLooping]" );
+ break;
+ default:
+ break;
+ }
+}
+
+jack_transport_state_t JackDriver::getState()
+{
+ return jack_transport_query(jack_handle, ¤tPos);
+}
+
+void JackDriver::setJackRunning(bool on)
+{
+ jackRunning = on;
+}
+
+jack_position_t JackDriver::getCurrentPos()
+{
+ return currentPos;
+}
+
+void JackDriver::sendMidiEvent(MidiEvent ev, int n_tick, unsigned outport, unsigned duration)
+{
+ //qWarning("sendMidiEvent([%d, %d, %d, %d], %u, %u) at tick %d", ev.type, ev.channel, ev.data, ev.value, outport, duration, n_tick);
+ evQueue.append(ev);
+ evTickQueue.append(n_tick);
+ evPortQueue.append(outport);
+
+ if ((ev.type == EV_NOTEON) && (ev.value)) {
+ ev.value = 0;
+ evQueue.append(ev);
+ evTickQueue.append(n_tick + duration / 4);
+ evPortQueue.append(outport);
+ }
+}
+
+bool JackDriver::requestEchoAt(int echo_tick, bool echo_from_trig)
+{
+ if ((echo_tick == (int)lastSchedTick) && (echo_tick)) return false;
+ echoTickQueue.append(echo_tick);
+ lastSchedTick = echo_tick;
+ if (echo_from_trig) tick_callback(true);
+
+ return true;
+
+}
+
+void JackDriver::handleEchoes(int nframes)
+{
+ curJFrame++;
+
+ if (!queueStatus) return;
+
+ int l1;
+ int size = echoTickQueue.size();
+ int nexttick, tmptick, idx;
+
+ if (useJackSync) {
+ m_current_tick = ((uint64_t)currentPos.frame * TPQN * tempo
+ / (currentPos.frame_rate * 60)) - jackOffsetTick;
+ }
+ else {
+ m_current_tick = (uint64_t)curJFrame * TPQN * tempo * nframes
+ / (jSampleRate * 60);
+ }
+ if (!size) return;
+
+ idx = 0;
+ nexttick = echoTickQueue.head();
+
+ for (l1 = 0; l1 < size; l1++) {
+ tmptick = echoTickQueue.at(l1);
+ if (nexttick > tmptick) {
+ idx = l1;
+ nexttick = tmptick;
+ }
+ }
+ if (m_current_tick >= echoTickQueue.at(idx)) {
+ echoTickQueue.removeAt(idx);
+ tick_callback(false);
+ }
+}
+
+void JackDriver::setTransportStatus(bool on)
+{
+ jack_position_t jpos = getCurrentPos();
+ if (useJackSync) {
+ if (jpos.beats_per_minute > 0.01)
+ tempo = (int)jpos.beats_per_minute;
+ else
+ tempo = internalTempo;
+
+ jackOffsetTick = (uint64_t)jpos.frame * TPQN
+ * tempo / (jpos.frame_rate * 60);
+ }
+ else {
+ tempo = internalTempo;
+ }
+
+ m_current_tick = 0;
+
+ if (on) {
+ curJFrame = 0;
+ lastSchedTick = 0;
+ echoTickQueue.clear();
+ evQueue.clear();
+ evTickQueue.clear();
+ evPortQueue.clear();
+ requestEchoAt(0);
+ qWarning("Internal Transport started");
+ }
+ else {
+ qWarning("Internal Transport stopped");
+ }
+
+ queueStatus = on;
+}
diff -Nru qmidiarp-0.4.2/src/jackdriver.h qmidiarp-0.4.5/src/jackdriver.h
--- qmidiarp-0.4.2/src/jackdriver.h 1970-01-01 00:00:00.000000000 +0000
+++ qmidiarp-0.4.5/src/jackdriver.h 2011-12-07 21:59:44.000000000 +0000
@@ -0,0 +1,122 @@
+/*!
+ * @file jackdriver.h
+ * @brief Headers for the JackDriver QObject class.
+ *
+ * @section LICENSE
+ *
+ * Copyright 2009, 2010, 2011
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ */
+#ifndef JACKSYNC_H
+#define JACKSYNC_H
+
+#include
+#include
+#include "config.h"
+#include
+#include
+#include
+
+#ifdef JACK_SESSION
+#include
+#endif
+
+#include "main.h"
+#include "driverbase.h"
+
+/*!
+ * The JackDriver class is a QObject providing access to the MIDI interface
+ * of the Jack Audio Connection Kit (JACK) transport system. It provides
+ * functions to register and initialise a jack client and to read the
+ * current frame position of a transport master. It establishes input and
+ * output ports if requested and implements a sequencer queue based on
+ * QQueue objects.
+ *
+ * @brief QObject class implementing a JACK MIDI and transport interface.
+ */
+class JackDriver : public DriverBase
+{
+ Q_OBJECT
+
+ private:
+ static int process_callback(jack_nframes_t nframes, void *arg);
+ static void jack_shutdown(void *arg);
+#ifdef JACK_SESSION
+ static void session_callback(jack_session_event_t *ev, void *arg);
+#endif
+ void update_ports();
+
+ jack_port_t * in_port;
+ jack_port_t * out_ports[MAX_PORTS];
+
+ bool jackRunning;
+ int transportState;
+ uint lastSchedTick;
+ uint jackOffsetTick;
+ uint64_t curJFrame;
+ QQueue echoTickQueue;
+ QQueue evQueue;
+ QQueue evTickQueue;
+ QQueue evPortQueue;
+ jack_client_t *jack_handle;
+ jack_position_t currentPos;
+ void handleEchoes(int nframes);
+
+#ifdef JACK_SESSION
+ public:
+ jack_session_event_t *jsEv;
+ bool jack_session_event();
+#endif
+
+
+ public:
+ JackDriver(int p_portCount,
+ void * callback_context,
+ void (* p_tr_state_cb)(bool j_tr_state, void * context),
+ bool (* midi_event_received_callback)(void * context, MidiEvent ev),
+ void (* tick_callback)(void * context, bool echo_from_trig));
+ ~JackDriver();
+
+ void (* trStateCb)(bool j_tr_state, void * context);
+ void * cbContext;
+
+ signals:
+ void j_shutdown();
+ void jsEvent(int type);
+
+ public:
+ jack_nframes_t jSampleRate;
+ bool isRunning() { return jackRunning; }
+ int initJack(int out_port_count);
+ int activateJack();
+ int deactivateJack();
+
+ void setJackRunning(bool on);
+
+ void sendMidiEvent(MidiEvent ev, int n_tick, unsigned int outport, unsigned int duration = 0);
+ jack_transport_state_t getState();
+ void jackTrCheckState();
+ jack_position_t getCurrentPos();
+ bool requestEchoAt(int echoTick, bool echo_from_trig = 0);
+ void setTransportStatus(bool run);
+ int getClientId() {return 0; }
+ void callJack(int port_count);
+};
+
+
+#endif
diff -Nru qmidiarp-0.4.2/src/jacksync.cpp qmidiarp-0.4.5/src/jacksync.cpp
--- qmidiarp-0.4.2/src/jacksync.cpp 2011-07-09 15:25:08.000000000 +0000
+++ qmidiarp-0.4.5/src/jacksync.cpp 1970-01-01 00:00:00.000000000 +0000
@@ -1,148 +0,0 @@
-/*!
- * @file jacksync.cpp
- * @brief Implements the JackSync QObject class.
- *
- * @section LICENSE
- *
- * Copyright 2009, 2010, 2011
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
- * MA 02110-1301, USA.
- *
- */
-
-#include "jacksync.h"
-#include "config.h"
-
-
-JackSync::JackSync(void (* p_tr_state_cb)(bool j_tr_state, void * context),
- void * p_cb_context)
-{
- transportState = JackTransportStopped;
- cbContext = p_cb_context;
- trStateCb = p_tr_state_cb;
- }
-
-JackSync::~JackSync()
-{
- if (jackRunning) {
- deactivateJack();
- }
- if (jack_handle != 0) {
- jack_client_close(jack_handle);
- jack_handle = 0;
- }
-}
-
-int JackSync::initJack()
-{
- if ((jack_handle = jack_client_open(PACKAGE, JackNullOption, NULL)) == 0) {
- qCritical("jack server not running?");
- return 1;
- }
-
- jack_on_shutdown(jack_handle, jack_shutdown, (void *)this);
-
- jack_set_process_callback(jack_handle, process_callback, (void *)this);
-
- qWarning("jack process callback registered");
-
- return(0);
-}
-
-int JackSync::activateJack()
-{
- if (jack_activate(jack_handle)) {
- qWarning("cannot activate client");
- jackRunning = false;
- return(1);
- }
-
- jackRunning = true;
- return(0);
-}
-
-int JackSync::deactivateJack()
-{
- if (jackRunning) {
- if (jack_deactivate(jack_handle)) {
- qWarning("cannot deactivate client");
- return(1);
- }
- jackRunning = false;
- qWarning("jack client deactivated");
- }
- return(0);
-}
-
-void JackSync::jack_shutdown(void *arg)
-{
- JackSync *rd = (JackSync *) arg;
- rd->setJackRunning(false);
-
- qWarning("JACK shut down. JACK sync Disabled.");
- emit rd->j_shutdown();
-}
-
-int JackSync::process_callback(jack_nframes_t nframes, void *arg)
-{
- ((JackSync *)arg)->jackTrCheckState();
- return(0);
-}
-
-void JackSync::jackTrCheckState()
-{
- int state = getState();
-
- if (transportState == state) return;
-
- transportState = state;
- switch (state){
- case JackTransportStopped:
- trStateCb(false, cbContext);
- qWarning( "[JackTransportStopped]" );
- break;
-
- case JackTransportRolling:
- trStateCb(true, cbContext);
- qWarning( "[JackTransportRolling]" );
- break;
-
- case JackTransportStarting:
- qWarning( "[JackTransportStarting]" );
- break;
-
- case JackTransportLooping:
- qWarning( "[JackTransportLooping]" );
- break;
- default:
- break;
- }
-}
-
-jack_transport_state_t JackSync::getState()
-{
- return jack_transport_query(jack_handle, ¤tPos);
-}
-
-void JackSync::setJackRunning(bool on)
-{
- jackRunning = on;
-}
-
-jack_position_t JackSync::getCurrentPos()
-{
- return currentPos;
-}
diff -Nru qmidiarp-0.4.2/src/jacksync.h qmidiarp-0.4.5/src/jacksync.h
--- qmidiarp-0.4.2/src/jacksync.h 2011-07-09 15:25:08.000000000 +0000
+++ qmidiarp-0.4.5/src/jacksync.h 1970-01-01 00:00:00.000000000 +0000
@@ -1,79 +0,0 @@
-/*!
- * @file jacksync.h
- * @brief Headers for the JackSync QObject class.
- *
- * @section LICENSE
- *
- * Copyright 2009, 2010, 2011
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
- * MA 02110-1301, USA.
- *
- */
-#ifndef JACKSYNC_H
-#define JACKSYNC_H
-
-#include
-#include
-#include
-
-/*!
- * The JackSync class is a QObject providing access to the transport status
- * of the Jack Audio Connection Kit (JACK) transport system. It provides
- * functions to register and initialise a jack client and to read the
- * current frame position of a transport master.
- *
- * @brief QObject class providing access to jack transport status.
- */
-class JackSync : public QObject
-{
- Q_OBJECT
-
- private:
- static int process_callback(jack_nframes_t nframes, void *arg);
- static void jack_shutdown(void *arg);
-
- bool jackRunning;
- int transportState;
- jack_client_t *jack_handle;
- jack_position_t currentPos;
-
-
- public:
- JackSync(void (* p_tr_state_cb)(bool j_tr_state, void * context),
- void * p_cb_context);
- ~JackSync();
-
- void (* trStateCb)(bool j_tr_state, void * context);
- void * cbContext;
-
- signals:
- void j_shutdown();
-
- public:
- bool isRunning() { return jackRunning; }
- int initJack();
- int activateJack();
- int deactivateJack();
-
- void setJackRunning(bool on);
-
- jack_transport_state_t getState();
- void jackTrCheckState();
- jack_position_t getCurrentPos();
-};
-
-
-#endif
diff -Nru qmidiarp-0.4.2/src/lfoscreen.cpp qmidiarp-0.4.5/src/lfoscreen.cpp
--- qmidiarp-0.4.2/src/lfoscreen.cpp 2011-07-09 10:33:33.000000000 +0000
+++ qmidiarp-0.4.5/src/lfoscreen.cpp 2012-01-11 22:18:36.000000000 +0000
@@ -38,6 +38,9 @@
mouseY = 0;
xMax = LFOSCR_HMARG;
currentIndex = 0;
+ grooveTick = 0;
+ grooveVelocity = 0;
+ grooveLength = 0;
isMuted = false;
}
@@ -66,6 +69,7 @@
int x, x1;
int beatRes = 1;
int beatDiv = 0;
+ int grooveTmp = 0;
l2 = 0;
//Grid
@@ -128,9 +132,10 @@
pen.setWidth(notestreak_thick);
p.setPen(pen);
+ grooveTmp = (beatRes < 32) ? grooveTick : 0;
for (l1 = 0; l1 < npoints; l1++) {
- x = l1 * xscale * nsteps / npoints;
+ x = (l1 + .01 * (double)grooveTmp * (l1 % 2)) * nsteps * xscale / npoints;
ypos = yscale - yscale * p_data.at(l1).value / 128
+ LFOSCR_VMARG;
xpos = LFOSCR_HMARG + x + pen.width() / 2;
@@ -149,7 +154,7 @@
pen.setWidth(notestreak_thick * 2);
pen.setColor(QColor(200, 180, 70));
p.setPen(pen);
- x = currentIndex * xscale * (int)nsteps / npoints;
+ x = (currentIndex + .01 * (double)grooveTmp * (currentIndex % 2)) * xscale * (int)nsteps / npoints;
xpos = LFOSCR_HMARG + x + pen.width() / 2;
p.drawLine(xpos, h - 2,
xpos + (xscale / beatRes) - pen.width(), h - 2);
@@ -240,6 +245,14 @@
recordMode = on;
}
+void LfoScreen::newGrooveValues(int tick, int vel, int length)
+{
+ grooveTick = tick;
+ grooveVelocity = vel;
+ grooveLength = length;
+ update();
+}
+
QSize LfoScreen::sizeHint() const
{
return QSize(LFOSCR_MIN_W, LFOSCR_MIN_H);
diff -Nru qmidiarp-0.4.2/src/lfoscreen.h qmidiarp-0.4.5/src/lfoscreen.h
--- qmidiarp-0.4.2/src/lfoscreen.h 2011-07-09 10:33:33.000000000 +0000
+++ qmidiarp-0.4.5/src/lfoscreen.h 2011-10-31 10:13:36.000000000 +0000
@@ -62,6 +62,7 @@
private:
//QTimer *timer;
QVector p_data, data;
+ int grooveTick, grooveVelocity, grooveLength;
int mouseX, mouseY, mouseW;
int w, h;
int xMax;
@@ -91,6 +92,7 @@
void mousePressEvent(QMouseEvent* event);
void setRecord(bool on);
void wheelEvent(QWheelEvent* event);
+ void newGrooveValues(int tick, int vel, int length);
void setMuted(bool on);
};
diff -Nru qmidiarp-0.4.2/src/lfowidget.cpp qmidiarp-0.4.5/src/lfowidget.cpp
--- qmidiarp-0.4.2/src/lfowidget.cpp 2011-07-09 10:33:33.000000000 +0000
+++ qmidiarp-0.4.5/src/lfowidget.cpp 2012-01-21 17:14:21.000000000 +0000
@@ -51,7 +51,7 @@
int l1;
QStringList midiCCNames;
midiCCNames << "MuteToggle" << "Amplitude" << "Offset" << "WaveForm" << "Frequency"
- << "RecordToggle"<< "Resolution"<< "Size" << "unknown";
+ << "RecordToggle"<< "Resolution"<< "Size" << "LoopMode" << "unknown";
midiControl = new MidiControl(midiCCNames);
manageBox = new ManageBox("LFO:", true, this);
@@ -59,6 +59,28 @@
// Input group box on right top
QGroupBox *inBox = new QGroupBox(tr("Input"), this);
+ QLabel *enableNoteOffLabel = new QLabel(tr("&Note Off"),inBox);
+ enableNoteOff = new QCheckBox(this);
+ connect(enableNoteOff, SIGNAL(toggled(bool)), this, SLOT(updateEnableNoteOff(bool)));
+ enableNoteOffLabel->setBuddy(enableNoteOff);
+ enableNoteOff->setToolTip(tr("Stop output when Note is released"));
+
+ QLabel *enableRestartByKbdLabel = new QLabel(tr("&Restart"),inBox);
+ enableRestartByKbd = new QCheckBox(this);
+ connect(enableRestartByKbd, SIGNAL(toggled(bool)), this, SLOT(updateEnableRestartByKbd(bool)));
+ enableRestartByKbdLabel->setBuddy(enableRestartByKbd);
+ enableRestartByKbd->setToolTip(tr("Restart sequence when a new note is received"));
+
+ QLabel *enableTrigByKbdLabel = new QLabel(tr("&Trigger"),inBox);
+ enableTrigByKbd = new QCheckBox(this);
+ connect(enableTrigByKbd, SIGNAL(toggled(bool)), this, SLOT(updateEnableTrigByKbd(bool)));
+ enableTrigByKbdLabel->setBuddy(enableTrigByKbd);
+ enableTrigByKbd->setToolTip(tr("Retrigger sequence when a new note is received"));
+
+ enableNoteOff->setChecked(false);
+ enableRestartByKbd->setChecked(false);
+ enableTrigByKbd->setChecked(false);
+
QLabel *ccnumberInLabel = new QLabel(tr("MIDI &CC#"), inBox);
ccnumberInBox = new QSpinBox(inBox);
ccnumberInLabel->setBuddy(ccnumberInBox);
@@ -80,8 +102,14 @@
inBoxLayout->addWidget(ccnumberInLabel, 0, 0);
inBoxLayout->addWidget(ccnumberInBox, 0, 1);
- inBoxLayout->addWidget(chInLabel, 2, 0);
- inBoxLayout->addWidget(chIn, 2, 1);
+ inBoxLayout->addWidget(enableNoteOffLabel, 1, 0);
+ inBoxLayout->addWidget(enableNoteOff, 1, 1);
+ inBoxLayout->addWidget(enableRestartByKbdLabel, 2, 0);
+ inBoxLayout->addWidget(enableRestartByKbd, 2, 1);
+ inBoxLayout->addWidget(enableTrigByKbdLabel, 3, 0);
+ inBoxLayout->addWidget(enableTrigByKbd, 3, 1);
+ inBoxLayout->addWidget(chInLabel, 4, 0);
+ inBoxLayout->addWidget(chIn, 4, 1);
if (compactStyle) {
inBoxLayout->setSpacing(1);
inBoxLayout->setMargin(2);
@@ -225,6 +253,18 @@
SLOT(updateSize(int)));
midiControl->addMidiLearnMenu(sizeBox, 7);
+ loopBox = new QComboBox(waveBox);
+ names.clear();
+ names << "->_>" << " <_<-" << "->_<" << " >_<-" << "->_|" << " |_<-";
+ loopBox->insertItems(0, names);
+ loopBox->setCurrentIndex(0);
+ loopBox->setToolTip(tr("Loop, bounce or play once going forward or backward"));
+ loopBox->setMinimumContentsLength(5);
+ connect(loopBox, SIGNAL(activated(int)), this,
+ SLOT(updateLoop(int)));
+ midiControl->addMidiLearnMenu(loopBox, 8);
+
+
QLabel *recordButtonLabel = new QLabel(tr("Re&cord"), waveBox);
recordAction = new QAction(QIcon(seqrecord_xpm), tr("Re&cord"), waveBox);
recordAction->setToolTip(tr("Record incoming controller"));
@@ -258,8 +298,9 @@
}
QGridLayout *paramBoxLayout = new QGridLayout;
- paramBoxLayout->addWidget(recordButtonLabel, 0, 0);
- paramBoxLayout->addWidget(recordButton, 0, 1);
+ paramBoxLayout->addWidget(loopBox, 0, 0, 1, 2);
+ paramBoxLayout->addWidget(recordButtonLabel, 1, 0);
+ paramBoxLayout->addWidget(recordButton, 1, 1);
paramBoxLayout->addWidget(waveFormBoxLabel, 0, 2);
paramBoxLayout->addWidget(waveFormBox, 0, 3);
paramBoxLayout->addWidget(freqBoxLabel, 1, 2);
@@ -314,6 +355,12 @@
xml.writeStartElement(manageBox->name.left(3));
xml.writeAttribute("name", manageBox->name.mid(manageBox->name.indexOf(':') + 1));
xml.writeStartElement("input");
+ xml.writeTextElement("enableNoteOff", QString::number(
+ midiWorker->enableNoteOff));
+ xml.writeTextElement("restartByKbd", QString::number(
+ midiWorker->restartByKbd));
+ xml.writeTextElement("trigByKbd", QString::number(
+ midiWorker->trigByKbd));
xml.writeTextElement("channel", QString::number(
midiWorker->chIn));
xml.writeTextElement("ccnumber", QString::number(
@@ -332,6 +379,8 @@
xml.writeEndElement();
xml.writeStartElement("waveParams");
+ xml.writeTextElement("loopmode", QString::number(
+ loopBox->currentIndex()));
xml.writeTextElement("waveform", QString::number(
waveFormBox->currentIndex()));
xml.writeTextElement("frequency", QString::number(
@@ -387,6 +436,12 @@
xml.readNext();
if (xml.isEndElement())
break;
+ if (xml.name() == "enableNoteOff")
+ enableNoteOff->setChecked(xml.readElementText().toInt());
+ else if (xml.name() == "restartByKbd")
+ enableRestartByKbd->setChecked(xml.readElementText().toInt());
+ else if (xml.name() == "trigByKbd")
+ enableTrigByKbd->setChecked(xml.readElementText().toInt());
if (xml.name() == "channel") {
tmp = xml.readElementText().toInt();
chIn->setCurrentIndex(tmp);
@@ -426,7 +481,12 @@
xml.readNext();
if (xml.isEndElement())
break;
- if (xml.name() == "waveform")
+ if (xml.name() == "loopmode") {
+ tmp = xml.readElementText().toInt();
+ loopBox->setCurrentIndex(tmp);
+ updateLoop(tmp);
+ }
+ else if (xml.name() == "waveform")
wvtmp = xml.readElementText().toInt();
else if (xml.name() == "frequency") {
tmp = xml.readElementText().toInt();
@@ -515,91 +575,6 @@
}
}
-void LfoWidget::readDataText(QTextStream& arpText)
-{
- QString qs, qs2;
- int l1, lt, wvtmp;
- Sample sample;
-
- qs = arpText.readLine();
- qs2 = qs.section(' ', 0, 0);
- channelOut->setCurrentIndex(qs2.toInt());
- qs2 = qs.section(' ', 1, 1);
- portOut->setCurrentIndex(qs2.toInt());
- qs2 = qs.section(' ', 2, 2);
- ccnumberBox->setValue(qs2.toInt());
- qs = arpText.readLine();
- qs2 = qs.section(' ', 0, 0);
- freqBox->setCurrentIndex(qs2.toInt());
- updateFreq(qs2.toInt());
- qs2 = qs.section(' ', 1, 1);
- resBox->setCurrentIndex(qs2.toInt());
- updateRes(qs2.toInt());
- qs2 = qs.section(' ', 2, 2);
- sizeBox->setCurrentIndex(qs2.toInt());
- updateSize(qs2.toInt());
- qs2 = qs.section(' ', 3, 3);
- amplitude->setValue(qs2.toInt());
- qs2 = qs.section(' ', 4, 4);
- offset->setValue(qs2.toInt());
- qs = arpText.readLine();
- if (qs == "MIDICC")
- {
- qs = arpText.readLine();
- while (qs != "EOCC") {
- qs2 = qs.section(' ', 0, 0);
- int controlID = qs2.toInt();
- qs2 = qs.section(' ', 1, 1);
- int ccnumber = qs2.toInt();
- qs2 = qs.section(' ', 2, 2);
- int channel = qs2.toInt();
- qs2 = qs.section(' ', 3, 3);
- int min = qs2.toInt();
- qs2 = qs.section(' ', 4, 4);
- int max = qs2.toInt();
- midiControl->appendMidiCC(controlID, ccnumber, channel, min, max);
- qs = arpText.readLine();
- }
- qs = arpText.readLine();
- }
-
- wvtmp = qs.toInt();
-
- // Read Mute Mask
- int step = TPQN / midiWorker->res;
- qs = arpText.readLine();
- if (qs.isEmpty() || (qs == "EOP")) return;
- qs2 = qs.section(' ', 0, 0);
- midiWorker->muteMask.clear();
- l1 = 0;
- while (qs2 !="EOM") {
- midiWorker->muteMask.append(qs2.toInt());
- l1++;
- if (!(l1%32)) qs = arpText.readLine();
- qs2 = qs.section(' ', l1%32, l1%32);
- }
-
- // Read Custom Waveform
- qs = arpText.readLine();
- qs2 = qs.section(' ', 0, 0);
- midiWorker->customWave.clear();
- l1 = 0;
- lt = 0;
- while (qs2 !="EOW") {
- sample.value=qs2.toInt();
- sample.tick = lt;
- sample.muted = midiWorker->muteMask.at(l1);
- midiWorker->customWave.append(sample);
- lt+=step;
- l1++;
- if (!(l1%16)) qs = arpText.readLine();
- qs2 = qs.section(' ', l1%16, l1%16);
- }
- waveFormBox->setCurrentIndex(wvtmp);
- updateWaveForm(wvtmp);
- modified = false;
-}
-
void LfoWidget::loadWaveForms()
{
waveForms << tr("Sine") << tr("Saw up") << tr("Triangle")
@@ -629,6 +604,23 @@
midiWorker->ccnumberIn = val;
modified = true;
}
+void LfoWidget::updateEnableNoteOff(bool on)
+{
+ midiWorker->enableNoteOff = on;
+ modified = true;
+}
+
+void LfoWidget::updateEnableRestartByKbd(bool on)
+{
+ midiWorker->restartByKbd = on;
+ modified = true;
+}
+
+void LfoWidget::updateEnableTrigByKbd(bool on)
+{
+ midiWorker->trigByKbd = on;
+ modified = true;
+}
void LfoWidget::updateWaveForm(int val)
{
@@ -669,6 +661,7 @@
midiWorker->updateResolution(lfoResValues[val]);
midiWorker->getData(&data);
screen->updateScreen(data);
+ newCustomOffset();
modified = true;
}
@@ -678,6 +671,14 @@
midiWorker->updateSize(sizeBox->currentText().toInt());
midiWorker->getData(&data);
screen->updateScreen(data);
+ newCustomOffset();
+ modified = true;
+}
+
+void LfoWidget::updateLoop(int val)
+{
+ if (val > 5) return;
+ midiWorker->updateLoop(val);
modified = true;
}
@@ -709,7 +710,9 @@
{
int min = 127;
int value;
- for (int l1 = 0; l1 < data.count() - 1; l1++) {
+ const int npoints = sizeBox->currentText().toInt()
+ * resBox->currentText().toInt();
+ for (int l1 = 0; l1 < npoints; l1++) {
value = data.at(l1).value;
if (value < min) min = value;
}
@@ -814,6 +817,10 @@
{
int tmp;
+ enableNoteOff->setChecked(fromWidget->enableNoteOff->isChecked());
+ enableRestartByKbd->setChecked(fromWidget->enableRestartByKbd->isChecked());
+ enableTrigByKbd->setChecked(fromWidget->enableTrigByKbd->isChecked());
+
tmp = fromWidget->chIn->currentIndex();
chIn->setCurrentIndex(tmp);
updateChIn(tmp);
@@ -837,6 +844,9 @@
tmp = fromWidget->sizeBox->currentIndex();
sizeBox->setCurrentIndex(tmp);
updateSize(tmp);
+ tmp = fromWidget->loopBox->currentIndex();
+ loopBox->setCurrentIndex(tmp);
+ updateLoop(tmp);
tmp = fromWidget->freqBox->currentIndex();
freqBox->setCurrentIndex(tmp);
updateFreq(tmp);
@@ -861,3 +871,88 @@
{
return midiWorker->customWave;
}
+
+void LfoWidget::handleController(int ccnumber, int channel, int value)
+{
+ bool m;
+ int min, max, sval;
+ QVector cclist= midiControl->ccList;
+
+ for (int l2 = 0; l2 < cclist.count(); l2++) {
+ min = cclist.at(l2).min;
+ max = cclist.at(l2).max;
+ if ((ccnumber == cclist.at(l2).ccnumber) &&
+ (channel == cclist.at(l2).channel)) {
+ switch (cclist.at(l2).ID) {
+ case 0: if (min == max) {
+ if (value == max) {
+ m = muteOut->isChecked();
+ muteOut->setChecked(!m);
+ }
+ }
+ else {
+ if (value == max) {
+ muteOut->setChecked(false);
+ }
+ if (value == min) {
+ muteOut->setChecked(true);
+ }
+ }
+ break;
+
+ case 1:
+ sval = min + ((double)value * (max - min) / 127);
+ amplitude->setValue(sval);
+ break;
+
+ case 2:
+ sval = min + ((double)value * (max - min) / 127);
+ offset->setValue(sval);
+ break;
+ case 3:
+ sval = min + ((double)value * (max - min) / 127);
+ waveFormBox->setCurrentIndex(sval);
+ updateWaveForm(sval);
+ break;
+ case 4:
+ sval = min + ((double)value * (max - min) / 127);
+ freqBox->setCurrentIndex(sval);
+ updateFreq(sval);
+ break;
+ case 5: if (min == max) {
+ if (value == max) {
+ m = recordAction->isChecked();
+ recordAction->setChecked(!m);
+ }
+ }
+ else {
+ if (value == max) {
+ recordAction->setChecked(true);
+ }
+ if (value == min) {
+ recordAction->setChecked(false);
+ }
+ }
+ break;
+ case 6:
+ sval = min + ((double)value * (max - min) / 127);
+ resBox->setCurrentIndex(sval);
+ updateRes(sval);
+ break;
+ case 7:
+ sval = min + ((double)value * (max - min) / 127);
+ sizeBox->setCurrentIndex(sval);
+ updateSize(sval);
+ break;
+ case 8:
+ sval = min + ((double)value * (max - min) / 127);
+ loopBox->setCurrentIndex(sval);
+ updateLoop(sval);
+ break;
+
+ default:
+ break;
+ }
+ }
+ }
+}
diff -Nru qmidiarp-0.4.2/src/lfowidget.h qmidiarp-0.4.5/src/lfowidget.h
--- qmidiarp-0.4.2/src/lfowidget.h 2011-07-09 10:33:33.000000000 +0000
+++ qmidiarp-0.4.5/src/lfowidget.h 2012-01-21 17:14:21.000000000 +0000
@@ -111,7 +111,7 @@
* instance.
*
* @param p_midiWorker Associated MidiLfo Object
- * @param portCount Number of available ALSA MIDI output ports
+ * @param portCount Number of available MIDI output ports
* @param compactStyle If set to True, Widget will use reduced spacing and small fonts
* @param mutedAdd If set to True, the module will be added in muted state
* @param parent The parent widget of this module, i.e. MainWindow
@@ -128,10 +128,13 @@
QComboBox *chIn;
QSpinBox *ccnumberInBox;
QSpinBox *ccnumberBox;
- // Output channel / port (ALSA Sequencer)
QComboBox *channelOut, *portOut;
QComboBox *resBox, *sizeBox;
+ QComboBox *loopBox;
QCheckBox *muteOut;
+ QCheckBox *enableNoteOff;
+ QCheckBox *enableRestartByKbd;
+ QCheckBox *enableTrigByKbd;
Slider *frequency, *amplitude, *offset;
QAction *recordAction;
QComboBox *waveFormBox, *freqBox;
@@ -154,13 +157,6 @@
*/
void readData(QXmlStreamReader& xml);
/*!
-* @brief This function reads all LFO parameters of this module from an old
-* QMidiArp .qma text stream.
-*
-* @param arpText QTextStream to read from
-*/
- void readDataText(QTextStream& arpText);
-/*!
* @brief This function writes all parameters of this LFO to an XML stream
* passed by the caller, i.e. MainWindow.
*
@@ -212,6 +208,9 @@
void updateCcnumberIn(int value);
void updateScreen(int value);
void setRecord(bool on);
+ void updateEnableNoteOff(bool on);
+ void updateEnableRestartByKbd(bool on);
+ void updateEnableTrigByKbd(bool on);
/*!
* @brief Slot for the LfoWidget::waveFormBox combobox setting the waveform
@@ -239,6 +238,15 @@
*/
void updateSize(int);
/*!
+* @brief Slot for the LfoWidget::loopBox combobox. Sets the loop mode
+* of the LFO.
+*
+* It sets MidiLfo::reverse, MidiLfo::pingpong and MidiLfo::enableLoop
+* @param val Combination index ranging from 0 to 5
+*
+*/
+ void updateLoop(int);
+/*!
* @brief Slot for the LfoWidget::ccnumberBox spinbox setting the output
* controller CC number of this module.
* @param val CC number to send data to
@@ -353,6 +361,11 @@
*
*/
void setMuted(bool on);
+
+ int getFramePtr() { return midiWorker->getFramePtr(); }
+ int getNextTick() { return midiWorker->nextTick; }
+ bool getReverse() { return midiWorker->reverse; }
+ void handleController(int ccnumber, int channel, int value);
};
#endif
diff -Nru qmidiarp-0.4.2/src/logwidget.cpp qmidiarp-0.4.5/src/logwidget.cpp
--- qmidiarp-0.4.2/src/logwidget.cpp 2011-07-09 15:25:08.000000000 +0000
+++ qmidiarp-0.4.5/src/logwidget.cpp 2011-08-29 18:32:25.000000000 +0000
@@ -26,15 +26,12 @@
#include
#include
#include
-#include
-#include
#include
-#include
#include
-#include
#include "logwidget.h"
+
LogWidget::LogWidget(QWidget *parent) : QWidget(parent)
{
logActive = false;
@@ -74,7 +71,7 @@
{
}
-void LogWidget::appendEvent(MidiEvent ev) {
+void LogWidget::appendEvent(MidiEvent ev, int tick) {
QString qs, qs2;
@@ -83,33 +80,33 @@
}
switch (ev.type) {
case EV_NOTEON:
- qs.sprintf("Ch %2d, Note On %3d, Vel %3d",
+ qs.sprintf("Ch %2d, Note On %3d, Vel %3d, tick %d",
ev.channel + 1,
- ev.data, ev.value);
+ ev.data, ev.value, tick);
break;
case EV_NOTEOFF:
- qs.sprintf("Ch %2d, Note Off %3d", ev.channel+1,
- ev.data);
+ qs.sprintf("Ch %2d, Note Off %3d, tick %d", ev.channel+1,
+ ev.data, tick);
break;
case EV_CONTROLLER:
logText->setTextColor(QColor(100,160,0));
- qs.sprintf("Ch %2d, Ctrl %3d, Val %3d", ev.channel+1,
- ev.data, ev.value);
+ qs.sprintf("Ch %2d, Ctrl %3d, Val %3d, tick %d", ev.channel+1,
+ ev.data, ev.value, tick);
break;
case EV_PITCHBEND:
logText->setTextColor(QColor(100,0,255));
- qs.sprintf("Ch %2d, Pitch %5d", ev.channel+1,
- ev.value);
+ qs.sprintf("Ch %2d, Pitch %5d, tick %d", ev.channel+1,
+ ev.value, tick);
break;
case EV_PGMCHANGE:
logText->setTextColor(QColor(0,100,100));
- qs.sprintf("Ch %2d, PrgChg %5d", ev.channel+1,
- ev.value);
+ qs.sprintf("Ch %2d, PrgChg %5d, tick %d", ev.channel+1,
+ ev.value, tick);
break;
case EV_CLOCK:
if (logMidiActive) {
logText->setTextColor(QColor(150,150,150));
- qs = tr("MIDI Clock");
+ qs = tr("MIDI Clock, tick");
}
break;
case EV_START:
diff -Nru qmidiarp-0.4.2/src/logwidget.h qmidiarp-0.4.5/src/logwidget.h
--- qmidiarp-0.4.2/src/logwidget.h 2011-07-09 15:25:08.000000000 +0000
+++ qmidiarp-0.4.5/src/logwidget.h 2011-08-29 18:32:25.000000000 +0000
@@ -26,14 +26,12 @@
#define LOGWIDGET_H
#include
+#include
#include
#include
#include
-#include
#include
-#include
#include
-#include
#include "midievent.h"
@@ -71,7 +69,7 @@
public slots:
void logMidiToggle(bool on);
void enableLogToggle(bool on);
- void appendEvent(MidiEvent ev);
+ void appendEvent(MidiEvent ev, int tick);
void appendText(const QString&);
void clear();
};
diff -Nru qmidiarp-0.4.2/src/main.cpp qmidiarp-0.4.5/src/main.cpp
--- qmidiarp-0.4.2/src/main.cpp 2011-07-09 10:33:33.000000000 +0000
+++ qmidiarp-0.4.5/src/main.cpp 2011-11-07 20:44:13.000000000 +0000
@@ -3,7 +3,7 @@
*
* Handles commandline arguments and options before MainWindow
* construction.
- * @mainpage A MIDI Arpeggiator, LFO and Step Sequencer for ALSA
+ * @mainpage A MIDI Arpeggiator, LFO and Step Sequencer
* @section Description
* This attempts to give an overview of the architecture of this
* software.
@@ -46,22 +46,34 @@
static struct option options[] = {
{"version", 0, 0, 'v'},
{"help", 0, 0, 'h'},
+ {"alsa", 0, 0, 'a'},
+ {"jack", 0, 0, 'j'},
+ {"jack_session_uuid", required_argument, 0, 'U' },
{"portCount", 1, 0, 'p'},
{0, 0, 0, 0}
};
+QString global_jack_session_uuid = "";
+
int main(int argc, char *argv[])
{
int getopt_return;
int option_index;
int portCount = 2;
+ bool alsamidi = false;
+ QString s;
+
QTextStream out(stdout);
- while ((getopt_return = getopt_long(argc, argv, "vhp:", options,
+ while ((getopt_return = getopt_long(argc, argv, "vhajUp:", options,
&option_index)) >= 0) {
switch(getopt_return) {
case 'v':
- out << ABOUTMSG;
+ s = QString(ABOUTMSG);
+ s.replace(QString(" "), QString("\n"));
+ s.replace(QString("