summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWerner Schweer <ws.seh.de>2008-07-05 13:03:01 +0000
committerWerner Schweer <ws.seh.de>2008-07-05 13:03:01 +0000
commitac1f4ddf856931d6b92261fd6fba1db55f66c0e5 (patch)
treeb9f58399835a568bc61444818f532717d981abc6
parentcb6262718149270c43bcdae5e8bcdbe26f665c7c (diff)
updates
-rw-r--r--muse/CMakeLists.txt14
-rw-r--r--muse/ChangeLog2
-rw-r--r--muse/doc/CMakeLists.txt24
-rw-r--r--muse/doc/dimpl.odtbin0 -> 37053 bytes
-rw-r--r--muse/doc/dimpl/CMakeLists.txt41
-rw-r--r--muse/doc/dimpl/dimpl.tex865
-rw-r--r--muse/doc/man/de/CMakeLists.txt52
-rw-r--r--muse/doc/man/de/automation.tex33
-rw-r--r--muse/doc/man/de/figurepath.tex.in2
-rw-r--r--muse/doc/man/de/installation.tex63
-rw-r--r--muse/doc/man/de/man-de.tex413
-rw-r--r--muse/doc/man/de/midirecording.tex119
-rw-r--r--muse/doc/man/de/miditracks.tex132
-rw-r--r--muse/doc/man/de/projekte.tex102
-rw-r--r--muse/doc/man/de/struktur.tex43
-rw-r--r--muse/doc/manual-de.odtbin0 -> 50551 bytes
-rw-r--r--muse/muse/CMakeLists.txt25
-rw-r--r--muse/muse/arranger.cpp (renamed from muse/muse/arranger/arranger.cpp)4
-rw-r--r--muse/muse/arranger.h (renamed from muse/muse/arranger/arranger.h)0
-rw-r--r--muse/muse/arranger/CMakeLists.txt60
-rw-r--r--muse/muse/canvas.cpp (renamed from muse/muse/arranger/canvas.cpp)0
-rw-r--r--muse/muse/canvas.h (renamed from muse/muse/arranger/canvas.h)0
-rw-r--r--muse/muse/configtrack.cpp (renamed from muse/muse/arranger/configtrack.cpp)0
-rw-r--r--muse/muse/configtrack.h (renamed from muse/muse/arranger/configtrack.h)0
-rw-r--r--muse/muse/configtrack.ui (renamed from muse/muse/arranger/configtrack.ui)0
-rw-r--r--muse/muse/importmidi.cpp2
-rw-r--r--muse/muse/jack.cpp25
-rw-r--r--muse/muse/midiportinfo.ui (renamed from muse/muse/arranger/midiportinfo.ui)0
-rw-r--r--muse/muse/miditrackinfo.ui (renamed from muse/muse/arranger/miditrackinfo.ui)0
-rw-r--r--muse/muse/mstrip.cpp76
-rw-r--r--muse/muse/mstrip.h3
-rw-r--r--muse/muse/muse.cpp2
-rw-r--r--muse/muse/partdrag.cpp (renamed from muse/muse/arranger/partdrag.cpp)0
-rw-r--r--muse/muse/partdrag.h (renamed from muse/muse/arranger/partdrag.h)0
-rw-r--r--muse/muse/preferences.cpp2
-rw-r--r--muse/muse/selectfilter.h (renamed from muse/muse/arranger/selectfilter.h)0
-rw-r--r--muse/muse/seqmsg.cpp2
-rw-r--r--muse/muse/song.cpp21
-rw-r--r--muse/muse/songfile.cpp2
-rw-r--r--muse/muse/strip.h3
-rw-r--r--muse/muse/tllineedit.cpp (renamed from muse/muse/arranger/tllineedit.cpp)0
-rw-r--r--muse/muse/tllineedit.h (renamed from muse/muse/arranger/tllineedit.h)0
-rw-r--r--muse/muse/tlswidget.cpp (renamed from muse/muse/arranger/tlswidget.cpp)0
-rw-r--r--muse/muse/tlswidget.h (renamed from muse/muse/arranger/tlswidget.h)0
-rw-r--r--muse/muse/tlwidget.cpp (renamed from muse/muse/arranger/tlwidget.cpp)0
-rw-r--r--muse/muse/tlwidget.h (renamed from muse/muse/arranger/tlwidget.h)0
-rw-r--r--muse/muse/tlwlayout.cpp (renamed from muse/muse/arranger/tlwlayout.cpp)0
-rw-r--r--muse/muse/tlwlayout.h (renamed from muse/muse/arranger/tlwlayout.h)0
-rw-r--r--muse/muse/trackdrag.cpp (renamed from muse/muse/arranger/trackdrag.cpp)0
-rw-r--r--muse/muse/trackdrag.h (renamed from muse/muse/arranger/trackdrag.h)0
-rw-r--r--muse/muse/trackinfo.cpp (renamed from muse/muse/arranger/trackinfo.cpp)0
-rw-r--r--muse/muse/trackinfo.h (renamed from muse/muse/arranger/trackinfo.h)0
-rw-r--r--muse/muse/trelement.h (renamed from muse/muse/arranger/trelement.h)5
-rw-r--r--muse/muse/wave.cpp16
54 files changed, 71 insertions, 2082 deletions
diff --git a/muse/CMakeLists.txt b/muse/CMakeLists.txt
index 3712f50d..2286d40b 100644
--- a/muse/CMakeLists.txt
+++ b/muse/CMakeLists.txt
@@ -93,16 +93,6 @@ endif (NOT QT4_FOUND)
include(${QT_USE_FILE})
##
-## find texexec (ConTeXt)
-##
-
-find_path( TEXEXEC_PATH texutil )
-if (NOT TEXEXEC_PATH)
- message("texexec from ConTeXt package not found. Documentation will not be build")
-endif (NOT TEXEXEC_PATH)
-
-
-##
## find doxygen
## TODO
@@ -209,6 +199,8 @@ endif (NOT JACK_INCDIR)
##
## check for dssi
+## dssi >= 0.9.0
+## liblo >= 0.23
##
if (ENABLE_DSSI)
@@ -339,5 +331,5 @@ IF(EXISTS "${CMAKE_ROOT}/Modules/CPack.cmake")
INCLUDE(CPack)
ENDIF(EXISTS "${CMAKE_ROOT}/Modules/CPack.cmake")
-subdirs(al awl grepmidi plugins midiplugins muse share synti doc)
+subdirs(al awl grepmidi plugins midiplugins muse share synti)
diff --git a/muse/ChangeLog b/muse/ChangeLog
index dc8f38a3..d02cd328 100644
--- a/muse/ChangeLog
+++ b/muse/ChangeLog
@@ -1,3 +1,5 @@
+5.7. (ws)
+ - fix midi metronome output routing
29.6. (ws)
- fix sending proper note off's at stop
27.6. (ws)
diff --git a/muse/doc/CMakeLists.txt b/muse/doc/CMakeLists.txt
deleted file mode 100644
index 387df934..00000000
--- a/muse/doc/CMakeLists.txt
+++ /dev/null
@@ -1,24 +0,0 @@
-#=============================================================================
-# MusE
-# Linux Music Editor
-# $Id:$
-#
-# Copyright (C) 2002-2006 by Werner Schweer and others
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License version 2.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-#=============================================================================
-
-if (TEXEXEC_PATH)
- subdirs( dimpl man )
-endif (TEXEXEC_PATH)
-
diff --git a/muse/doc/dimpl.odt b/muse/doc/dimpl.odt
new file mode 100644
index 00000000..e62ccd90
--- /dev/null
+++ b/muse/doc/dimpl.odt
Binary files differ
diff --git a/muse/doc/dimpl/CMakeLists.txt b/muse/doc/dimpl/CMakeLists.txt
deleted file mode 100644
index 9611881e..00000000
--- a/muse/doc/dimpl/CMakeLists.txt
+++ /dev/null
@@ -1,41 +0,0 @@
-#=============================================================================
-# MusE
-# Linux Music Editor
-# $Id:$
-#
-# Copyright (C) 2002-2006 by Werner Schweer and others
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License version 2.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-#=============================================================================
-
-set (SRC dimpl.tex)
-
-add_custom_target (
- dimpl
- DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/dimpl.tex
- COMMAND ${TEXEXEC_PATH}/texexec
- ARGS --language=en --verbose --batch --pdf
- --result=dimpl.pdf
- ${CMAKE_CURRENT_SOURCE_DIR}/dimpl.tex
- WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
- )
-
-install_files ( /share/${MusE_INSTALL_NAME}/doc/ .pdf
- ${CMAKE_CURRENT_BINARY_DIR}/dimpl.pdf )
-
-set (extraClean dimpl.log dimpl.tmp dimpl.tuo dimpl.tui
- dimpl-mpgraph.mp mpgraph.mp )
-
-set_directory_properties( PROPERTIES
- ADDITIONAL_MAKE_CLEAN_FILES "${extraClean}"
- )
diff --git a/muse/doc/dimpl/dimpl.tex b/muse/doc/dimpl/dimpl.tex
deleted file mode 100644
index da5ea6c6..00000000
--- a/muse/doc/dimpl/dimpl.tex
+++ /dev/null
@@ -1,865 +0,0 @@
-%====================================================================
-% Muse
-% Design & Implementation
-%
-% (C) 2005 Copyright: Werner Schweer and Others
-%====================================================================
-
-%----------------------------------------------------------
-% Setup
-%----------------------------------------------------------
-
-%\showframe
-%\showsetups
-\usemodule[chart]
-\setupcolors[state=start]
-\setupbodyfont[Palatino]
-\language[en]
-\enableregime[il1]
-
-\startuseMPgraphic{FunnyFrame}
- picture p; numeric o; path a, b; pair c;
- p := textext.rt(\MPstring{FunnyFrame});
- o := BodyFontSize;
- a := unitsquare xyscaled(OverlayWidth,OverlayHeight);
- p := p shifted (20, OverlayHeight-ypart center p);
- drawoptions (withpen pencircle scaled 1pt withcolor .625red);
- b := a superellipsed .95;
- fill b withcolor .85white; draw b;
- b := (boundingbox p) superellipsed .95;
- fill b withcolor .85white; draw b;
- draw p withcolor black;
- setbounds currentpicture to a;
- \stopuseMPgraphic
-
-\defineoverlay[FunnyFrame][\useMPgraphic{FunnyFrame}]
-\defineframedtext[FunnyText][frame=off,background=FunnyFrame]
-\def\StartFrame{\startFunnyText}
-\def\StopFrame{\stopFunnyText}
-\def\FrameTitle#1%
- {\setMPtext{FunnyFrame}{\hbox spread 1em{\hss\strut#1\hss}}}
-\setMPtext{FunnyFrame}{}
-
-
-\define\M{Muse}
-\define[1]\Index{{\it #1}\marginpar{#1}\index{#1}}
-
-\defineindenting[Cmdi][text=,separator=,width=fit,distance=1em]
-
-\define[1]\Cmd{
- \Cmdi
- \framed[
- background=color,
- width=fit,
- align=right,
- backgroundcolor=lightgray,
- framecolor=blue]
- {\tt\space #1}}
-
-\define[2]\CCmd{
- \Cmdi
- \framed[
- background=color,
- width=broad,
- align=right,
- backgroundcolor=lightgray,
- framecolor=blue]
- {\vbox{\hbox{\tt\space #1}\hbox{\tt\space #2}}}}
-
-%\define\startdescription{\startpacked}
-\define\startdescription{}
-%\define\stopdescription{\stoppacked}
-\define\stopdescription{}
-
-\define[1]\Fig{\hbox{\externalfigure[pics/#1]}}
-
-\define[2]\Screen{
- \placefigure[here][fig:#1]{#2}{\externalfigure[pics/#1][scale=1600]}
- }
-
-\definedescription[Option][
- location=left,
- headstyle=bold,
- width=4em,
- before={\startnarrower[left]\setupblank[0pt]},
- after={\stopnarrower\setupblank}]
-
-\definedescription[Filetype][
- location=left,
- headstyle=bold,
- width=4em,
- before={\startnarrower[left]\setupblank[0pt]},
- after={\stopnarrower\setupblank}]
-
-\definedescription[FileList][
- location=left,
- headstyle=bold,
- width=7em,
- before={\startnarrower[left]\setupblank[0pt]},
- after={\stopnarrower\setupblank}]
-
-\definedescription[Input][
- location=left,
- headstyle=bold,
- width=9em,
- before={\startnarrower[left]\setupblank[0pt]},
- after={\stopnarrower\setupblank}]
-
-\definedescription[InputN][
- location=left,
- headstyle=bold,
- width=6em,
- before={\startnarrower[left]\setupblank[0pt]},
- after={\stopnarrower\setupblank}]
-
-\define[2]\Figure{
- \placefigure
- [#1][fig:#2]{}
- {\externalfigure[pics/#2]}
- }
-
-\define[1]\Menu{
- \placefigure[right][fig:#1]{}
- {\externalfigure[pics/#1][scale=2000]}
- }
-
-\definedescription[Opt][location=hanging,headstyle=bold,width=broad]
-
-\setuptyping[before=\blank\startbackground, after=\stopbackground\blank] % source code with background
-\setupwhitespace[medium]
-
-%----------------------------------------------------------
-% Body
-%----------------------------------------------------------
-
-\starttext
- \language[en]
- \mainlanguage[en]
- \startstandardmakeup[doublesided=no]
- \definebodyfont[10pt,11pt,12pt][rm][tfe=Regular at 48pt]
- \tfe\setupinterlinespace
- \hfill \color[red]{\M}\par
- \hfill \color[blue]{Design \&}\par
- \hfill \color[blue]{Implementation}\par
- \vfill
- \definebodyfont[10pt,11pt,12pt][rm][tfb=Regular at 24pt]
- \tfb\setupinterlinespace
- \hfill Version 1.0\par
-%% \hfill April 2005\par
-%% \hfill Werner Schweer
- \stopstandardmakeup
-
- \startstandardmakeup[page=no]
- \vfill
- \M\ is hosted on SourceForge:\par
- \type{http://lmuse.sourceforge.net/}
- \blank[line]
- This document was created using \pdfTeX\ and the
- \ConTeXt\ macro package.
- \blank[line]
- \copyright 2005 Werner Schweer and Others
- \stopstandardmakeup
-
- \completecontent
-
-%%
-%%=======================================================================
-%% File Formats
-%%=======================================================================
-%%
-
-\chapter{Process Structure}
-
-\chapter{Song}
- \section{Multithreading}
-
- \section{Editing}
- \subsection{Realtime Editing}
- \M\ allows for realtime editing. That means that you can edit
- a song while the sequencer is running.
- Two threads want to access data in the main {\tt Song()} class:
- the GUI thread and the realtime sequencer thread.
-
- This are the rules how \M\ handles {\tt Song()} data accesses:
-
- \startitemize[packed,broad]
- \item the GUI thread can only read {\tt Song()} data
- \item the GUI thread can request the sequencer thread to
- modify Song data
- \item the sequencer thread can modify {\tt Song()} data, but only
- on request of the GUI thread
- \stopitemize
-
- Interprocess communication is done via message passing.
- Communication from the gui thread to the sequencer thread is
- done in the following steps:
-
- \startitemize[packed,broad]
- \item the GUI sends a Message to the sequencer thread
- and waits for an answer
- \item once the sequencer thread is running (the JACK
- client {\tt process()} call) it processes the message and
- sends back an answer to the GUI process.
- \item the GUI process reads the answer and continues
- \stopitemize
-
- This scheme stops the GUI process in a defined state while the
- realtime process can safely manipulate the {\tt Song()} data.
-
- \subsection{User Transaction}
-
- A user transaction is a sequence of actions manipulating the
- main {\tt Song()} structure. Each action involves sending a
- message to the realtime thread. This means that every action
- stops the GUI thread for at most one JACK cycle.
-
- If a transaction consists of lot of actions then this scheme
- would be too slow. For such cases the sequencer thread is switched
- to "idle" mode, which ensures it is not touching the {\tt Song()}
- data anymore. Then safe manipulation of the data is possible.
-
- \subsection{Naming Conventions}
-
- There are several methods involved in an edit transaction;
- example for adding a part:
-
- \startitemize[packed,broad]
- \item {\tt cmdAddPart()}
- This implements a complete undoable user transaction
- and is called from the gui thread
- \item {\tt addPart()}
- This method is also called from the gui thread. It
- implements part of a user transaction. It is not
- surrounded by {\tt startUndo() endUndo()}.
- \item the realtime part (actually removing the {\tt Part} from the
- PartList) is done inline during processing of
- messages in the sequencer thread.
- \stopitemize
-
-
-\chapter{File Formats}
- \section{Instrument Definition Files}
-
- \M\ Instrument Definition Files are used to describe the
- properties of external midi instruments.
-
- IDF-Files have the file extension \type{*.idf} \index{idf} and
- they are searched in the \M\ "instruments" subdirectory (which is on
- my system \type{/usr/share/muse-1.0/instruments}.
-
- An instrument definition file should only define one
- instrument.
-
- An instrument\index{Instrument definition} is a property of the
- midi channel \index{Midi channel}.
- All found instrument definitions are presented by MusE
- in the Instrument pulldown menu of the midi output port.
-
- Example of an instrument definition file:
- \blank
-
-\starttyping
-<?xml version="1.0"?>
-<muse version="1.0">
- <MidiInstrument name="GM">
- <Init>
- ...MusE event list which initializes instrument
- </Init>
- <PatchGroup name="Piano">
- <Patch name="Grand Piano" prog="0"/>
- <Patch name="Bright Piano" prog="1"/>
- ...
- </PatchGroup>
- <PatchGroup name="Drum Kits">
- <drummap name="PoweredStd" hbank="63" lbank="32" prog="0">
- <entry>
- <name>Clave</name>
- <enote>24</enote>
- <anote>24</anote>
- </entry>
- <entry>
- <name>SdBrMtSt</name>
- <enote>25</enote>
- <anote>25</anote>
- </entry>
- ...
- </drummap>
- </PatchGroup>
-
- <PatchGroup name="Bass">
- <Patch name="Acoustic Bass" prog="32"/>
- <Patch name="Fingered Bass" prog="33"/>
- </PatchGroup>
- ...
- <Controller name="Brightness" type="Control" l="74" init="64">
- ...
- </MidiInstrument>
- </muse>
-\stoptyping
-
- \blank
-
- \subsection{Init Sequence}
- The {\tt Init} section declares a list of midi events to initialize
- the instrument. The section can be empty or absent.
-
- \subsection{Patch Groups}
- Patch Groups are used to structure the list of patches.
- PatchGroups\index{PatchGroups} are not mandatory; its valid to write:
-
- \blank
-\starttyping
-<MidiInstrument name="GM">
- <Patch name="Grand Piano" prog="0"/>
- <Patch name="Bright Piano" prog="1"/>
- <Patch name="Acoustic Bass" prog="32"/>
- <Patch name="Fingered Bass" prog="33"/>
- ...
- </MidiInstrument>
-\stoptyping
- \blank
-
- \subsection{Patches}
-
- The "prog" parameter in a "Patch" is mandatory. Missing
- "hbank" or "lbank" are treated as "don't care".
- Missing "drum" is treated as drum="0".
-
- A XG-Patch looks like this:
-
- \blank
- \starttyping
-<Patch name="Electro" drum="1" hbank="127"
- lbank="0" prog="24"/>
- \stoptyping
- \blank
-
- A patch can be associated with a "mode" with one of:
- \blank[medium]
- \Option{1} - GM\par
- \Option{2} - GS\par
- \Option{4} - XG\par
- \blank[big]
-
- Example:
-
- \blank
- \starttyping
-<Patch name="Electro" mode="4" drum="1" hbank="127"
- lbank="0" prog="24"/>
- \stoptyping
- \blank
-
- Mode id's can be ore'd together for patches which are valid
- for more than one mode:
-
- \blank
- \starttyping
-<Patch name="Grand Piano" mode=7" hbank="0" lbank="0" prog="0"/>
- \stoptyping
- \blank
-
- example for MusE event (Sysex "XG-On"):
-
- \blank
- \starttyping
-<event tick="0" type="5" datalen="7">
- 43 10 4c 00 00 7e 00
- </event>
- \stoptyping
- \blank
-
- \type{<Init> ... </Init>} part can be omitted
-
- \subsection{Drum Maps}
- A drum map allows to define properties for every note in a patch.
- The {\tt drummap} entry looks like the {\tt Patch} entry and defines
- the banks and the program number for the drummap.
-
- \subsection{Controller}
- Controller \index{Controller} have the following properties:
-
- \starttabulate
- \NC name:\NC
- arbitrary unique (short) string describing the controller\NC\NR
- \NC n:\NC
- controller number, defines also the controller type:\par
- values from \type{0x0 - 0x7f} are 7Bit controller\par
- values from \type{0x1000 - 0x1ffff} are 14 bit controller with
- MSB/LSB value pairs\par
- values from \type{0x20000 - 0x2ffff} are RPN's\par
- values from \type{0x30000 - 0x3ffff} are NRPN's
- \NC\NR
- \NC min:\NC minimum value for controller\NC\NR
- \NC max:\NC maximum value for controller\NC\NR
- \NC init:\NC
- reset value for controller; when controller value is
- undefined after instrument reset, use the ''undefined''
- value \type{0x10000}
- \NC\NR
- \stoptabulate
-
- the min/max/init values can be ommited
-
-%%
-%%=======================================================================
-%% Midi Plugins
-%%=======================================================================
-%%
-\chapter{Plugins}
- \section{Midi Plugins}
-
-
- Midi plugins have the file extension \type{*.so} and they are
- searched in the \M\ "{\tt midiplugins} subdirectory (which is on
- my system \type{/usr/lib/muse-1.0/midiplugins}.
-
-%
-%-----------------------------------
-% Midi Filter
-%-----------------------------------
-%
- \subsection{Midi Filter}
-
- Example for an midi plugin which does essentially nothing:
-
- First define your custom \type{Filter} class with \type{Mempi}
- as base class.
-
-\starttyping
-#include "../libmidiplugin/mempi.h"
-
-class Filter : public Mempi {
- virtual void process(unsigned, unsigned,
- MPEventList*, MPEventList*);
-
- public:
- Filter(const char* name, const MempiHost*);
- ~Filter() {}
- virtual bool init() { return false; }
- };
-
-Filter::Filter(const char* name, const MempiHost* h)
- : Mempi(name, h)
- {
- }
-\stoptyping
-
- Now comes the main \type{Mempi} function you have to implement:
- \type{process()} which has two parameters, an midi event input
- list and an midi event output list. The example code simply
- copies all events from the input list to the output list.
-
-\starttyping
-void Filter::process(unsigned, unsigned, MPEventList* il,
- MPEventList* ol)
- {
- for (iMPEvent i = il->begin(); i != il->end(); ++i) {
- ol->insert(*i);
- }
- }
-\stoptyping
-
- When loading the plugin, the \type{Mempi} Host looks for
- the symbol \type{mempi_descriptor}. This function returns a
- pointer to the plugin class description you have to fill in.
-
-\starttyping
-static Mempi* instantiate(const char* name, const MempiHost* h)
- {
- return new Filter(name, h);
- }
-
-extern "C" {
- static MEMPI descriptor = {
- "Filter",
- "MusE Zero Filter",
- "0.1", // filter version string
- MEMPI_FILTER, // plugin type
- MEMPI_MAJOR_VERSION, MEMPI_MINOR_VERSION,
- instantiate
- };
-
- const MEMPI* mempi_descriptor() { return &descriptor; }
- }
-\stoptyping
-
-
-%
-%-----------------------------------
-% GUI interface
-%-----------------------------------
-%
-\subsection{GUI interface}
- Every midi plugin can implement a native graphical user
- interface (GUI). For this you have to overload five
- virtual functions.
-
-\starttyping
- virtual bool hasGui() const { return true; }
-\stoptyping
- This function informs the host whether there is an GUI or not.
-
-\starttyping
- virtual bool guiVisible() const { return gui->isVisible(); }
-\stoptyping
- This fuction returns \type{true} if your GUI is visible.
-
-\starttyping
- virtual void showGui(bool val) const { gui->setShown(val); }
-\stoptyping
- This function shows or hides the GUI.
-
- There are two helper functions the plugin host uses to save
- and restore the GUI geometry across sessions:
-
-\starttyping
- virtual void getGeometry(int* x, int* y, int* w, int* h) const;
- virtual void setGeometry(int, int, int, int);
-\stoptyping
-
-%
-%-----------------------------------
-% Persistent Parameters
-%-----------------------------------
-%
-\subsection{Persistent Parameters}
-
- The plugin host can save and restore plugin parameter across
- sessions. When the host saves his session status, he calls
- the midi plugin function:
-
-\starttyping
- virtual void getInitData(int* len, const unsigned char**p) const;
-\stoptyping
-
- You can overload this function to return a pointer to your
- session data and the len of the data block.
-
- When the session is restored, the host calls
-
-\starttyping
- virtual void setInitData(int len, const unsigned char* p);
-\stoptyping
-
- which you can use to restore the last plugin state.
-%
-%-----------------------------------
-% Host Access Functions
-%-----------------------------------
-%
-
-\subsection{Host Access Functions}
-
- The plugin host supplies some functions which are
- accessible through the \type{MempiHost*} in the
- \type{Mempi} interface.
-
- The host supplies the following functions:
-
-\starttyping
- int division() const;
-\stoptyping
- \index{division()}
- returns the midi \type{division} value which gives the number
- of midi ticks per midi beat, typically 384.
-
-\starttyping
- int tempo(unsigned tick) const;
-\stoptyping
- \index{tempo()}
- returns the midi tempo value.
-
-\starttyping
- unsigned tick2frame(unsigned tick) const;
-\stoptyping
- \index{tick2frame()}
- This function converts a transport position given in midi ticks
- to a audio frame position.
-
-\starttyping
- unsigned frame2tick(unsigned frame) const;
-\stoptyping
- \index{frame2tick()}
- This function converts a transport position given in audio frames
- to midi ticks.
-
-\starttyping
- void bar(int tick, int* bar, int* beat, unsigned* rest) const;
-\stoptyping
- \index{bar()}
- This function return bar/beat and a tick rest for a given
- tick position.
-
-\starttyping
- unsigned bar2tick(int bar, int beat, int tick) const;
-\stoptyping
- This is the opposite to the \type{bar} function. It converts
- a time position given in bar/beat/tick into a midi tick value.
-
-%
-%-----------------------------------
-% Midi Synthesizer
-%-----------------------------------
-%
-\subsection{Midi Synthesizer}
- As an example for a midi synthesizer plugin we use a midi
- metronome.
-
- Lets start with the class definition:
-
-\starttyping
-#include "../libmidiplugin/mempi.h"
-
-//---------------------------------------------------------
-// metronom - simple midi metronom
-//---------------------------------------------------------
-
-class Metronom : public Mempi {
-
- protected:
- struct InitData {
- char measureNote;
- char measureVelo;
- char beatNote;
- char beatVelo;
- } data;
- MetronomGui* gui;
- friend class MetronomGui;
-
- unsigned int nextTick;
- unsigned int lastTo;
-
- virtual void process(unsigned, unsigned, MPEventList*,
- MPEventList*);
-
- public:
- Metronom(const char* name, const MempiHost*);
- ~Metronom();
- virtual bool init();
-
- virtual bool hasGui() const { return true; }
- virtual bool guiVisible() const { return gui->isVisible(); }
- virtual void showGui(bool val) { gui->setShown(val); }
- virtual void getGeometry(int* x, int* y, int* w, int* h) const;
- virtual void setGeometry(int, int, int, int);
-
- virtual void getInitData(int*, const unsigned char**) const;
- virtual void setInitData(int, const unsigned char*);
- };
-\stoptyping
-
-%
-%-----------------------------------
-% MESS interface
-%-----------------------------------
-%
-\chapter {The M.E.S.S (MusE Experimental Software Synthesizer) API}
-
- M.E.S.S.\index{M.E.S.S.} stands for MusE Experimental Soft Synth and is
- an API/interface (like DSSI) to enable programmers to easily create their
- own softsynths.
-
- The interface for a M.E.S.S.-synth consists of two classes, the Mess and
- MessGui. In short, the framework provides the Mess (the synth) midi data
- (notes, controllers and sysexes) and methods that handle the IPC between
- the gui and the synth, so the programmer can focus on DSP-issues instead.
-
- The interface for the synth is specified in the mess.h file in the libsynti
- directory. The interface for the MessGui is specified in the gui.h file.
-
-\starttyping
-//---------------------------------------------------------
-// Mess
-// MusE experimental software synth
-// Instance virtual interface class
-//---------------------------------------------------------
-
-class Mess {
- MessP* d;
-
- int _sampleRate;
- int _channels; // 1 - mono, 2 - stereo
-
- public:
- Mess(int channels);
- virtual ~Mess();
-
- int channels() const { return _channels; }
- int sampleRate() const { return _sampleRate; }
- void setSampleRate(int r) { _sampleRate = r; }
-
- virtual void process(float** data, int offset, int len) = 0;
-
- // the synti has to (re-)implement processEvent() or provide
- // some of the next three functions:
-
- virtual bool processEvent(const MidiEvent&);
- virtual bool setController(int, int, int) { return false; }
- virtual bool playNote(int, int, int) { return false; }
- virtual bool sysex(int, const unsigned char*) { return false; }
-
- virtual void getInitData(int*, const unsigned char**) const {}
- virtual int getControllerInfo(int, const char**, int*, int*, int*)
- const { return 0; }
- virtual const char* getPatchName(int, int, int)
- const { return "?"; }
- virtual const MidiPatch* getPatchInfo(int, const MidiPatch*)
- const { return 0; }
-
- // synthesizer -> host communication
- void sendEvent(MidiEvent); // called from synti
- MidiEvent receiveEvent(); // called from host
- int eventsPending() const;
-
- // GUI interface routines
- virtual bool hasGui() const { return false; }
- virtual bool guiVisible() const { return false; }
- virtual void showGui(bool) {}
- virtual void getGeometry(int* x, int* y, int* w, int* h) const;
- virtual void setGeometry(int, int, int, int) {}
- };
-\stoptyping
-
-\section{Overview of virtual member functions}
- This is a short description of the virtual functions in the Mess-class:
-\subsection{process}
-\starttyping
-virtual void process(float** data, int offset, int len) = 0;
-\stoptyping
- This is where the audio processing takes place. The Mess is called with a float array, and
- it's up to the programmer to fill it with data beginning at data[offset] to data[offset+len].
-
-\subsection{processEvent}
- There are two ways to go when it comes to how midi data is fed into the Mess. You can either
- implement processEvent and manage the different event types (controllers, sysexes and notes)
- or implement one or more of the setController, playNote and sysex functions.
-
-
- Note that overriding processEvent results in setController, playNote and sysex
- not being called!
-
-\subsection{setController, playNote, sysex}
- The setController, playNote and sysex functions should return false if the event was
- processed, true if the synth was busy.
-
-\starttyping
-virtual bool setController(int channel, int ctrlNo, int value)
-virtual bool playNote(int channel, int pitch, int velo)
-virtual bool sysex(int length, const unsigned char* data)
-\stoptyping
-
-\subsection{getInitData}
- MusE provides an interface for storing the state of the synth in the project file.
- getInitData is called when the project is saved, and provides a pointer to a data
- block where you store the data which will recreate the synths current state when
- the project is reopened.
-\starttyping
-virtual void getInitData(int* nrofchars, const unsigned char** data)
- const {}
-\stoptyping
-
-\subsection{getControllerInfo}
- getControllerInfo is called when the Mess is instantiated, and this is where
- you tell MusE which controllers the Mess supports. The function is called
- repeteadly: just fill in the values for the controller and return the index
- you want to be sent next time. Return 0 when you've given MusE information about
- all controllers your Mess supports.
-
- As you can see, the necessary parameters are an index (used internally), a name
- for the controller, an int describing the actual controller number (f.ex. 91 for
- reverb), and finally min and max values for the controller.
-
-\starttyping
-virtual int getControllerInfo(int index,
- const char** name,
- int* controller,
- int* min,
- int* max) const
-\stoptyping
-
-\subsection{hasGui}
- hasGui is called when the Mess is instantiated, and tells MusE if the synth has
- a gui or not.
-\starttyping
-virtual bool hasGui() const;
-\stoptyping
-
-\subsection{showGui}
-showGui is called from MusE when the gui is supposed to be visible
-\starttyping
-virtual void showGui(bool show);
-\stoptyping
-
-\subsection{getPatchName, getPatchInfo}
- getPatchName and getPatchInfo are used to give MusE information about patches,
- which can be selected in the track inspector.
-
- The getPatchName function specifies three parameters to be passed: channel,
- program, and a third that is unused. It is the responsibility for the synth
- to return the patchname for the particular channel and a program.
-
-\starttyping
-virtual const char* SimpleSynth::getPatchName(int channel, int program,
- int unused) const
-\stoptyping
-
- getPatchInfo is called repeatedly until the synth returns 0. The synth must
- send information back in a MidiPatch struct. The MidiPatch parameter sent
- contains information on the last MidiPatch that was sent from the synth
- (a null pointer on first call).
-
-\starttyping
-virtual const MidiPatch* getPatchInfo(int channel,
- const MidiPatch* previouspatch)
- const;
-
-struct MidiPatch {
- signed char type; // 1 - GM 2 - GS 4 - XG
- signed char hbank, lbank, prog;
- const char* name;
- };
-\stoptyping
-
-
-\subsection{Descriptor}
- Since the synths are built as shared libraries, you need to specify a descriptor
- for your MESS. They look something like this: (example taken from SimpleSynth/SimpleDrums)
-
-\starttyping
-static Mess* instantiate(int sr, const char* name)
- {
- printf("SimpleSynth sampleRate %d\n", sr);
- SimpleSynth* synth = new SimpleSynth(sr);
- if (!synth->init(name)) {
- delete synth;
- synth = 0;
- }
- return synth;
- }
-extern "C"
- {
- static MESS descriptor = {
- "SimpleSynth",
- "Mathias Lundgren (lunar_shuttle@users.sf.net)",
- "0.1", //Version string
- MESS_MAJOR_VERSION, MESS_MINOR_VERSION,
- instantiate,
- };
- const MESS* mess_descriptor() { return &descriptor; }
- }
-\stoptyping
-
-\section{MessGui}
- For the Gui, there's really only one method that is interesting, processEvent.
- processEvent in the gui is called whenever the synth sends it a midiEvent, which
- it does with send(MidiEvent ).
- Since this is the only method of communicating the gui can send midimessages
- to the synth via sendEvent, sendController and sendSysex calls.
-\starttyping
-virtual void processEvent(const MidiPlayEvent&) {};
-\stoptyping
-
-
-\completeindex
-\stoptext
diff --git a/muse/doc/man/de/CMakeLists.txt b/muse/doc/man/de/CMakeLists.txt
deleted file mode 100644
index ac009499..00000000
--- a/muse/doc/man/de/CMakeLists.txt
+++ /dev/null
@@ -1,52 +0,0 @@
-#=============================================================================
-# MusE
-# Linux Music Editor
-# $Id:$
-#
-# Copyright (C) 2002-2006 by Werner Schweer and others
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License version 2.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-#=============================================================================
-
-add_custom_target (
- manual
- DEPENDS
- ${CMAKE_CURRENT_SOURCE_DIR}/man-de.tex
- ${CMAKE_CURRENT_SOURCE_DIR}/projekte.tex
- ${CMAKE_CURRENT_SOURCE_DIR}/miditracks.tex
- ${CMAKE_CURRENT_SOURCE_DIR}/struktur.tex
- ${CMAKE_CURRENT_SOURCE_DIR}/midirecording.tex
- ${CMAKE_CURRENT_SOURCE_DIR}/installation.tex
- ${CMAKE_CURRENT_SOURCE_DIR}/automation.tex
- COMMAND ${TEXEXEC_PATH}/texexec
- ARGS --language=en --verbose --batch --pdf
- --result=man-de.pdf
- ${CMAKE_CURRENT_SOURCE_DIR}/man-de.tex
- WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
- )
-
-install_files ( /share/${MusE_INSTALL_NAME}/doc/ .pdf
- ${CMAKE_CURRENT_BINARY_DIR}/man-de.pdf )
-
-set (extraClean man-de.log man-de.tmp man-de.tuo man-de.tui
- man-de-mpgraph.mp mpgraph.mp )
-
-set_directory_properties( PROPERTIES
- ADDITIONAL_MAKE_CLEAN_FILES "${extraClean}"
- )
-
-configure_file(
- ${CMAKE_CURRENT_SOURCE_DIR}/figurepath.tex.in
- ${CMAKE_CURRENT_BINARY_DIR}/figurepath.tex
- )
-
diff --git a/muse/doc/man/de/automation.tex b/muse/doc/man/de/automation.tex
deleted file mode 100644
index 36e2872b..00000000
--- a/muse/doc/man/de/automation.tex
+++ /dev/null
@@ -1,33 +0,0 @@
-
-%% \chapter{Automation}
-\section{Betriebsarten}
-
- In \M\ gibt es vier verschiedene Automations-Betriebsarten:
-
- \blank[big]
- \Input{Manuell:}
- Im manuellen Modus kommen Controllerveränderungen nur
- vom Mixer oder ChannelInfo. Die Schieber, Regler und
- Eigabefelder zeigen den aktuellen Zustand der Midigeräte.
- Wird z.B. der Volume Schieber bewegt, wo werden sofort
- entsprechende Midi Events zu den angeschlossenen Midigeräten
- geschickt.
-
- \Input{Read:}
- Die aktuellen Controllerwerte kommen ausschließlich von den
- aufgezeichneten Controller Spuren.
- Schieber und Regler des Mixers und des ChannelInfo Windows
- können manuell nicht verändert werden.
-
- \Input{Write:}
- Bei Play oder Record werden alte Controllerwerte
- durch die Werte der Schieber und Regler berschrieben.
-
- \Input{Read/Write:}
- Wird ein Schieber oder Regler angeclickt, so wird die
- Automation Betriebsart bis zum ''release'' von ''read'' auf ''write''
- umgeschaltet. Alle Controllerbewegungen werden aufgezeichnet
- und überschreiben alte Werte.
-
- \blank[big]
-
diff --git a/muse/doc/man/de/figurepath.tex.in b/muse/doc/man/de/figurepath.tex.in
deleted file mode 100644
index 0e2f7023..00000000
--- a/muse/doc/man/de/figurepath.tex.in
+++ /dev/null
@@ -1,2 +0,0 @@
-\setupexternalfigures[directory={@CMAKE_SOURCE_DIR@/doc/man}]
-
diff --git a/muse/doc/man/de/installation.tex b/muse/doc/man/de/installation.tex
deleted file mode 100644
index 4b45531c..00000000
--- a/muse/doc/man/de/installation.tex
+++ /dev/null
@@ -1,63 +0,0 @@
-%% \chapter{Installation}
- \section{Tips für Ubuntu/Kubuntu}
-
- \subsection{Alsa-Sequencer}
-
- \M\ benötigt das ALSA Sequencer Modul. Dies wird von Ubuntu leider
- beim Systemstart nicht installiert.
-
- Wir können das aber leicht durch einen Eintrag in {\tt /etc/modules}
- beheben:
-
- \starttyping
- sudo bash
- modprobe snd-seq
- echo snd-seq >> /etc/modules
- \stoptyping
-
- (Nachtrag: im aktuellen Ubuntu 04.07 ("festy") wird das Sequencer
- Modul standardmäßig geladen)
-
- \subsection{Realtime Clock}
-
- Normalen Programmen ist der Zugriff auf die Echtzeituhr
- (RTC = "realtime clock") von Linux
- verwehrt. \M\ benötigt jedoch eine genaue Uhr, um ein exaktes
- Miditiming erzeugen zu können.
- Zunächst wollen wir daher die RTC für alle Audioprogrammen
- verfügbar machen:
-
- \starttyping
- sudo chown -vv root:audio /dev/rtc
- sudo chmod g+rw /dev/rtc
- \stoptyping
-
- Jetzt haben alle Programme der audio Gruppe Zugriff auf die
- RTC, dürfen jedoch noch nicht die hohen von \M\ benötigten
- Auflösungen einstellen.
- Um dies zu Erlauben geben wir ein:
-
- \starttyping
- sudo bash
- echo 1024 > /proc/sys/dev/rtc/max-user-freq
- echo dev.rtc.max-user-freq=1024 >> /etc/sysctl.conf
- \stoptyping
-
- Durch den Eintrag in der Datei {\tt /etc/sysctl.conf} erfolgt diese
- Einstellung nun auch nach jedem Systemstart.
-
- \subsection{Realtime Rechte}
-
- Um Prozesse mit Echtzeit Privilegien starten zu können ergänzen
- wir die Datei {\tt /etc/security/limits.conf} um folgende Zeilen:
-
- \starttyping
- @audio - rtprio 99
- @audio - memlock 200000
- @audio - nice -10
- \stoptyping
-
- \subsection{Low Latency Kernel}
- \subsubsection{Interrupt Thread Prioritäten}
-
-
diff --git a/muse/doc/man/de/man-de.tex b/muse/doc/man/de/man-de.tex
deleted file mode 100644
index 2269e25a..00000000
--- a/muse/doc/man/de/man-de.tex
+++ /dev/null
@@ -1,413 +0,0 @@
-%====================================================================
-% MusE Manual
-% dies ist das MusE Manual
-%
-% (C) 2006 Copyright: Werner Schweer und Andere
-%====================================================================
-
-%----------------------------------------------------------
-% Setup
-%----------------------------------------------------------
-
-%\showframe
-%\showsetups
-\usemodule[chart]
-\setupcolors[state=start]
-\setupbodyfont[Palatino]
-\language[de]
-
-% typeset in unicode (utf8)
-% \enableregime[il1]
-\enableregime[utf]
-
-\startuseMPgraphic{FunnyFrame}
- picture p; numeric o; path a, b; pair c;
- p := textext.rt(\MPstring{FunnyFrame});
- o := BodyFontSize;
- a := unitsquare xyscaled(OverlayWidth,OverlayHeight);
- p := p shifted (20, OverlayHeight-ypart center p);
- drawoptions (withpen pencircle scaled 1pt withcolor .625red);
- b := a superellipsed .95;
- fill b withcolor .85white; draw b;
- b := (boundingbox p) superellipsed .95;
- fill b withcolor .85white; draw b;
- draw p withcolor black;
- setbounds currentpicture to a;
- \stopuseMPgraphic
-
-\defineoverlay[FunnyFrame][\useMPgraphic{FunnyFrame}]
-\defineframedtext[FunnyText][frame=off,background=FunnyFrame]
-\def\StartFrame{\startFunnyText}
-\def\StopFrame{\stopFunnyText}
-\def\FrameTitle#1%
- {\setMPtext{FunnyFrame}{\hbox spread 1em{\hss\strut#1\hss}}}
-\setMPtext{FunnyFrame}{}
-
-
-\define\M{MusE}
-\define[1]\Index{{\it #1}\marginpar{#1}\index{#1}}
-
-\defineindenting[Cmdi][text=,separator=,width=fit,distance=1em]
-
-\define[1]\Cmd{
- \Cmdi
- \framed[
- background=color,
- width=fit,
- align=right,
- backgroundcolor=lightgray,
- framecolor=blue]
- {\tt\space #1}}
-
-\define[2]\CCmd{
- \Cmdi
- \framed[
- background=color,
- width=broad,
- align=right,
- backgroundcolor=lightgray,
- framecolor=blue]
- {\vbox{\hbox{\tt\space #1}\hbox{\tt\space #2}}}}
-
-%\define\startdescription{\startpacked}
-\define\startdescription{}
-%\define\stopdescription{\stoppacked}
-\define\stopdescription{}
-
-\define[1]\Fig{\blank\hbox{\externalfigure[#1]}\blank}
-
-\define[2]\Screen{
- \placefigure[here][fig:#1]{#2}{\externalfigure[#1][scale=1600]}
- }
-\definedescription[Option][
- location=left,
- headstyle=bold,
- width=4em,
- before={\startnarrower[left]\setupblank[0pt]},
- after={\stopnarrower\setupblank}]
-
-\definedescription[Filetype][
- location=left,
- headstyle=bold,
- width=6em,
- before={\startnarrower[left]\setupblank[0pt]},
- after={\stopnarrower\setupblank}]
-
-\definedescription[FileList][
- location=left,
- headstyle=bold,
- width=7em,
- before={\startnarrower[left]\setupblank[0pt]},
- after={\stopnarrower\setupblank}]
-
-\definedescription[Input][
- location=left,
- headstyle=bold,
- width=9em,
- before={\startnarrower[left]\setupblank[0pt]},
- after={\stopnarrower\setupblank}]
-
-\definedescription[InputN][
- location=left,
- headstyle=bold,
- width=6em,
- before={\startnarrower[left]\setupblank[0pt]},
- after={\stopnarrower\setupblank}]
-
-\define[2]\Figure{
- \placefigure
- [#1][fig:#2]{}
- {\externalfigure[pics/#2]}
- }
-
-\define[1]\Menu{
- \placefigure[right][fig:#1]{}
- {\externalfigure[pics/#1][scale=2000]}
- }
-
-\definedescription[Opt][location=hanging,headstyle=bold,width=broad]
-
-\setuptyping[before=\blank\startbackground, after=\stopbackground\blank] % source code with background
-\setupwhitespace[medium]
-
-\component figurepath.tex
-
-%----------------------------------------------------------
-% Body
-%----------------------------------------------------------
-
-\starttext
- \language[de]
- \mainlanguage[de]
- \startstandardmakeup[doublesided=no]
- \definebodyfont[10pt,11pt,12pt][rm][tfe=Regular at 48pt]
- \tfe\setupinterlinespace
- \hfill \color[red]{\M}\par
- \hfill \color[blue]{Manual}\par
- \vfill
- \rightaligned{\externalfigure[titlelogo]}
- \vfill
- \hfill \color[blue]{DE}\par
- \definebodyfont[10pt,11pt,12pt][rm][tfb=Regular at 24pt]
- \tfb\setupinterlinespace
- \hfill Version 1.0pre1\par
- \stopstandardmakeup
-
- \startstandardmakeup[page=no]
- \vfill
- \M\ wird von SourceForge gehostet:\par
- \type{http://sourceforge.net/projects/lmuse}
- \blank[line]
- Dieses Dokument wurde mit \pdfTeX\ und dem Macro Paket
- \ConTeXt\ erstellt.
- \blank
- \copyright 2006 Werner Schweer und Andere\par
- Titelgrafik \copyright Joachim Schiele
- \stopstandardmakeup
-
- \completecontent
-
-\chapter{\M\ Quickstart}
- \component midirecording.tex
- \section{Audio Playback}
- \section{Audio Recording}
-
-\component projekte.tex
-\component struktur.tex
-\component miditracks.tex
-
-\chapter{Automation}
- \component automation.tex
-
-\chapter{Funktionsreferenz}
- \section{Hauptfenster}
- \subsection{Menüs}
- Projekt
- Open Project
- Open Recent
- Save Project
- Import Midifile
- Export Midifile
- Import Wavefile
- Quit
- Edit
- Undo
- Redo
- Cut
- Copy
- Paste
- Delete Parts
- Delete Selected Tracks
- Add Track
- Add Midi Track
- Add Midi Output
- Add Midi Input
- Add Midi Generator
- Add Wave Track
- Add Audio Output
- Add Audio Group
- Add Audio Input
- Add Soft Synth
- Select
- Select All
- Deselect All
- Invert Selection
- Inside Loop
- Outside Loop
- All Parts on Track
- Pianoroll
- Midi Tracker
- Drums
- List
- Master Track
- Project Properties
-
- View
- Transport Panel
- Bigtime Window
- Mixer 1
- Mixer 2
- Marker
-
- Structure
- Global Cut
- Global Insert
- Global Split
- Copy Range
- Cut Events
- Midi
- Edit Instrument
- Reset Instr.
- Init Instr.
- local off
- Audio
- Bounce To Track
- Bounce To File
- Restart Audio
- Settings
- Configure Shortcuts
- Follow Song
- dont follow Song
- follow page
- follow continuous
- Midi Sync
- Midi File Export
- Preferences
-
- Help
- Manual
- MusE Homepage
- Report Bug
- About MusE
- About Qt
- What's This
-
- \subsection{Werkzeugleisten}
- Project Buttons
- Open
- Save
- Whats This
- Undo
- Redo
- Edit Tools
- Zeiger
- Stift
- Radiergummi
- Schere
- Kleber
- Linientool
- Mute
- Transport
- Loop
- Punch In
- Punch Out
- Gehe nach Anfang
- Zurückspulen
- Vorspulen
- Stop
- Play
- Record
- Panic
- Arranger
- Cursor
- Snap
- Len
- Pitch
- Tempo
- 50%
- N
- 200%
- Trackliste
- Einstellungen
- m global Mute
- s global Solo
- aR global AutomationRead
- aW global AutomationWrite
-
- Info Button
- Mixer Button
-
- \subsection{Trackliste}
- Midi Input
- Midi Output
- Midi Track
- Midi Synthesizer
- Audio Track
- Audio Input
- Audio Output
- Audio Group
- Audio Synthesizer
-
- \subsection{Arranger}
- Lineal
- Marker
- Locator
-
-
- \section{Globale Editor Funktionen}
- \subsection{Globaler Schnitt}
- Die ''Globaler Schnitt''-Funktion enfernt auf allen Spuren den Bereich
- zwischen der linken und rechten Marke. Nachfolgende Events rücken
- dabei auf. Auch Markerposition und Tempoevents werden
- verschoben. Lediglich stumm geschaltete Spuren werden nicht
- berücksichtigt.
-
- \subsection{Global Einfügen}
- Mit der ''Global Einfügen''-Funktion kann ein leerer Bereich eingefügt
- werden. Der Bereich wird an der Position des linken Markers
- eingefügt. Die Dauer des eingefügten Bereichs entspricht dem Abstand
- zwischen linker und rechter Marke. Marker und Tempoevents hinter der
- Einfügeposition werden entsprechend verschoben.
- Stumm geschaltete Spuren werden nicht verändert.
-
- \subsection{Global Splitten}
- Die ''Global Splitten''-Funktion entspricht der Scheren-Funktion für
- einzelne Parts. Im Gegensatz zur Scheren-Funktion wird jedoch nicht
- ein Part, sondern alle Parts an der aktuellen Markerposition
- geschnitten. Dies gilt nicht für stummgeschaltete Spuren.
-
- \subsection{Bereich Kopieren}
- Mit der ''Global Kopieren''-Funktion können komplette Teile eines
- Songs an eine andere Stelle kopiert werden:
-
- \startitemize[packed]
- \item stellen Sie die linke Marke an den Anfang des zu kopierenden
- Bereichs
- \item stellen Sie die rechte Marke an das Ende des zu kopierenden
- Bereichs
- \item setzen Sie den Lokator an die Einfgestelle
- \item wählen Sie ''Copy Range'' aus dem ''Struktur'' Menü.
- \stopitemize
-
- Wie bei allen anderen Strukturkommandos werden stummgeschaltete
- Spuren nicht berücksichtigt.
-
- \section{Arranger}
- \subsection{Spurtypen}
- \startitemize[packed]
- \item Midispur
- \item Audiospur
- \item Midiinput
- \item Midioutput
- \item Midigenerator
- \item Audioinput
- \item Audiooutput
- \item Audiogruppe
- \item Software Synthesizer
- \stopitemize
-
- \subsection{Spur Operationen}
- \startitemize[packed]
- \item Spur erzeugen
- \item Spur löschen
- \item Spur verschieben
- \item Spur kopieren
- \stopitemize
-
- \subsection{Part Operationen}
- \startitemize[packed]
- \item Part erzeugen
- \item Part löschen
- \item Part verschieben
- \item Part kopieren
- \item Part clonen
- \item Part declonen
- \item Part nach Vorne verlängern
- \item Part nach Hinten verlängern
- \item Part stummschalten
- \item Part einfärben
- \stopitemize
-
- \section{Pianoroll Editor}
- \section{Drum Editor}
- \section{Master Editor}
-
-\chapter{Installation}
- \component installation.tex
-
-\startappendices
- \component ../gpl.tex
- \completeindex
- \stopappendices
-\stoptext
-
diff --git a/muse/doc/man/de/midirecording.tex b/muse/doc/man/de/midirecording.tex
deleted file mode 100644
index c0c0e4d6..00000000
--- a/muse/doc/man/de/midirecording.tex
+++ /dev/null
@@ -1,119 +0,0 @@
-\section{Midi Recording}
- Auf der ersten Tour werden wir mit \M\ eine Midi Spur
- mit einem externen Synthesizer, einem Yamaha S90 aufnehmen.
-
- \subsection{Geräte verbinden}
- Für den Anschluß von Midigeräten gibt es verschiedene Möglichkeiten.
-
- \subsubsection{Midi}
- Der serielle Midi-Anschluß eines Keyboards eignet sich nicht zum
- direkten Anschluß an den PC Serienport. Bei Midi handelt es sich
- um eine galvanisch per Optokoppler getrennte Stromschnittstelle,
- während der PC eine RS232 Schnittstelle mit 12 Volt Pegeln bedient.
- Ein einfaches Umrüsten der PC-Schnittstelle mit einem Optokoppler
- funktioniert nicht, da der PC die MIDI-Taktrate nicht erzeugen kann.
-
- Als Lösung muß ein spezielles Midi-Interface her. Meist befindet sich
- eine Midi-Schnittstelle auf der Soundkarte. Doch Vorsicht, nicht
- alle Midi-Schnittstellen sind gleich gut, z.B. sind einige alte
- Soundblaster Modelle duch unglückliches Hardware-Design nicht in der
- Lage, die volle Midi Transferrate beim Senden von Midi Daten zu
- erreichen.
-
- \subsubsection{USB}
- Viele aktuelle Midigeräte besitzen einen USB Anschluß. USB ist schnell
- und flexibel und damit die Schnittstelle der Wahl.
-
- \subsubsection{ToHost}
- Einige ältere Midigeräte bieten einen einfachen PC Anschluß über
- einen normalen Serienport (''ToHost'' Schnittstelle genannt). Es
- handelt sich um einen normalen RS232 Anschluß, der die PC-üblichen
- Übertragungsraten versteht.
-
- \subsection{Neues Projekt erzeugen}
- Dann kanns losgehen. Wir starten \M\ und es erscheint das
- zuletzt bearbeitete Projekt so wie wir es verlassen haben.
-
- Um ein neues Projekt anzulegen clicken wir auf das Projekt
- Icon und der Projektdialog erscheint:
-
- \Fig{select_project}
-
- Wenn \M\ zum allererstenmal gestartet wird, erscheint der
- Projektdialog natürlich sofort, da es ja kein letztes Projekt
- gibt. Zum Projektdialog gelangen wir auch über den Projekmenü
- Eintrag ''Öffnen'' oder wer es ganz eilig hat tippt einfach
- {\tt Ctrl+O}.
-
- In der ''Projekt'' Eingabezeile geben wir nun einen Projektnamen
- für unser erstes Projekt ein und bestätigen dann durch clicken
- des ''Ok'' Buttons.
-
- \M\ fragt nun nach einem Template, mit dem das Projekt
- initialisiert werden soll:
-
- \Fig{select_template}
-
- Wir selektieren kein Template und clicken einfach ''Ok''.
- \M\ zeigt dann ein leeres Projekt:
-
- \Fig{main0}
-
- \subsection{Setup}
-
- \subsubsection{Spuren anlegen}
-
- Zunächst erzeugen wir einen ''MidiInput'' Track und checken,
- ob das Keyboard richtig angeschlossen ist.
-
- \subsubsection{Routing}
-
- \subsubsection{Midi Instrument}
- Im ''MidiOutPort'' Strip kann ein Midi Instrument ausgewählt werden.
- Dies ermöglicht es \M\ u.A. die Instrument-Patches anstatt per Nummer
- per Name anzuzeigen. Instrumente werden in einer ''{\tt *.idf}''
- (Instrument Definition File) beschrieben. Dies sind normale XML Text
- Dateien, die für jedes angeschlossene Gerät individuell erstellt werden
- können. In einer {\tt *.idf} Datei kann in einem ''Init'' Eintrag eine
- Serien von Midi Events definiert werden, die immer dann gesendet werden,
- wenn in \M\ der {\tt Midi->InitInstr} Button aktiviert wird. Wir nutzen diese
- Möglichkeit, um den S90 zu initialisieren.
-
- \subsubsection{Local Off}
- Wird ein Synthesizer ''standalone'' betrieben, dann ist die Tastatur
- intern direkt mit dem Tongenerator verbunden. Am Computer angeschlossen
- möchten wir jedoch Tastatur und Tongenerator als unabhängige Teile
- benutzen. Note On/Off Events sollen von der Tastatur nur zum Computer
- geschickt werden und nicht auch gleich zum internen Tongenerator.
- Der Tongenerator soll wiederum nur auf den Midi Input Anschluß hören
- und nicht auf die Tastatur. Für den S90 kann dieser ''Local Off''
- Mode durch Senden des SysEx Strings
-
- \starttyping
- 0xf0 0x10 0x6b 0x00 0x00 0x09 0x00
- \stoptyping
-
- eingeschaltet werden.
-
- \subsubsection{Sequencer Mode}
- Der S90 kenn Yamaha-Typisch verschiedene Modi. Wir benutzen den
- Sequencer Mode, in dem jedem Midi Kanal ein eigenes Instrument
- zugeordnet werden kann. Dieser Modus wird mit dem SysEx String
-
- \starttyping
- 0xf0 0x43 0x10 0x6b 0x0a 0x00 0x00 0x00
- \stoptyping
-
- eingeschaltet. Beide SysEx Kommandos sind unter dem ''init'' Label in
- der {\tt Yamaha-S90.idf} Datei eingetragen.
-
- \subsubsection{Midi Input Filter}
- Die Tastatur des Yamaha S90 kann ''After Touch'' Events erzeugen, d.h.
- nach dem Drücken einer Taste werden fortlaufend Events über den
- Anpreßdruck der Taste erzeugt. Diese Informationen benötigen wir
- nicht und filtern deshalb alle After Touch Events gleich bei der
- Aufnahme mittels des Midi Input Filters aus.
-
- \Fig{midifilter}
-
- \subsection{Aufnehmen}
diff --git a/muse/doc/man/de/miditracks.tex b/muse/doc/man/de/miditracks.tex
deleted file mode 100644
index 6e3a06c2..00000000
--- a/muse/doc/man/de/miditracks.tex
+++ /dev/null
@@ -1,132 +0,0 @@
- \section{Midi Routing}
-
- \section{Midi Setup}
- \subsection{Einfaches Setup}
-
- In einem einfachen Setup ist jeder Midi Anschluss des Rechners
- jeweils mit nur einem Midi Gerät verbunden. Außerdem hat jede
- Midi Spur einen eigenen Midi Kanal.
- Dieses Setup ist am flexibelsten und sollte nach Möglichkeit
- immer verwendet werden.
-
- \subsection{Erweitertes Setup}
-
- \index{mehrere Midi Spuren für einen Midi Kanal}
- Im erweiterten Setup werden mehrere Midi Spuren auf den gleichen
- Midi Kanal geroutet. Es ist zu beachten, das Midi Controller
- natürlich immer für alle Spuren des Kanals gelten. Controller
- können nicht individuell für jede Spur eingestellt werden.
-
- \subsection{Komplexes Setup}
- \index{mehrere Geräte an einem Midi Anschluß}
- Als komplex bezeichnen wir ein Setup, in dem an einem Midi Anschluß
- mehrere Midi Geräte angeschlossen sind.
- Jedes Gerät belegt einen oder mehrere der verfügbaren 16 Midi
- Kanäle. Es ist darauf zu achten, das die vergebenen Kanäle nicht
- überlappen. Dazu müssen die angeschlossenen Midi Geräte so
- konfiguriert werden, das sie nur auf die ihnen zugewiesenen Kanäle
- reagieren.
-
- Midi Meldungen, die nicht kanalgebunden sind (wie z.B. Sysex
- Meldungen) können an bestimmte Geräte gesendet werden, indem
- man jedem Gerät eine individuelle Geräte-Id gibt. Diese Geräte-Id
- muß dann in die entsprechenden Meldungen als Zieladresse angegeben
- werden.
-
- Da Midi Verbindungen nur eine sehr bescheidene \index{Midi Bandbreite}
- Bandbreite besitzen, sollte nach Möglichkeit das komplexe Setup
- vermieden werden.
-
- \section{Midi Eingänge}
- Ein Midi Eingang wird im Mixer als Strip und im Arranger als
- eigene Spur gezeigt.
-
- Ein Midi Eingang hat folgende Eigenschaften:
-
- \blank[big]
- \Input{Alsa Port:} dies ist die Route zu einem ALSA Midi Eingangs
- Port. Ein ALSA Port kann mit mehreren Midi Eingängen verbunden
- werden.
- \Input{Plugins:} die von ALSA gelesenen Midi Events können durch
- mehrere Plugins geroutet werden. Verfügbare Plugins filtern oder
- verändern die Midi Events.
- \Input{Outputs:} ein Midi Eingang hat 16 Ausgänge, jeweils ein
- Ausgang für jeden Midi Kanal. Jeder Midi Kanal kann individuell
- zu einem oder mehreren Midi Spuren geroutet werden.
- Midi Events, die von den Midi Spuren empfangen werden, haben
- keine Kanal-Information mehr.
- In einem einfachen Setup werden alle Kanäle aller Midi Eingänge
- zu allen Midi Spuren geroutet. Dies ist die Standard Vorgabe.
- \par
-
- \blank[big]
-
- \section{Midi Spur}
- Die Midi Spur enthält alle Midi Note On/off Events. Sie wird im
- Mixer als Strip und im Arranger als Spur dargestellt. Die
- Strip Darstellung im Mixer ist nicht sehr interessant, da eine
- Midi Spur kaum eigene Mixer relevante Parameter besitzt. In einem
- normalen Setup sollten Midi Spuren im Mixer ausgeblendet werden.
-
- Midi Spur Eigenschaften:
-
- \blank[big]
- \Input{Record:} schaltet die Spur in den Record Modus
-
- \Input{Monitor:} ist der Monitor Schalter eingeschaltet, werden
- bei Record alle Input Events zum Ausgang weitergereicht.
- Achtung: dies kann möglicherweise zu Midi Rückkopplungen
- führen!
-
- \Input{Mute:} schaltet die Spur stumm
-
- \Input{Solo:} ---nocht nicht definiert---
-
- \Input{Eingang:} die Spur Eingänge können zu Midi Eingängen
- geroutet werden
-
- \Input{Ausgang:} der Spur Ausgang kann zu einem oder mehreren
- Midi Kanälen geroutet werden. Midi Kanäle sind immer mit
- einem Midi Port verbunden.
-
- \blank[big]
-
- \section{Midi Kanäle}
- Midi Kanäle enthalten normalerweise alle Midi Controller Events.
-
- Midi Kanal Eigenschaften:
-
- \blank[big]
-
- \blank[big]
-
- \section{Midi Port}
-
- \index{Midi Port} Ein Midi Port representiert ein externes Midi
- Gerät und hat folgende Eigenschaften:
-
- \blank[big]
- \Input{Instrument:} \index{Midi Instrument} beschreibt die
- Eigenschaften des externen
- Midi Instruments. Das Instrument kann aus einer Liste verfügbarer
- Instrumentbeschreibungen ausgewählt werden.
-
- \Input{Master Volume:} \index{Midi Master Volume} ist ein Midi
- Controller, der die Lautstärke für alle Channel des Midi Ports
- einstellt.
-
- \Input{Geräte Id:} \index{Midi Geräte Id} werden mehrere Midigeräte
- an einen Midi Port
- angeschlossen, so müssen alle Geräte eine eindeutige Geräte Id
- besitzen. Mit dieser Id kann dann ein bestimmtes Gerät
- ausgewählt werden.
-
- \Input{Alsa Port:} dies ist die Route zu einem ALSA Midi Port.
- Ein Port Ausgang kann mit mehreren ALSA Ports verbunden werden.
-
- \blank[big]
-
- Jeder Midi Port besitzt 16 Kanäle.
-
- \section{Midi Synthesizer}
-
diff --git a/muse/doc/man/de/projekte.tex b/muse/doc/man/de/projekte.tex
deleted file mode 100644
index dcaa6c9a..00000000
--- a/muse/doc/man/de/projekte.tex
+++ /dev/null
@@ -1,102 +0,0 @@
-\chapter{Projekte}
-
- \section{Projekte}
-
- Ein \M\ Projekt \index{Projekt} ist ein Ordner, der alle
- Dateien des Projekts enthält. Dies sind im wesentlichen die
- aufgenommenen Wavedateien und die Projektdatei \index{Projektdatei}.
- Die Projektdatei enthält alle
- Informationen über das Projekt sowie alle Midi Daten soweit
- vorhanden.
-
- Beispiel einer Projekt Ordnerstruktur:
-
- \starttyping
- ~/MusE
- projects
- song1
- song1.med
- rec1.wav
- rec1.wca
- rec2.wav
- rec2.wca
- song2
- .
- .
- \stoptyping
-
- Im oberen Beispiel ist {\tt song1} der Projektordner
- \index{Projektordner} und
- {\tt song1.med} die Projektdatei. Die {\tt *.wav} Dateien sind
- Audio Aufzeichnungen und die zugehörigen {\tt *.wca} Dateien
- enthalten vorberechnete Daten zum schnellen Zeichnen der
- Wellenformdarstellung auf den Bildschirm.
-
- Der Standard-Projektordner \index{Standard-Projektordners}
- {\tt ~/MusE/projects} kann im ''Präferenzen'' Menü eingestellt
- werden.
-
- \section{Projekt auswählen}
-
- Nach dem Start von \M\ muß immer zunächst ein Projekt geladen oder
- ein neues Projekt erzeugt werden.
-
- \Screen{select_project}{Projekt auswählen}
-
- Normalerweise wird nach dem Start von \M\ das zuletzt bearbeitete
- Projekt geladen. Wer das nicht mag kann unter ''Präferenzen''
- einstellen, ob beim Start ein Standardprojekt \index{Standardprojekt}
- geladen oder immer zunächst nach einen Projekt gefragt werden soll.
-
- \section{Templates}
-
- Wird bei der Projektauswahl ein neues Projekt ausgewählt, dann
- wird im nächsten Schritt ein Dialog gezeigt, in dem ein Template
- aus einer Liste von verfügbaren Templates ausgewählt werden kann.
- Ein Template bestimmt die Grundeinstellungen für ein neues
- Projekt. Ein Template kann ein komplettes Projekt sein, welches
- jedoch keine Audiodaten enthalten kann und welches in der Regel
- auch keine Midi Daten enthält.
-
- \Screen{select_template}{Template auswählen}
-
- \M\ sucht Templates an zwei Orten:
- im globalen \M\ Installationspfad (Factory Presets) sowie im
- \M\ Verzeichnis relativ zum {\tt HOME} Verzeichnis des
- Anwenders (User Presets)
-
- \section{Projekt sichern (Backup)}
-
- Es gibt keine in \M\ eingebaute Funktion zum Sichern von Projekten.
- Da sich aber alle Projektdaten in einem Ordner befinden,
- können Standard-Tools zum Sichern verwendet werden.
-
- Projekte sind immer in sich komplett und enthalten keine Verweise
- auf Dateien außerhalb des Projektordners. Dies gilt nicht
- für Soundfonts \index{Soundfonts}, die z.B. vom Fluid-Synthesizer
- Plugin verwendet werden.
- Es wird empfohlen, diese Soundfonts\index{Soundfonts}
- auch als Kopie im Projektordner abzulegen.
-
- Projekte können auf der Platte ohne Probleme verschoben werden,
- da sie keine absoluten Pfade enthalten.
-
- \section{Wavedateien und Samplerate}
-
- \index{Wavedateien}\index{Audioprojekte}\index{Midiprojekte}
- \index{Samplerate}
- MusE unterscheidet zwischen Midiprojekten und Audioprojekten.
- Audioprojekte enthalten zusätzlich zu eventuell vorhandenen
- Mididaten Wavedateien.
-
- Audioprojekte sind immer mit einer bestimmten Samplerate
- verbunden und können nur geladen und bearbeitet werden, wenn
- die Projekt Samplerate mit der aktuellen Samplerate übereinstimmt.
-
- Die aktuelle Samplerate wird immer vom JACK Server bestimmt und
- kann von \M\ nicht verändert werden.
-
- Werden Wavedateien mit einer anderen Samplerate als der aktuellen
- importiert, so müssen sie konvertiert (resampled\index{resample})
- werden.
-
diff --git a/muse/doc/man/de/struktur.tex b/muse/doc/man/de/struktur.tex
deleted file mode 100644
index bd762d79..00000000
--- a/muse/doc/man/de/struktur.tex
+++ /dev/null
@@ -1,43 +0,0 @@
-\chapter{Struktur}
- \section{Spuren}
-
- Ein Projekt besteht aus Spuren analog einer analogen Bandmaschine.
- Die Spuren enthalten Midi- Audio- oder Controllerdaten.
- Spuren werden in \M\ in zwei Formen dargestellt:
-
- \blank[big]
- \Input{Arranger:} im Arranger werden alle Spuren vertikal in einer
- Liste dargestellt
-
- \Input{Mixer:} der Mixer zeigt alle Spuren in einer horizontalen
- Darstellung\par
-
- \blank[big]
-
- Tempo und Taktart sind interne Spuren, die nicht im Arranger oder
- Mixer gezeigt werden.
-
- \section{Parts}
-
- Midi- und Audiospuren können auf der Zeitachse in Parts unterteilt
- werden. Parts enthalten Midi- Audio- oder Conrollerdaten.
-
- Folgenden Operationen sind mit Parts möglich:
-
- \blank[big]
- \Input{verschieben} Parts können auf der Zeitachse und in andere
- Spuren des gleichen Typs verschoben werden.
- \Input{kopieren} klar!
- \Input{klonen} erzeugt einen Part, der sich die Midi- Audio- oder
- Controllerdaten mit dem Quellpart teilt. Wird ein Event in
- einem Clone-Parts verändert, so verändern sich auch alle
- Clones.
-
- \Input{Stumm} Parts können stumm geschaltet werden. Stumme Parts
- werden im Arranger grau dargestellt.
-
- \par
- \blank[big]
-
-
-
diff --git a/muse/doc/manual-de.odt b/muse/doc/manual-de.odt
new file mode 100644
index 00000000..1a8fb669
--- /dev/null
+++ b/muse/doc/manual-de.odt
Binary files differ
diff --git a/muse/muse/CMakeLists.txt b/muse/muse/CMakeLists.txt
index 000a8787..9ef460c3 100644
--- a/muse/muse/CMakeLists.txt
+++ b/muse/muse/CMakeLists.txt
@@ -32,7 +32,6 @@ subdirs (
instruments
marker
liste
- arranger
waveedit
)
@@ -48,6 +47,9 @@ QT4_WRAP_UI (muse_ui_headers
templatedialog.ui
importmidi.ui
routedialog.ui
+ configtrack.ui
+ midiportinfo.ui
+ miditrackinfo.ui
)
QT4_WRAP_CPP ( muse_moc_headers
@@ -85,6 +87,15 @@ QT4_WRAP_CPP ( muse_moc_headers
rack.h
routedialog.h
strip.h
+ arranger.h
+ canvas.h
+ configtrack.h
+ partdrag.h
+ tllineedit.h
+ tlswidget.h
+ tlwidget.h
+ trackdrag.h
+ trackinfo.h
)
QT4_ADD_RESOURCES (muse_qrc_files muse.qrc)
@@ -173,6 +184,17 @@ add_executable ( muse
rack.cpp
routedialog.cpp
strip.cpp
+
+ arranger.cpp
+ canvas.cpp
+ configtrack.cpp
+ partdrag.cpp
+ tllineedit.cpp
+ tlswidget.cpp
+ tlwidget.cpp
+ tlwlayout.cpp
+ trackdrag.cpp
+ trackinfo.cpp
)
set_target_properties( muse
@@ -186,7 +208,6 @@ target_link_libraries(muse
marker
liste
synti
- arranger
waveedit
widgets
al
diff --git a/muse/muse/arranger/arranger.cpp b/muse/muse/arranger.cpp
index 7b4be381..82c859cb 100644
--- a/muse/muse/arranger/arranger.cpp
+++ b/muse/muse/arranger.cpp
@@ -1226,7 +1226,7 @@ void Arranger::moveTrack(Track* src, Track* dst)
//! @param e The key event
//---------------------------------------------------------
-void Arranger::keyPressEvent(QKeyEvent* e)
+void Arranger::keyPressEvent(QKeyEvent* /*e*/)
{
printf("Arranger::keyPressEvent\n");
#if 0 //TODOB
@@ -1328,7 +1328,7 @@ void Arranger::keyPressEvent(QKeyEvent* e)
@param t Track the selected part belongs to (null if no part selected)
@param p The selected Part (null if no part selected)
*/
-void Arranger::kbdMovementUpdate(Track* t, Part* p)
+void Arranger::kbdMovementUpdate(Track*, Part*)
{
printf("kbdMovementUpdate\n");
// if (t && p ) {
diff --git a/muse/muse/arranger/arranger.h b/muse/muse/arranger.h
index 1c9f6e38..1c9f6e38 100644
--- a/muse/muse/arranger/arranger.h
+++ b/muse/muse/arranger.h
diff --git a/muse/muse/arranger/CMakeLists.txt b/muse/muse/arranger/CMakeLists.txt
deleted file mode 100644
index b58f6114..00000000
--- a/muse/muse/arranger/CMakeLists.txt
+++ /dev/null
@@ -1,60 +0,0 @@
-#=============================================================================
-# MusE
-# Linux Music Editor
-# $Id:$
-#
-# Copyright (C) 2002-2006 by Werner Schweer and others
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License version 2.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-#=============================================================================
-
-QT4_WRAP_CPP ( arranger_mocs
- arranger.h
- canvas.h
- configtrack.h
- partdrag.h
- tllineedit.h
- tlswidget.h
- tlwidget.h
- trackdrag.h
- trackinfo.h
- )
-
-QT4_WRAP_UI ( arranger_ui_headers
- configtrack.ui
- midiportinfo.ui
- miditrackinfo.ui
- )
-
-add_library ( arranger STATIC
- ${arranger_ui_headers}
- ${arranger_mocs}
- selectfilter.h
- tlwlayout.h
- trelement.h
- arranger.cpp
- canvas.cpp
- configtrack.cpp
- partdrag.cpp
- tllineedit.cpp
- tlswidget.cpp
- tlwidget.cpp
- tlwlayout.cpp
- trackdrag.cpp
- trackinfo.cpp
- )
-
-set_target_properties( arranger
- PROPERTIES COMPILE_FLAGS "-include ${PROJECT_BINARY_DIR}/all.h"
- )
-
diff --git a/muse/muse/arranger/canvas.cpp b/muse/muse/canvas.cpp
index 614cf3e3..614cf3e3 100644
--- a/muse/muse/arranger/canvas.cpp
+++ b/muse/muse/canvas.cpp
diff --git a/muse/muse/arranger/canvas.h b/muse/muse/canvas.h
index 911936c2..911936c2 100644
--- a/muse/muse/arranger/canvas.h
+++ b/muse/muse/canvas.h
diff --git a/muse/muse/arranger/configtrack.cpp b/muse/muse/configtrack.cpp
index a8fee6a3..a8fee6a3 100644
--- a/muse/muse/arranger/configtrack.cpp
+++ b/muse/muse/configtrack.cpp
diff --git a/muse/muse/arranger/configtrack.h b/muse/muse/configtrack.h
index 47dd0f4a..47dd0f4a 100644
--- a/muse/muse/arranger/configtrack.h
+++ b/muse/muse/configtrack.h
diff --git a/muse/muse/arranger/configtrack.ui b/muse/muse/configtrack.ui
index 350b405a..350b405a 100644
--- a/muse/muse/arranger/configtrack.ui
+++ b/muse/muse/configtrack.ui
diff --git a/muse/muse/importmidi.cpp b/muse/muse/importmidi.cpp
index c995ed67..0bd33df8 100644
--- a/muse/muse/importmidi.cpp
+++ b/muse/muse/importmidi.cpp
@@ -36,7 +36,7 @@
#include "templatedialog.h"
#include "audio.h"
#include "mixer.h"
-#include "arranger/arranger.h"
+#include "arranger.h"
#include "midictrl.h"
#include "midiinport.h"
#include "midioutport.h"
diff --git a/muse/muse/jack.cpp b/muse/muse/jack.cpp
index ff32846e..bc372357 100644
--- a/muse/muse/jack.cpp
+++ b/muse/muse/jack.cpp
@@ -53,25 +53,6 @@ static void jack_thread_init (void* /*data*/)
if (loadVST)
fst_adopt_thread();
#endif
- int policy;
- if ( (policy = sched_getscheduler (0)) < 0) {
- printf("cannot get current client scheduler for JACK thread: %s!\n", strerror(errno));
- }
- else {
- if (policy != SCHED_FIFO)
- printf("JACK thread %d _NOT_ running SCHED_FIFO\n", getpid());
- else if (debugMsg) {
- struct sched_param rt_param;
- memset(&rt_param, 0, sizeof(sched_param));
- int type;
- int rv = pthread_getschedparam(pthread_self(), &type, &rt_param);
- if (rv == -1)
- perror("get scheduler parameter");
- printf("JACK thread running SCHED_FIFO priority %d\n",
- rt_param.sched_priority);
- }
- }
-
}
//---------------------------------------------------------
@@ -816,10 +797,10 @@ void JackAudio::putEvent(Port port, const MidiEvent& e)
}
void* pb = jack_port_get_buffer(port.jackPort(), segmentSize);
int ft = e.time() - _frameCounter;
- if (ft < 0 || ft >= (int)segmentSize) {
+ if (ft < 0)
+ ft = 0;
+ if (ft >= (int)segmentSize) {
printf("JackAudio::putEvent: time out of range %d(seg=%d)\n", ft, segmentSize);
- if (ft < 0)
- ft = 0;
if (ft > (int)segmentSize)
ft = segmentSize - 1;
}
diff --git a/muse/muse/arranger/midiportinfo.ui b/muse/muse/midiportinfo.ui
index ad8ae201..ad8ae201 100644
--- a/muse/muse/arranger/midiportinfo.ui
+++ b/muse/muse/midiportinfo.ui
diff --git a/muse/muse/arranger/miditrackinfo.ui b/muse/muse/miditrackinfo.ui
index c1624188..c1624188 100644
--- a/muse/muse/arranger/miditrackinfo.ui
+++ b/muse/muse/miditrackinfo.ui
diff --git a/muse/muse/mstrip.cpp b/muse/muse/mstrip.cpp
index d4c48f5e..64b8132c 100644
--- a/muse/muse/mstrip.cpp
+++ b/muse/muse/mstrip.cpp
@@ -3,7 +3,7 @@
// Linux Music Editor
// $Id:$
//
-// Copyright (C) 2002-2006 by Werner Schweer and others
+// Copyright (C) 2002-2008 by Werner Schweer and others
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License version 2.
@@ -75,7 +75,7 @@ void addMidiTracks(QMenu* menu, Track* track, int channel, bool input)
// can only be added to input route lists
//---------------------------------------------------------
-void addMidiInPorts(QMenu* menu, Track* dtrack, int channel)
+void Strip::addMidiInPorts(QMenu* menu, Track* dtrack, int channel)
{
RouteList* rl = dtrack->inRoutes();
RouteNode dst(dtrack, channel, RouteNode::TRACK);
@@ -84,8 +84,6 @@ void addMidiInPorts(QMenu* menu, Track* dtrack, int channel)
for (iMidiInPort i = tl->begin();i != tl->end(); ++i) {
MidiInPort* track = *i;
QMenu* m = menu->addMenu(track->name());
- m->setSeparatorsCollapsible(false);
- m->addSeparator()->setText(QT_TR_NOOP("Channels"));
for (int ch = 0; ch < MIDI_CHANNELS; ++ch) {
QAction* a = m->addAction(QString("Channel %1").arg(ch+1));
a->setCheckable(true);
@@ -102,7 +100,7 @@ void addMidiInPorts(QMenu* menu, Track* dtrack, int channel)
// can only be added to output route lists
//---------------------------------------------------------
-static void addMidiOutPorts(QMenu* menu, Track* strack, int channel)
+void Strip::addMidiOutPorts(QMenu* menu, Track* strack, int channel)
{
RouteList* rl = strack->outRoutes();
RouteNode src(strack, channel, RouteNode::TRACK);
@@ -111,8 +109,6 @@ static void addMidiOutPorts(QMenu* menu, Track* strack, int channel)
for (iMidiOutPort i = tl->begin();i != tl->end(); ++i) {
MidiOutPort* op = *i;
QMenu* m = menu->addMenu(op->name());
- m->setSeparatorsCollapsible(false);
- m->addSeparator()->setText(QT_TR_NOOP("Channels"));
for (int ch = 0; ch < MIDI_CHANNELS; ++ch) {
QAction* a = m->addAction(QString("Channel %1").arg(ch+1));
a->setCheckable(true);
@@ -138,8 +134,6 @@ static void addSyntiPorts(QMenu* menu, Track* strack, int channel)
for (iSynthI i = sl->begin(); i != sl->end(); ++i) {
SynthI* sy = *i;
QMenu* m = menu->addMenu(sy->name());
- m->setSeparatorsCollapsible(false);
- m->addSeparator()->setText(QT_TR_NOOP("Channels"));
for (int ch = 0; ch < MIDI_CHANNELS; ++ch) {
QAction* a = m->addAction(QString("Channel %1").arg(ch+1));
a->setCheckable(true);
@@ -227,7 +221,6 @@ MidiStrip::MidiStrip(Mixer* m, MidiTrack* t, bool align)
sl = new Awl::MidiVolEntry(this);
sl->setId(CTRL_VOLUME);
-// sl->setFont(config.fonts[1]);
sl->setFixedHeight(entrySize.height());
connect(slider, SIGNAL(valueChanged(double,int)), SLOT(ctrlChanged(double, int)));
@@ -287,13 +280,11 @@ MidiStrip::MidiStrip(Mixer* m, MidiTrack* t, bool align)
iR = newInRouteButton();
grid->addWidget(iR, 14, 0);
connect(iR->menu(), SIGNAL(aboutToShow()), SLOT(iRouteShow()));
- connect(iR->menu(), SIGNAL(aboutToHide()), SLOT(iRouteHide()));
connect(iR->menu(), SIGNAL(triggered(QAction*)), song, SLOT(routeChanged(QAction*)));
oR = newOutRouteButton();
grid->addWidget(oR, 14, 1);
connect(oR->menu(), SIGNAL(aboutToShow()), SLOT(oRouteShow()));
- connect(oR->menu(), SIGNAL(aboutToHide()), SLOT(oRouteHide()));
connect(oR->menu(), SIGNAL(triggered(QAction*)), song, SLOT(routeChanged(QAction*)));
connect(song, SIGNAL(songChanged(int)), SLOT(songChanged(int)));
@@ -311,34 +302,6 @@ MidiStrip::MidiStrip(Mixer* m, MidiTrack* t, bool align)
}
//---------------------------------------------------------
-// iRouteHide
-//---------------------------------------------------------
-
-void MidiStrip::iRouteHide()
- {
- // dont leave the menu if SHIFT is pressed; this allows
- // for fast selecting of more than one input source
- //
- if (qApp->keyboardModifiers() & Qt::ShiftModifier) {
- iR->menu()->show();
- }
- }
-
-//---------------------------------------------------------
-// oRouteHide
-//---------------------------------------------------------
-
-void MidiStrip::oRouteHide()
- {
- // dont leave the menu if SHIFT is pressed; this allows
- // for fast selecting of more than one input source
- //
- if (qApp->keyboardModifiers() & Qt::ShiftModifier) {
- oR->menu()->show();
- }
- }
-
-//---------------------------------------------------------
// songChanged
//---------------------------------------------------------
@@ -508,7 +471,6 @@ void MidiStrip::iRouteShow()
{
QMenu* pup = iR->menu();
pup->clear();
- pup->addSeparator()->setText(tr("Tracks"));
addMidiInPorts(pup, track, -1); // add midi inputs to menu
}
@@ -520,7 +482,6 @@ void MidiStrip::oRouteShow()
{
QMenu* pup = oR->menu();
pup->clear();
- pup->addSeparator()->setText(tr("OutputPorts"));
addMidiOutPorts(pup, track, -1);
addSyntiPorts(pup, track, -1);
}
@@ -783,7 +744,6 @@ void MidiOutPortStrip::iRouteShow()
{
QMenu* pup = iR->menu();
pup->clear();
- pup->addSeparator()->setText(tr("MidiChannel"));
for (int ch = 0; ch < MIDI_CHANNELS; ++ch) {
QMenu* m = pup->addMenu(QString("Channel %1").arg(ch+1));
@@ -1001,7 +961,6 @@ void MidiInPortStrip::oRouteShow()
{
QMenu* pup = oR->menu();
pup->clear();
- pup->addSeparator()->setText(tr("MidiChannel"));
for (int ch = 0; ch < MIDI_CHANNELS; ++ch) {
QMenu* m = pup->addMenu(QString("Channel %1").arg(ch+1));
@@ -1230,33 +1189,7 @@ void MidiSyntiStrip::oRouteShow()
{
QMenu* pup = oR->menu();
pup->clear();
- pup->addSeparator()->setText(tr("OutputPorts"));
-
- MidiOutPortList* mpl = song->midiOutPorts();
- int pn = 0;
- for (iMidiOutPort i = mpl->begin(); i != mpl->end(); ++i, ++pn) {
- MidiOutPort* op = *i;
- QMenu* m = pup->addMenu(op->name());
- m->addSeparator()->setText(tr("Channel"));
-#if 0 //TODO
- for (int channel = 0; channel < MIDI_CHANNELS; ++channel) {
- QString s;
- s.setNum(channel+1);
- QAction* action = m->addAction(s);
- MidiChannel* mc = op->channel(channel);
- Route r(mc, -1, Route::TRACK);
- action->setData(QVariant::fromValue(r));
- action->setCheckable(true);
-
- for (iRoute ir = orl->begin(); ir != orl->end(); ++ir) {
- if (r == *ir) {
- action->setChecked(true);
- break;
- }
- }
- }
-#endif
- }
+ addMidiOutPorts(pup, track, -1);
}
//---------------------------------------------------------
@@ -1268,7 +1201,6 @@ void MidiSyntiStrip::iRouteShow()
QMenu* pup = oR->menu();
pup->clear();
- pup->addSeparator()->setText(tr("Input Ports"));
MidiOutPort* t = (MidiOutPort*)track;
for (int ch = 0; ch < MIDI_CHANNELS; ++ch) {
diff --git a/muse/muse/mstrip.h b/muse/muse/mstrip.h
index 4c3269de..058884db 100644
--- a/muse/muse/mstrip.h
+++ b/muse/muse/mstrip.h
@@ -74,11 +74,10 @@ class MidiStrip : public Strip {
void autoReadToggled(bool);
void autoWriteToggled(bool);
void iRouteShow();
- void iRouteHide();
void oRouteShow();
- void oRouteHide();
void recordToggled(bool);
void monitorToggled(bool);
+ QMenu* sendMenu() const { return static_cast<QMenu*>(sender()); }
public slots:
virtual void songChanged(int);
diff --git a/muse/muse/muse.cpp b/muse/muse/muse.cpp
index 52767384..01f0d1c4 100644
--- a/muse/muse/muse.cpp
+++ b/muse/muse/muse.cpp
@@ -23,7 +23,7 @@
#include "muse.h"
#include "transport.h"
#include "widgets/bigtime.h"
-#include "arranger/arranger.h"
+#include "arranger.h"
#include "midiedit/pianoroll.h"
#include "al/al.h"
#include "al/xml.h"
diff --git a/muse/muse/arranger/partdrag.cpp b/muse/muse/partdrag.cpp
index c47d3c11..c47d3c11 100644
--- a/muse/muse/arranger/partdrag.cpp
+++ b/muse/muse/partdrag.cpp
diff --git a/muse/muse/arranger/partdrag.h b/muse/muse/partdrag.h
index d8c2e978..d8c2e978 100644
--- a/muse/muse/arranger/partdrag.h
+++ b/muse/muse/partdrag.h
diff --git a/muse/muse/preferences.cpp b/muse/muse/preferences.cpp
index 6b7580d5..022a24da 100644
--- a/muse/muse/preferences.cpp
+++ b/muse/muse/preferences.cpp
@@ -24,7 +24,7 @@
#include "muse.h"
#include "song.h"
#include "event.h"
-#include "arranger/arranger.h"
+#include "arranger.h"
#include "widgets/filedialog.h"
#include "waveedit/waveedit.h"
#include "globals.h"
diff --git a/muse/muse/arranger/selectfilter.h b/muse/muse/selectfilter.h
index a28e6947..a28e6947 100644
--- a/muse/muse/arranger/selectfilter.h
+++ b/muse/muse/selectfilter.h
diff --git a/muse/muse/seqmsg.cpp b/muse/muse/seqmsg.cpp
index adf2a66e..cbd0d0dd 100644
--- a/muse/muse/seqmsg.cpp
+++ b/muse/muse/seqmsg.cpp
@@ -27,7 +27,7 @@
#include "audio.h"
#include "audiodev.h"
#include "audio.h"
-#include "arranger/arranger.h"
+#include "arranger.h"
#include "plugin.h"
#include "midi.h"
#include "midictrl.h"
diff --git a/muse/muse/song.cpp b/muse/muse/song.cpp
index 79e1f563..a1f3bff0 100644
--- a/muse/muse/song.cpp
+++ b/muse/muse/song.cpp
@@ -1103,8 +1103,12 @@ void Song::seqSignal(int fd)
strerror(errno));
return;
}
+ bool graphChangedCalled = false;
+ bool seekDone = false;
+
+// printf("seqSignal %d\n", n);
for (int i = 0; i < n; ++i) {
-// printf("seqSignal to gui:<%c>\n", buffer[i]);
+// printf(" seqSignal to gui:<%c>\n", buffer[i]);
switch(buffer[i]) {
case MSG_STOP:
stopRolling();
@@ -1116,9 +1120,12 @@ void Song::seqSignal(int fd)
setRecord(true);
break;
case MSG_SEEK:
- setPos(0, audio->seqTime()->curTickPos, true, false, !seekInProgress);
- seekInProgress = false;
- beat(); // update controller guis
+ if (!seekDone) {
+ seekDone = true;
+ setPos(0, audio->seqTime()->curTickPos, true, false, !seekInProgress);
+ seekInProgress = false;
+ beat(); // update controller guis
+ }
break;
case MSG_JACK_SHUTDOWN:
restartJack();
@@ -1152,7 +1159,11 @@ void Song::seqSignal(int fd)
break;
case MSG_GRAPH_CHANGED:
- audioDriver->graphChanged();
+ if (!graphChangedCalled) {
+ printf(" graph changed\n");
+ graphChangedCalled = true;
+ audioDriver->graphChanged();
+ }
break;
default:
diff --git a/muse/muse/songfile.cpp b/muse/muse/songfile.cpp
index 4f701bae..ff89e41e 100644
--- a/muse/muse/songfile.cpp
+++ b/muse/muse/songfile.cpp
@@ -20,7 +20,7 @@
#include "muse.h"
#include "song.h"
-#include "arranger/arranger.h"
+#include "arranger.h"
#include "al/al.h"
#include "al/xml.h"
#include "midiedit/drummap.h"
diff --git a/muse/muse/strip.h b/muse/muse/strip.h
index f9bc06ea..1e5f7bd4 100644
--- a/muse/muse/strip.h
+++ b/muse/muse/strip.h
@@ -29,7 +29,6 @@ class Meter;
class SimpleButton;
class Mixer;
-// static const QSize buttonSize(STRIP_WIDTH/2-2, BUTTON_HEIGHT);
static const QSize entrySize(STRIP_WIDTH/2-2, ENTRY_HEIGHT);
//---------------------------------------------------------
@@ -55,6 +54,8 @@ class Strip : public QFrame {
void recordToggled(bool);
void addAutomationButtons(int row);
+ void addMidiInPorts(QMenu* menu, Track* dtrack, int channel);
+ void addMidiOutPorts(QMenu* menu, Track* strack, int channel);
public slots:
void resetPeaks();
diff --git a/muse/muse/arranger/tllineedit.cpp b/muse/muse/tllineedit.cpp
index 0581b858..0581b858 100644
--- a/muse/muse/arranger/tllineedit.cpp
+++ b/muse/muse/tllineedit.cpp
diff --git a/muse/muse/arranger/tllineedit.h b/muse/muse/tllineedit.h
index 56bfdd55..56bfdd55 100644
--- a/muse/muse/arranger/tllineedit.h
+++ b/muse/muse/tllineedit.h
diff --git a/muse/muse/arranger/tlswidget.cpp b/muse/muse/tlswidget.cpp
index 23b7fbc1..23b7fbc1 100644
--- a/muse/muse/arranger/tlswidget.cpp
+++ b/muse/muse/tlswidget.cpp
diff --git a/muse/muse/arranger/tlswidget.h b/muse/muse/tlswidget.h
index ccdfa3b8..ccdfa3b8 100644
--- a/muse/muse/arranger/tlswidget.h
+++ b/muse/muse/tlswidget.h
diff --git a/muse/muse/arranger/tlwidget.cpp b/muse/muse/tlwidget.cpp
index fdf08d0b..fdf08d0b 100644
--- a/muse/muse/arranger/tlwidget.cpp
+++ b/muse/muse/tlwidget.cpp
diff --git a/muse/muse/arranger/tlwidget.h b/muse/muse/tlwidget.h
index fbe428e2..fbe428e2 100644
--- a/muse/muse/arranger/tlwidget.h
+++ b/muse/muse/tlwidget.h
diff --git a/muse/muse/arranger/tlwlayout.cpp b/muse/muse/tlwlayout.cpp
index 076f07cf..076f07cf 100644
--- a/muse/muse/arranger/tlwlayout.cpp
+++ b/muse/muse/tlwlayout.cpp
diff --git a/muse/muse/arranger/tlwlayout.h b/muse/muse/tlwlayout.h
index 1a9cc914..1a9cc914 100644
--- a/muse/muse/arranger/tlwlayout.h
+++ b/muse/muse/tlwlayout.h
diff --git a/muse/muse/arranger/trackdrag.cpp b/muse/muse/trackdrag.cpp
index beab87dd..beab87dd 100644
--- a/muse/muse/arranger/trackdrag.cpp
+++ b/muse/muse/trackdrag.cpp
diff --git a/muse/muse/arranger/trackdrag.h b/muse/muse/trackdrag.h
index 083a94b3..083a94b3 100644
--- a/muse/muse/arranger/trackdrag.h
+++ b/muse/muse/trackdrag.h
diff --git a/muse/muse/arranger/trackinfo.cpp b/muse/muse/trackinfo.cpp
index 1a62b1c0..1a62b1c0 100644
--- a/muse/muse/arranger/trackinfo.cpp
+++ b/muse/muse/trackinfo.cpp
diff --git a/muse/muse/arranger/trackinfo.h b/muse/muse/trackinfo.h
index bea98d70..bea98d70 100644
--- a/muse/muse/arranger/trackinfo.h
+++ b/muse/muse/trackinfo.h
diff --git a/muse/muse/arranger/trelement.h b/muse/muse/trelement.h
index 478b5e51..4c702ae2 100644
--- a/muse/muse/arranger/trelement.h
+++ b/muse/muse/trelement.h
@@ -37,10 +37,10 @@ enum {
struct TrElement {
int id;
int grp; // default group
- char* name;
+ const char* name;
int trackMask;
- TrElement(int i, int g, char* s, int m)
+ TrElement(int i, int g, const char* s, int m)
: id(i), grp(g), name(s), trackMask(m) {}
};
@@ -61,4 +61,3 @@ extern const int nTrElements;
extern TrGroupList glist[Track::TRACK_TYPES];
#endif
-
diff --git a/muse/muse/wave.cpp b/muse/muse/wave.cpp
index 41682d88..dca9843b 100644
--- a/muse/muse/wave.cpp
+++ b/muse/muse/wave.cpp
@@ -26,7 +26,7 @@
#include "wave.h"
#include "muse.h"
#include "widgets/filedialog.h"
-#include "arranger/arranger.h"
+#include "arranger.h"
#include "globals.h"
#include "event.h"
#include "audio.h"
@@ -65,9 +65,9 @@ static bool copyWaveFileToProject(const QString& path)
// we cannot easily check for identity if destination
// file is sample rate converted
//
- // for now we assume that the file has already
+ // for now we assume that the file has already
// be imported:
- //
+ //
printf("File already exists\n");
return true;
}
@@ -90,7 +90,7 @@ static bool copyWaveFileToProject(const QString& path)
SNDFILE* sfDst = sf_open(dstFile.fileName().toLatin1().data(),
SFM_WRITE, &sfinfoDst);
if (sfDst == 0) {
- printf("Cannot open destination file<%s>: %s\n",
+ printf("Cannot open destination file<%s>: %s\n",
dstFile.fileName().toLatin1().data(), strerror(errno));
return false;
}
@@ -119,7 +119,7 @@ static bool copyWaveFileToProject(const QString& path)
bool returnValue = true;
if (sfinfoSrc.samplerate != AL::sampleRate) {
// TODO: convertsample rate
- printf("wave file has samplerate of %d, our project has %d\n",
+ printf("wave file has samplerate of %d, our project has %d\n",
sfinfoSrc.samplerate,AL::sampleRate);
int srcType = SRC_SINC_MEDIUM_QUALITY;
@@ -161,7 +161,7 @@ static bool copyWaveFileToProject(const QString& path)
int rv = src_process(src, &data);
if (rv > 0) {
- printf("error sampe rate conversion: %s\n",
+ printf("error sampe rate conversion: %s\n",
src_strerror(rv));
src_delete(src);
returnValue = false;
@@ -171,7 +171,7 @@ static bool copyWaveFileToProject(const QString& path)
// write buffer
sf_count_t n = sf_writef_float(sfDst, outBuffer, data.output_frames_gen);
if (n != data.output_frames_gen) {
- printf("sound write failed: returns %lld, should return %ld\n",
+ printf("sound write failed: returns %lld, should return %ld\n",
n, data.output_frames_gen);
returnValue = false;
break;
@@ -220,7 +220,7 @@ static bool copyWaveFileToProject(const QString& path)
// write buffer
nn = sf_writef_float(sfDst, buffer, n);
if (n != nn) {
- printf("sound write failed: returns %lld, should return %lld\n",
+ printf("sound write failed: returns %lld, should return %lld\n",
nn, n);
returnValue = false;
break;